Handle errors in drain_ssl_buffer()

This commit is contained in:
Kovid Goyal 2017-06-26 12:53:24 +05:30
parent fae7613a08
commit 52949371c9
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -271,10 +271,15 @@ class Connection(object): # {{{
def drain_ssl_buffer(self): def drain_ssl_buffer(self):
try: try:
self.read_buffer.recv_from(self.socket) self.read_buffer.recv_from(self.socket)
except Exception: except ssl.SSLWantReadError:
# Ignore errors since we dont know if the SSL buffer had return
# any data or not except socket.error as e:
pass if e.errno in socket_errors_nonblocking or e.errno in socket_errors_eintr:
return
if e.errno in socket_errors_socket_closed:
self.ready = False
return
raise
def close(self): def close(self):
self.ready = False self.ready = False
@ -493,7 +498,7 @@ class ServerLoop(object):
def tick(self): def tick(self):
now = monotonic() now = monotonic()
read_needed, write_needed, readable, remove = [], [], [], [] read_needed, write_needed, readable, remove, close_needed = [], [], [], [], []
has_ssl = self.ssl_context is not None has_ssl = self.ssl_context is not None
for s, conn in self.connection_map.iteritems(): for s, conn in self.connection_map.iteritems():
if now - conn.last_activity > self.opts.timeout: if now - conn.last_activity > self.opts.timeout:
@ -511,7 +516,10 @@ class ServerLoop(object):
else: else:
if has_ssl: if has_ssl:
conn.drain_ssl_buffer() conn.drain_ssl_buffer()
(readable if conn.read_buffer.has_data else read_needed).append(s) if conn.ready:
(readable if conn.read_buffer.has_data else read_needed).append(s)
else:
close_needed.append((s, conn))
else: else:
read_needed.append(s) read_needed.append(s)
elif wf is WRITE: elif wf is WRITE:
@ -521,6 +529,9 @@ class ServerLoop(object):
self.log('Closing connection because of extended inactivity: %s' % conn.state_description) self.log('Closing connection because of extended inactivity: %s' % conn.state_description)
self.close(s, conn) self.close(s, conn)
for x, conn in close_needed:
self.close(s, conn)
if readable: if readable:
writable = [] writable = []
else: else: