Skip to content

Commit a61d59c

Browse files
Correct handling of user session (Fixes #585)
1 parent 3ae3697 commit a61d59c

File tree

4 files changed

+34
-18
lines changed

4 files changed

+34
-18
lines changed

socketio/asyncio_server.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,8 @@ async def get_session(self, sid, namespace=None):
259259
the user session, use the ``session`` context manager instead.
260260
"""
261261
namespace = namespace or '/'
262-
eio_session = await self.eio.get_session(sid)
262+
eio_sid = self.manager.eio_sid_from_sid(sid, namespace)
263+
eio_session = await self.eio.get_session(eio_sid)
263264
return eio_session.setdefault(namespace, {})
264265

265266
async def save_session(self, sid, session, namespace=None):
@@ -271,7 +272,8 @@ async def save_session(self, sid, session, namespace=None):
271272
the default namespace is used.
272273
"""
273274
namespace = namespace or '/'
274-
eio_session = await self.eio.get_session(sid)
275+
eio_sid = self.manager.eio_sid_from_sid(sid, namespace)
276+
eio_session = await self.eio.get_session(eio_sid)
275277
eio_session[namespace] = session
276278

277279
def session(self, sid, namespace=None):

socketio/server.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,8 @@ def get_session(self, sid, namespace=None):
444444
is used.
445445
"""
446446
namespace = namespace or '/'
447-
eio_session = self.eio.get_session(sid)
447+
eio_sid = self.manager.eio_sid_from_sid(sid, namespace)
448+
eio_session = self.eio.get_session(eio_sid)
448449
return eio_session.setdefault(namespace, {})
449450

450451
def save_session(self, sid, session, namespace=None):
@@ -456,7 +457,8 @@ def save_session(self, sid, session, namespace=None):
456457
the default namespace is used.
457458
"""
458459
namespace = namespace or '/'
459-
eio_session = self.eio.get_session(sid)
460+
eio_sid = self.manager.eio_sid_from_sid(sid, namespace)
461+
eio_session = self.eio.get_session(eio_sid)
460462
eio_session[namespace] = session
461463

462464
def session(self, sid, namespace=None):

tests/asyncio/test_asyncio_server.py

+13-7
Original file line numberDiff line numberDiff line change
@@ -730,11 +730,13 @@ def test_send_with_ack_namespace(self, eio):
730730
def test_session(self, eio):
731731
fake_session = {}
732732

733-
async def fake_get_session(sid):
733+
async def fake_get_session(eio_sid):
734+
assert eio_sid == '123'
734735
return fake_session
735736

736-
async def fake_save_session(sid, session):
737+
async def fake_save_session(eio_sid, session):
737738
global fake_session
739+
assert eio_sid == '123'
738740
fake_session = session
739741

740742
eio.return_value.send = AsyncMock()
@@ -744,17 +746,21 @@ async def fake_save_session(sid, session):
744746

745747
async def _test():
746748
await s._handle_eio_connect('123', 'environ')
747-
await s.save_session('123', {'foo': 'bar'})
748-
async with s.session('123') as session:
749+
await s._handle_eio_message('123', '0')
750+
await s._handle_eio_message('123', '0/ns')
751+
sid = s.manager.sid_from_eio_sid('123', '/')
752+
sid2 = s.manager.sid_from_eio_sid('123', '/ns')
753+
await s.save_session(sid, {'foo': 'bar'})
754+
async with s.session(sid) as session:
749755
assert session == {'foo': 'bar'}
750756
session['foo'] = 'baz'
751757
session['bar'] = 'foo'
752-
assert await s.get_session('123') == {'foo': 'baz', 'bar': 'foo'}
758+
assert await s.get_session(sid) == {'foo': 'baz', 'bar': 'foo'}
753759
assert fake_session == {'/': {'foo': 'baz', 'bar': 'foo'}}
754-
async with s.session('123', namespace='/ns') as session:
760+
async with s.session(sid2, namespace='/ns') as session:
755761
assert session == {}
756762
session['a'] = 'b'
757-
assert await s.get_session('123', namespace='/ns') == {'a': 'b'}
763+
assert await s.get_session(sid2, namespace='/ns') == {'a': 'b'}
758764
assert fake_session == {
759765
'/': {'foo': 'baz', 'bar': 'foo'},
760766
'/ns': {'a': 'b'},

tests/common/test_server.py

+13-7
Original file line numberDiff line numberDiff line change
@@ -627,28 +627,34 @@ def test_send_with_ack_namespace(self, eio):
627627
def test_session(self, eio):
628628
fake_session = {}
629629

630-
def fake_get_session(sid):
630+
def fake_get_session(eio_sid):
631+
assert eio_sid == '123'
631632
return fake_session
632633

633-
def fake_save_session(sid, session):
634+
def fake_save_session(eio_sid, session):
634635
global fake_session
636+
assert eio_sid == '123'
635637
fake_session = session
636638

637639
s = server.Server()
638640
s.eio.get_session = fake_get_session
639641
s.eio.save_session = fake_save_session
640642
s._handle_eio_connect('123', 'environ')
641-
s.save_session('123', {'foo': 'bar'})
642-
with s.session('123') as session:
643+
s._handle_eio_message('123', '0')
644+
s._handle_eio_message('123', '0/ns')
645+
sid = s.manager.sid_from_eio_sid('123', '/')
646+
sid2 = s.manager.sid_from_eio_sid('123', '/ns')
647+
s.save_session(sid, {'foo': 'bar'})
648+
with s.session(sid) as session:
643649
assert session == {'foo': 'bar'}
644650
session['foo'] = 'baz'
645651
session['bar'] = 'foo'
646-
assert s.get_session('123') == {'foo': 'baz', 'bar': 'foo'}
652+
assert s.get_session(sid) == {'foo': 'baz', 'bar': 'foo'}
647653
assert fake_session == {'/': {'foo': 'baz', 'bar': 'foo'}}
648-
with s.session('123', namespace='/ns') as session:
654+
with s.session(sid2, namespace='/ns') as session:
649655
assert session == {}
650656
session['a'] = 'b'
651-
assert s.get_session('123', namespace='/ns') == {'a': 'b'}
657+
assert s.get_session(sid2, namespace='/ns') == {'a': 'b'}
652658
assert fake_session == {
653659
'/': {'foo': 'baz', 'bar': 'foo'},
654660
'/ns': {'a': 'b'},

0 commit comments

Comments
 (0)