Просмотр исходного кода

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 лет назад
Родитель
Сommit
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]
         ret['path'] = req_lines[0].split(" ")[1]
         for line in req_lines[1:]:
         for line in req_lines[1:]:
             if line == "": break
             if line == "": break
-            var, val = line.split(": ")
+            try:
+                var, val = line.split(": ")
+            except:
+                raise Exception("Invalid handshake header: %s" % line)
             ret[var] = val
             ret[var] = val
 
 
         if req_lines[-2] == "":
         if req_lines[-2] == "":
@@ -315,12 +318,17 @@ Connection: Upgrade\r
         #self.vmsg("Running poll()")
         #self.vmsg("Running poll()")
         pass
         pass
 
 
-
     def top_SIGCHLD(self, sig, stack):
     def top_SIGCHLD(self, sig, stack):
         # Reap zombies after calling child SIGCHLD handler
         # Reap zombies after calling child SIGCHLD handler
         self.do_SIGCHLD(sig, stack)
         self.do_SIGCHLD(sig, stack)
         self.vmsg("Got SIGCHLD, reaping zombies")
         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):
     def do_SIGCHLD(self, sig, stack):
         pass
         pass