@@ -110,10 +110,6 @@ async def handshake_to_get_session(
110110 async def close (self ) -> None :
111111 await self ._close_all_sessions ()
112112
113- async def _get_existing_session (self , to_id : str ) -> ServerSession | None :
114- async with self ._session_lock :
115- return self ._sessions .get (to_id )
116-
117113 async def _get_or_create_session (
118114 self ,
119115 transport_id : str ,
@@ -251,57 +247,68 @@ async def _establish_handshake(
251247 )
252248 raise InvalidMessageException ("handshake request to wrong server" )
253249
254- old_session = await self ._get_existing_session (request_message .from_ )
255- client_next_expected_seq = (
256- handshake_request .expectedSessionState .nextExpectedSeq
257- )
258- client_next_sent_seq = handshake_request .expectedSessionState .nextSentSeq or 0
259- if old_session and old_session .session_id == handshake_request .sessionId :
260- # check invariants
261- # ordering must be correct
262- our_next_seq = await old_session .get_next_sent_seq ()
263- our_ack = await old_session .get_next_expected_seq ()
250+ async with self ._session_lock :
251+ old_session = self ._sessions .get (request_message .from_ )
252+ client_next_expected_seq = (
253+ handshake_request .expectedSessionState .nextExpectedSeq
254+ )
255+ client_next_sent_seq = (
256+ handshake_request .expectedSessionState .nextSentSeq or 0
257+ )
258+ if old_session and old_session .session_id == handshake_request .sessionId :
259+ # check invariants
260+ # ordering must be correct
261+ our_next_seq = await old_session .get_next_sent_seq ()
262+ our_ack = await old_session .get_next_expected_seq ()
264263
265- if client_next_sent_seq > our_ack :
266- message = (
267- "client is in the future: "
268- f"server wanted { our_ack } but client has { client_next_sent_seq } "
269- )
270- await self ._send_handshake_response (
271- request_message ,
272- HandShakeStatus (ok = False , reason = message ),
273- websocket ,
274- )
275- raise SessionStateMismatchException (message )
264+ if client_next_sent_seq > our_ack :
265+ message = (
266+ "client is in the future: "
267+ f"server wanted { our_ack } but client has { client_next_sent_seq } "
268+ )
269+ await self ._send_handshake_response (
270+ request_message ,
271+ HandShakeStatus (ok = False , reason = message ),
272+ websocket ,
273+ )
274+ raise SessionStateMismatchException (message )
276275
277- if our_next_seq > client_next_expected_seq :
278- message = (
279- "server is in the future: "
280- f"client wanted { client_next_expected_seq } "
281- f"but server has { our_next_seq } "
282- )
276+ if our_next_seq > client_next_expected_seq :
277+ message = (
278+ "server is in the future: "
279+ f"client wanted { client_next_expected_seq } "
280+ f"but server has { our_next_seq } "
281+ )
282+ await self ._send_handshake_response (
283+ request_message ,
284+ HandShakeStatus (ok = False , reason = message ),
285+ websocket ,
286+ )
287+ raise SessionStateMismatchException (message )
288+ elif old_session :
289+ # we have an old session but the session id is different
290+ # just delete the old session
291+ await old_session .close ()
292+ old_session = None
293+
294+ if not old_session and (
295+ client_next_sent_seq > 0 or client_next_expected_seq > 0
296+ ):
297+ message = "client is trying to resume a session but we don't have it"
283298 await self ._send_handshake_response (
284299 request_message ,
285300 HandShakeStatus (ok = False , reason = message ),
286301 websocket ,
287302 )
288303 raise SessionStateMismatchException (message )
289- elif old_session :
290- # we have an old session but the session id is different
291- # just delete the old session
292- await old_session .close ()
293- old_session = None
294304
295- if not old_session and (
296- client_next_sent_seq > 0 or client_next_expected_seq > 0
297- ):
298- message = "client is trying to resume a session but we don't have it"
299- await self ._send_handshake_response (
305+ # from this point on, we're committed to connecting
306+ session_id = handshake_request .sessionId
307+ handshake_response = await self ._send_handshake_response (
300308 request_message ,
301- HandShakeStatus (ok = False , reason = message ),
309+ HandShakeStatus (ok = True , sessionId = session_id ),
302310 websocket ,
303311 )
304- raise SessionStateMismatchException (message )
305312
306313 return handshake_request , handshake_response
307314
0 commit comments