diff --git a/setup.py b/setup.py index 8207d7c..94d0061 100755 --- a/setup.py +++ b/setup.py @@ -40,7 +40,7 @@ except: setuptools.setup( name='warcprox', - version='2.4b2.dev161', + version='2.4b2.dev162', description='WARC writing MITM HTTP/S proxy', url='https://github.com/internetarchive/warcprox', author='Noah Levitt', diff --git a/tests/test_warcprox.py b/tests/test_warcprox.py index 3936b73..32db17f 100755 --- a/tests/test_warcprox.py +++ b/tests/test_warcprox.py @@ -279,9 +279,9 @@ class _TestHttpRequestHandler(http_server.BaseHTTPRequestHandler): headers, payload = self.build_response() self.connection.sendall(headers) self.connection.sendall(payload) - if self.path == '/missing-content-length': - # response without content-length (and not chunked) must close the - # connection, else client has no idea if there is more data coming + if self.path in ('/missing-content-length', '/empty-response'): + # server must close the connection, else client has no idea if + # there is more data coming self.connection.shutdown(socket.SHUT_RDWR) self.connection.close() @@ -1823,6 +1823,14 @@ def test_socket_timeout_response( response = requests.get(url, proxies=archiving_proxies, verify=False) assert response.status_code == 502 + # test that the connection is cleaned up properly after truncating a + # response (no hang or timeout) + url = 'http://localhost:%s/' % http_daemon.server_port + response = requests.get( + url, proxies=archiving_proxies, verify=False, timeout=10) + assert response.status_code == 404 + assert response.content == b'404 Not Found\n' + def test_empty_response( warcprox_, http_daemon, https_daemon, archiving_proxies, playback_proxies): diff --git a/warcprox/mitmproxy.py b/warcprox/mitmproxy.py index 6d87470..8bd1861 100644 --- a/warcprox/mitmproxy.py +++ b/warcprox/mitmproxy.py @@ -468,6 +468,7 @@ class MitmProxyHandler(http_server.BaseHTTPRequestHandler): if (self._max_resource_size and prox_rec_res.recorder.len > self._max_resource_size): prox_rec_res.truncated = b'length' + self._remote_server_conn.sock.shutdown(socket.SHUT_RDWR) self._remote_server_conn.sock.close() self.logger.info( 'truncating response because max resource size %d ' @@ -481,6 +482,7 @@ class MitmProxyHandler(http_server.BaseHTTPRequestHandler): if not is_connection_dropped(self._remote_server_conn): self._conn_pool._put_conn(self._remote_server_conn) except: + self._remote_server_conn.sock.shutdown(socket.SHUT_RDWR) self._remote_server_conn.sock.close() raise finally: