Browse Source

proxy: do handshake in forked process too.

Joel Martin 15 years ago
parent
commit
edc4725260
2 changed files with 18 additions and 8 deletions
  1. 11 6
      utils/websocket.c
  2. 7 2
      utils/websocket.py

+ 11 - 6
utils/websocket.c

@@ -504,12 +504,6 @@ void start_server() {
         }
         }
         handler_msg("got client connection from %s\n",
         handler_msg("got client connection from %s\n",
                     inet_ntoa(cli_addr.sin_addr));
                     inet_ntoa(cli_addr.sin_addr));
-        ws_ctx = do_handshake(csock);
-        if (ws_ctx == NULL) {
-            close(csock);
-            continue;
-        }
-
         /* base64 is 4 bytes for every 3
         /* base64 is 4 bytes for every 3
          *    20 for WS '\x00' / '\xff' and good measure  */
          *    20 for WS '\x00' / '\xff' and good measure  */
         dbufsize = (bufsize * 3)/4 - 20;
         dbufsize = (bufsize * 3)/4 - 20;
@@ -520,6 +514,17 @@ void start_server() {
         }
         }
 
 
         if (pid == 0) {  // handler process
         if (pid == 0) {  // handler process
+            ws_ctx = do_handshake(csock);
+            if (ws_ctx == NULL) {
+                close(csock);
+                if (settings.multiprocess) {
+                    handler_msg("No connection after handshake");
+                    break;   // Child process exits
+                } else {
+                    continue;
+                }
+            }
+
             settings.handler(ws_ctx);
             settings.handler(ws_ctx);
             if (pipe_error) {
             if (pipe_error) {
                 handler_emsg("Closing due to SIGPIPE\n");
                 handler_emsg("Closing due to SIGPIPE\n");

+ 7 - 2
utils/websocket.py

@@ -208,14 +208,19 @@ def start_server():
                         settings['listen_host'], settings['listen_port'])
                         settings['listen_host'], settings['listen_port'])
             startsock, address = lsock.accept()
             startsock, address = lsock.accept()
             handler_msg('got client connection from %s' % address[0])
             handler_msg('got client connection from %s' % address[0])
-            csock = do_handshake(startsock)
-            if not csock: continue
 
 
             if settings['multiprocess']:
             if settings['multiprocess']:
                 handler_msg("forking handler process")
                 handler_msg("forking handler process")
                 pid = os.fork()
                 pid = os.fork()
 
 
             if pid == 0:  # handler process
             if pid == 0:  # handler process
+                csock = do_handshake(startsock)
+                if not csock:
+                    if settings['multiprocess']:
+                        handler_msg("No connection after handshake");
+                        break
+                    else:
+                        continue
                 settings['handler'](csock)
                 settings['handler'](csock)
             else:         # parent process
             else:         # parent process
                 settings['handler_id'] += 1
                 settings['handler_id'] += 1