diff options
-rw-r--r-- | docs/changes.xml | 7 | ||||
-rw-r--r-- | src/nxt_router.c | 5 | ||||
-rw-r--r-- | test/test_asgi_websockets.py | 24 |
3 files changed, 35 insertions, 1 deletions
diff --git a/docs/changes.xml b/docs/changes.xml index b97cc823..64adbb46 100644 --- a/docs/changes.xml +++ b/docs/changes.xml @@ -97,6 +97,13 @@ a memory leak occurring in the router process when serving a file larger than </para> </change> +<change type="bugfix"> +<para> +the router process could crash while removing or reconfiguring an application +that uses WebSocket. +</para> +</change> + </changes> diff --git a/src/nxt_router.c b/src/nxt_router.c index d9c722dd..03fe2a6c 100644 --- a/src/nxt_router.c +++ b/src/nxt_router.c @@ -3796,7 +3796,10 @@ nxt_router_response_ready_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg, nxt_buf_chain_add(&b, nxt_http_buf_last(r)); req_rpc_data->rpc_cancel = 0; - req_rpc_data->apr_action = NXT_APR_GOT_RESPONSE; + + if (req_rpc_data->apr_action == NXT_APR_REQUEST_FAILED) { + req_rpc_data->apr_action = NXT_APR_GOT_RESPONSE; + } nxt_request_rpc_data_unlink(task, req_rpc_data); diff --git a/test/test_asgi_websockets.py b/test/test_asgi_websockets.py index 7c9ec555..6121fcc5 100644 --- a/test/test_asgi_websockets.py +++ b/test/test_asgi_websockets.py @@ -63,6 +63,9 @@ class TestASGIWebsockets(TestApplicationPython): key ), 'key' + # remove "mirror" application + self.load('websockets/subprotocol') + def test_asgi_websockets_subprotocol(self): self.load('websockets/subprotocol') @@ -92,6 +95,27 @@ class TestASGIWebsockets(TestApplicationPython): sock.close() + def test_asgi_websockets_mirror_app_change(self): + self.load('websockets/mirror') + + message = 'blah' + + _, sock, _ = self.ws.upgrade() + + self.ws.frame_write(sock, self.ws.OP_TEXT, message) + frame = self.ws.frame_read(sock) + + assert message == frame['data'].decode('utf-8'), 'mirror' + + self.load('websockets/subprotocol') + + self.ws.frame_write(sock, self.ws.OP_TEXT, message) + frame = self.ws.frame_read(sock) + + assert message == frame['data'].decode('utf-8'), 'mirror 2' + + sock.close() + def test_asgi_websockets_no_mask(self): self.load('websockets/mirror') |