Skip to content

Commit a555e57

Browse files
committed
add app state check
* fixes MagicStack#246
1 parent 1eb6727 commit a555e57

File tree

2 files changed

+23
-8
lines changed

2 files changed

+23
-8
lines changed

uvloop/sslproto.pxd

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,20 @@ cdef enum SSLProtocolState:
66
SHUTDOWN = 4
77

88

9+
cdef enum AppProtocolState:
10+
# This tracks the state of app protocol (https://git.io/fj59P):
11+
# start -> CM [-> DR*] [-> ER?] -> CL -> end
12+
# * CM: connection_made()
13+
# * DR: data_received()
14+
# * ER: eof_received()
15+
# * CL: connection_lost()
16+
17+
START = 0
18+
AFTER_CM = 1
19+
AFTER_ER = 2
20+
END = 3
21+
22+
923
cdef class _SSLProtocolTransport:
1024
cdef:
1125
object _loop
@@ -30,7 +44,6 @@ cdef class SSLProtocol:
3044
bint _app_transport_created
3145

3246
object _transport
33-
bint _call_connection_made
3447
object _ssl_handshake_timeout
3548
object _ssl_shutdown_timeout
3649

@@ -46,7 +59,7 @@ cdef class SSLProtocol:
4659
object _ssl_buffer_view
4760
SSLProtocolState _state
4861
size_t _conn_lost
49-
bint _eof_received
62+
AppProtocolState _app_state
5063

5164
bint _ssl_writing_paused
5265
bint _app_reading_paused

uvloop/sslproto.pyx

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,6 @@ cdef class SSLProtocol:
253253
self._app_transport_created = False
254254
# transport, ex: SelectorSocketTransport
255255
self._transport = None
256-
self._call_connection_made = call_connection_made
257256
self._ssl_handshake_timeout = ssl_handshake_timeout
258257
self._ssl_shutdown_timeout = ssl_shutdown_timeout
259258
# SSL and state machine
@@ -264,7 +263,7 @@ cdef class SSLProtocol:
264263
self._outgoing_read = self._outgoing.read
265264
self._state = UNWRAPPED
266265
self._conn_lost = 0 # Set when connection_lost called
267-
self._eof_received = False
266+
self._app_state = START if call_connection_made else AFTER_CM
268267

269268
# Flow Control
270269

@@ -335,7 +334,9 @@ cdef class SSLProtocol:
335334
self._app_transport._closed = True
336335

337336
if self._state != DO_HANDSHAKE:
338-
self._loop.call_soon(self._app_protocol.connection_lost, exc)
337+
if self._app_state == AFTER_CM or self._app_state == AFTER_ER:
338+
self._app_state = END
339+
self._loop.call_soon(self._app_protocol.connection_lost, exc)
339340
self._set_state(UNWRAPPED)
340341
self._transport = None
341342
self._app_transport = None
@@ -518,7 +519,8 @@ cdef class SSLProtocol:
518519
cipher=sslobj.cipher(),
519520
compression=sslobj.compression(),
520521
ssl_object=sslobj)
521-
if self._call_connection_made:
522+
if self._app_state == START:
523+
self._app_state = AFTER_CM
522524
self._app_protocol.connection_made(self._get_app_transport())
523525
self._wakeup_waiter()
524526
self._do_read()
@@ -735,8 +737,8 @@ cdef class SSLProtocol:
735737

736738
cdef _call_eof_received(self):
737739
try:
738-
if not self._eof_received:
739-
self._eof_received = True
740+
if self._app_state == AFTER_CM:
741+
self._app_state = AFTER_ER
740742
keep_open = self._app_protocol.eof_received()
741743
if keep_open:
742744
aio_logger.warning('returning true from eof_received() '

0 commit comments

Comments
 (0)