소스 검색

Better reaper, catch occasional bad WS header line.

Call waitpid in loop to catch SIGCHLD signals that happen while
handling the original SIGCHLD signal.

Pulled from websockify.
Joel Martin 15 년 전
부모
커밋
215ae8e564
1개의 변경된 파일11개의 추가작업 그리고 3개의 파일을 삭제
  1. 11 3
      utils/websocket.py

+ 11 - 3
utils/websocket.py

@@ -147,7 +147,10 @@ Connection: Upgrade\r
         ret['path'] = req_lines[0].split(" ")[1]
         for line in req_lines[1:]:
             if line == "": break
-            var, val = line.split(": ")
+            try:
+                var, val = line.split(": ")
+            except:
+                raise Exception("Invalid handshake header: %s" % line)
             ret[var] = val
 
         if req_lines[-2] == "":
@@ -315,12 +318,17 @@ Connection: Upgrade\r
         #self.vmsg("Running poll()")
         pass
 
-
     def top_SIGCHLD(self, sig, stack):
         # Reap zombies after calling child SIGCHLD handler
         self.do_SIGCHLD(sig, stack)
         self.vmsg("Got SIGCHLD, reaping zombies")
-        os.waitpid(-1, os.WNOHANG)
+        try:
+            result = os.waitpid(-1, os.WNOHANG)
+            while result[0]:
+                self.vmsg("Reaped child process %s" % result[0])
+                result = os.waitpid(-1, os.WNOHANG)
+        except (OSError):
+            pass
 
     def do_SIGCHLD(self, sig, stack):
         pass