always call socket.shutdown() to close connections

This commit is contained in:
Noah Levitt 2018-04-04 17:49:08 -07:00
parent ab52e81019
commit 385014c322
3 changed files with 14 additions and 4 deletions

View File

@ -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',

View File

@ -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):

View File

@ -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: