1
- from gevent import sleep , spawn , wait
1
+ from gevent import killall , sleep , spawn , wait
2
2
from gevent .event import Event
3
3
from gevent .queue import Queue
4
4
from gevent .select import select
@@ -18,6 +18,7 @@ def __init__(self, fd, send_event, send_queue, recv_event, recv_queue, timeout=6
18
18
self .recv_event = recv_event
19
19
self .recv_queue = recv_queue
20
20
self .timeout = timeout
21
+ self .connected = True
21
22
22
23
def send (self , message ):
23
24
self .send_queue .put (message )
@@ -49,30 +50,44 @@ def __call__(self, environ, start_response):
49
50
client = self .client (uwsgi .connection_fd (), send_event , send_queue , recv_event , recv_queue )
50
51
51
52
# spawn handler
52
- spawn (handler , client )
53
+ handler_g = spawn (handler , client )
53
54
54
55
# spawn recv listener
55
56
def listener (client ):
56
57
ready = select ([client .fd ], [], [], client .timeout )
57
58
recv_event .set ()
58
- spawn (listener , client )
59
+ listener_g = spawn (listener , client )
59
60
60
61
while True :
61
- ready = wait ([send_event , recv_event ], None , 1 )
62
+ if not client .connected :
63
+ recv_queue .put (None )
64
+ handler_g .join (client .timeout )
65
+ return ''
66
+
67
+ # wait for event to draw our attention
68
+ ready = wait ([handler_g , send_event , recv_event ], None , 1 )
69
+
70
+ # handle send events
62
71
if send_event .is_set ():
63
72
send_event .clear ()
64
73
try :
65
74
uwsgi .websocket_send (send_queue .get ())
66
- except IOError : # client disconnected
67
- pass
75
+ except IOError :
76
+ client . connected = False
68
77
69
- if recv_event .is_set ():
78
+ # handle receive events
79
+ elif recv_event .is_set ():
70
80
recv_event .clear ()
71
81
try :
72
82
recv_queue .put (uwsgi .websocket_recv_nb ())
73
- spawn (listener , client )
74
- except IOError : # client disconnected
75
- pass
83
+ listener_g = spawn (listener , client )
84
+ except IOError :
85
+ client .connected = False
86
+
87
+ # handler all cleaned up and ready to go
88
+ elif handler_g .ready ():
89
+ listener_g .kill ()
90
+ return ''
76
91
77
92
78
93
class GeventWebSocket (WebSocket ):
0 commit comments