Server: Fix connections not being closed after errors/timeouts on the server side

This commit is contained in:
Kovid Goyal 2017-06-22 23:52:14 +05:30
parent fc576760c2
commit 355635af74
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 11 additions and 3 deletions

View File

@ -606,8 +606,9 @@ class HTTPConnection(HTTPRequest):
self.set_state(WRITE, self.write_iter, output) self.set_state(WRITE, self.write_iter, output)
def reset_state(self): def reset_state(self):
ready = not self.close_after_response
self.connection_ready() self.connection_ready()
self.ready = not self.close_after_response self.ready = ready
self.end_send_optimization() self.end_send_optimization()
def report_unhandled_exception(self, e, formatted_traceback): def report_unhandled_exception(self, e, formatted_traceback):

View File

@ -12,6 +12,7 @@ from tempfile import NamedTemporaryFile
from calibre import guess_type from calibre import guess_type
from calibre.srv.tests.base import BaseTest, TestServer from calibre.srv.tests.base import BaseTest, TestServer
from calibre.srv.utils import eintr_retry_call
from calibre.utils.monotonic import monotonic from calibre.utils.monotonic import monotonic
is_ci = os.environ.get('CI', '').lower() == 'true' is_ci = os.environ.get('CI', '').lower() == 'true'
@ -284,7 +285,6 @@ class TestHTTP(BaseTest):
server.loop.opts.timeout = 10 # ensure socket is not closed because of timeout server.loop.opts.timeout = 10 # ensure socket is not closed because of timeout
conn.request('GET', '/close', headers={'Connection':'close'}) conn.request('GET', '/close', headers={'Connection':'close'})
r = conn.getresponse() r = conn.getresponse()
self.ae(server.loop.num_active_connections, 1)
self.ae(r.status, 200), self.ae(r.read(), 'close') self.ae(r.status, 200), self.ae(r.read(), 'close')
server.loop.wakeup() server.loop.wakeup()
num = 10 num = 10
@ -293,6 +293,14 @@ class TestHTTP(BaseTest):
num -= 1 num -= 1
self.ae(server.loop.num_active_connections, 0) self.ae(server.loop.num_active_connections, 0)
self.assertIsNone(conn.sock) self.assertIsNone(conn.sock)
# Test timeout
server.loop.opts.timeout = 0.1
conn = server.connect()
conn.request('GET', '/something')
r = conn.getresponse()
self.ae(r.status, 200), self.ae(r.read(), 'something')
self.assertIn('Request Timeout', eintr_retry_call(conn.sock.recv, 500))
# }}} # }}}
def test_http_response(self): # {{{ def test_http_response(self): # {{{
@ -432,4 +440,3 @@ class TestHTTP(BaseTest):
r = conn.getresponse() r = conn.getresponse()
self.assertEqual(data, r.read()) self.assertEqual(data, r.read())
# }}} # }}}