Skip to content

Commit 05d761b

Browse files
authored
Fix dispatcher exception during unsubs (#1073)
1 parent 48313b4 commit 05d761b

File tree

2 files changed

+24
-8
lines changed

2 files changed

+24
-8
lines changed

proxy/core/event/dispatcher.py

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,19 @@ def handle_event(self, ev: Dict[str, Any]) -> None:
5959
'event_name': eventNames.SUBSCRIBED,
6060
})
6161
elif ev['event_name'] == eventNames.UNSUBSCRIBE:
62-
# send ack
63-
logger.info('unsubscription request ack sent')
64-
self.subscribers[ev['event_payload']['sub_id']].send({
65-
'event_name': eventNames.UNSUBSCRIBED,
66-
})
67-
# close conn and delete subscriber
68-
self.subscribers[ev['event_payload']['sub_id']].close()
69-
del self.subscribers[ev['event_payload']['sub_id']]
62+
if ev['event_payload']['sub_id'] in self.subscribers:
63+
# send ack
64+
logger.debug('unsubscription request ack sent')
65+
self.subscribers[ev['event_payload']['sub_id']].send({
66+
'event_name': eventNames.UNSUBSCRIBED,
67+
})
68+
# close conn and delete subscriber
69+
self.subscribers[ev['event_payload']['sub_id']].close()
70+
del self.subscribers[ev['event_payload']['sub_id']]
71+
else:
72+
logger.info(
73+
'unsubscription request ack not sent, subscriber already gone',
74+
)
7075
else:
7176
# logger.info(ev)
7277
self._broadcast(ev)

proxy/plugin/cache/cache_responses.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,17 @@ def write_content_type(
8585
if parser.code and int(parser.code) == httpStatusCodes.SWITCHING_PROTOCOLS:
8686
logger.warning('Bypassing websocket response packet')
8787
return None
88+
# Certain responses may never reach complete state
89+
#
90+
# E.g. Facebook sends HTML page with content-length: 0
91+
# and as chunked encoded, while keeping the connection alive.
92+
# This connection gets dropped after timeout period.
93+
# Hence, technically response never completed or rather
94+
# terminated cleanly with a CRLF tokens.
95+
#
96+
# E.g. When it's a web socket upgrade response, same problem
97+
# can arise. The response may not reach completion state.
98+
#
8899
# if not parser.is_complete:
89100
# logger.warning(data)
90101
# return None

0 commit comments

Comments
 (0)