python-engineio 4.15.0__tar.gz → 4.15.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. {python_engineio-4.15.0/src/python_engineio.egg-info → python_engineio-4.15.1}/PKG-INFO +1 -1
  2. {python_engineio-4.15.0 → python_engineio-4.15.1}/pyproject.toml +1 -1
  3. {python_engineio-4.15.0 → python_engineio-4.15.1}/src/engineio/async_server.py +14 -2
  4. {python_engineio-4.15.0 → python_engineio-4.15.1}/src/engineio/async_socket.py +2 -2
  5. {python_engineio-4.15.0 → python_engineio-4.15.1}/src/engineio/server.py +14 -2
  6. {python_engineio-4.15.0 → python_engineio-4.15.1}/src/engineio/socket.py +2 -2
  7. {python_engineio-4.15.0 → python_engineio-4.15.1/src/python_engineio.egg-info}/PKG-INFO +1 -1
  8. {python_engineio-4.15.0 → python_engineio-4.15.1}/src/python_engineio.egg-info/SOURCES.txt +1 -1
  9. python_engineio-4.15.1/tests/async/.test_server.py.swp +0 -0
  10. {python_engineio-4.15.0 → python_engineio-4.15.1}/tests/async/test_server.py +21 -1
  11. {python_engineio-4.15.0 → python_engineio-4.15.1}/tests/common/test_server.py +20 -0
  12. python_engineio-4.15.0/tests/async/.test_client.py.swp +0 -0
  13. {python_engineio-4.15.0 → python_engineio-4.15.1}/LICENSE +0 -0
  14. {python_engineio-4.15.0 → python_engineio-4.15.1}/MANIFEST.in +0 -0
  15. {python_engineio-4.15.0 → python_engineio-4.15.1}/README.md +0 -0
  16. {python_engineio-4.15.0 → python_engineio-4.15.1}/docs/_static/README.md +0 -0
  17. {python_engineio-4.15.0 → python_engineio-4.15.1}/setup.cfg +0 -0
  18. {python_engineio-4.15.0 → python_engineio-4.15.1}/src/engineio/__init__.py +0 -0
  19. {python_engineio-4.15.0 → python_engineio-4.15.1}/src/engineio/async_client.py +0 -0
  20. {python_engineio-4.15.0 → python_engineio-4.15.1}/src/engineio/async_drivers/__init__.py +0 -0
  21. {python_engineio-4.15.0 → python_engineio-4.15.1}/src/engineio/async_drivers/_websocket_wsgi.py +0 -0
  22. {python_engineio-4.15.0 → python_engineio-4.15.1}/src/engineio/async_drivers/aiohttp.py +0 -0
  23. {python_engineio-4.15.0 → python_engineio-4.15.1}/src/engineio/async_drivers/asgi.py +0 -0
  24. {python_engineio-4.15.0 → python_engineio-4.15.1}/src/engineio/async_drivers/eventlet.py +0 -0
  25. {python_engineio-4.15.0 → python_engineio-4.15.1}/src/engineio/async_drivers/gevent.py +0 -0
  26. {python_engineio-4.15.0 → python_engineio-4.15.1}/src/engineio/async_drivers/gevent_uwsgi.py +0 -0
  27. {python_engineio-4.15.0 → python_engineio-4.15.1}/src/engineio/async_drivers/sanic.py +0 -0
  28. {python_engineio-4.15.0 → python_engineio-4.15.1}/src/engineio/async_drivers/threading.py +0 -0
  29. {python_engineio-4.15.0 → python_engineio-4.15.1}/src/engineio/async_drivers/tornado.py +0 -0
  30. {python_engineio-4.15.0 → python_engineio-4.15.1}/src/engineio/base_client.py +0 -0
  31. {python_engineio-4.15.0 → python_engineio-4.15.1}/src/engineio/base_server.py +0 -0
  32. {python_engineio-4.15.0 → python_engineio-4.15.1}/src/engineio/base_socket.py +0 -0
  33. {python_engineio-4.15.0 → python_engineio-4.15.1}/src/engineio/client.py +0 -0
  34. {python_engineio-4.15.0 → python_engineio-4.15.1}/src/engineio/exceptions.py +0 -0
  35. {python_engineio-4.15.0 → python_engineio-4.15.1}/src/engineio/json.py +0 -0
  36. {python_engineio-4.15.0 → python_engineio-4.15.1}/src/engineio/middleware.py +0 -0
  37. {python_engineio-4.15.0 → python_engineio-4.15.1}/src/engineio/packet.py +0 -0
  38. {python_engineio-4.15.0 → python_engineio-4.15.1}/src/engineio/payload.py +0 -0
  39. {python_engineio-4.15.0 → python_engineio-4.15.1}/src/engineio/static_files.py +0 -0
  40. {python_engineio-4.15.0 → python_engineio-4.15.1}/src/python_engineio.egg-info/dependency_links.txt +0 -0
  41. {python_engineio-4.15.0 → python_engineio-4.15.1}/src/python_engineio.egg-info/not-zip-safe +0 -0
  42. {python_engineio-4.15.0 → python_engineio-4.15.1}/src/python_engineio.egg-info/requires.txt +0 -0
  43. {python_engineio-4.15.0 → python_engineio-4.15.1}/src/python_engineio.egg-info/top_level.txt +0 -0
  44. {python_engineio-4.15.0 → python_engineio-4.15.1}/tests/async/__init__.py +0 -0
  45. {python_engineio-4.15.0 → python_engineio-4.15.1}/tests/async/index.html +0 -0
  46. {python_engineio-4.15.0 → python_engineio-4.15.1}/tests/async/test_aiohttp.py +0 -0
  47. {python_engineio-4.15.0 → python_engineio-4.15.1}/tests/async/test_asgi.py +0 -0
  48. {python_engineio-4.15.0 → python_engineio-4.15.1}/tests/async/test_client.py +0 -0
  49. {python_engineio-4.15.0 → python_engineio-4.15.1}/tests/async/test_sanic.py +0 -0
  50. {python_engineio-4.15.0 → python_engineio-4.15.1}/tests/async/test_socket.py +0 -0
  51. {python_engineio-4.15.0 → python_engineio-4.15.1}/tests/async/test_tornado.py +0 -0
  52. {python_engineio-4.15.0 → python_engineio-4.15.1}/tests/common/__init__.py +0 -0
  53. {python_engineio-4.15.0 → python_engineio-4.15.1}/tests/common/index.html +0 -0
  54. {python_engineio-4.15.0 → python_engineio-4.15.1}/tests/common/test_client.py +0 -0
  55. {python_engineio-4.15.0 → python_engineio-4.15.1}/tests/common/test_middleware.py +0 -0
  56. {python_engineio-4.15.0 → python_engineio-4.15.1}/tests/common/test_packet.py +0 -0
  57. {python_engineio-4.15.0 → python_engineio-4.15.1}/tests/common/test_payload.py +0 -0
  58. {python_engineio-4.15.0 → python_engineio-4.15.1}/tests/common/test_socket.py +0 -0
  59. {python_engineio-4.15.0 → python_engineio-4.15.1}/tests/performance/README.md +0 -0
  60. {python_engineio-4.15.0 → python_engineio-4.15.1}/tests/performance/binary_b64_packet.py +0 -0
  61. {python_engineio-4.15.0 → python_engineio-4.15.1}/tests/performance/binary_packet.py +0 -0
  62. {python_engineio-4.15.0 → python_engineio-4.15.1}/tests/performance/json_packet.py +0 -0
  63. {python_engineio-4.15.0 → python_engineio-4.15.1}/tests/performance/payload.py +0 -0
  64. {python_engineio-4.15.0 → python_engineio-4.15.1}/tests/performance/run.sh +0 -0
  65. {python_engineio-4.15.0 → python_engineio-4.15.1}/tests/performance/server_receive.py +0 -0
  66. {python_engineio-4.15.0 → python_engineio-4.15.1}/tests/performance/text_packet.py +0 -0
  67. {python_engineio-4.15.0 → python_engineio-4.15.1}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-engineio
3
- Version: 4.15.0
3
+ Version: 4.15.1
4
4
  Summary: Engine.IO server and client for Python
5
5
  Author-email: Miguel Grinberg <miguel.grinberg@gmail.com>
6
6
  License-Expression: MIT
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "python-engineio"
3
- version = "4.15.0"
3
+ version = "4.15.1"
4
4
  authors = [{name = "Miguel Grinberg", email = "miguel.grinberg@gmail.com"}]
5
5
  description = "Engine.IO server and client for Python"
6
6
  classifiers = [
@@ -298,7 +298,13 @@ class AsyncServer(base_server.BaseServer):
298
298
  self._log_error_once(f'{e} {sid}', 'bad-sid')
299
299
  r = self._bad_request(f'{e} {sid}')
300
300
  else:
301
- if socket.upgraded:
301
+ if not socket.connected:
302
+ # cannot accept requests before connecting
303
+ self._log_error_once(
304
+ f'Socket for session {sid} is not connected',
305
+ 'not-connected')
306
+ r = self._bad_request('Not connected')
307
+ elif socket.upgraded:
302
308
  # cannot accept HTTP requests once upgraded
303
309
  self._log_error_once(
304
310
  f'Unexpected HTTP request for session {sid}',
@@ -332,7 +338,13 @@ class AsyncServer(base_server.BaseServer):
332
338
  r = self._bad_request(f'Invalid session {sid}')
333
339
  else:
334
340
  socket = self._get_socket(sid)
335
- if not socket.upgraded:
341
+ if not socket.connected:
342
+ # cannot accept requests before connecting
343
+ self._log_error_once(
344
+ f'Socket for session {sid} is not connected',
345
+ 'not-connected')
346
+ r = self._bad_request('Not connected')
347
+ elif not socket.upgraded:
336
348
  try:
337
349
  await socket.handle_post_request(environ)
338
350
  r = self._ok(jsonp_index=jsonp_index)
@@ -56,8 +56,8 @@ class AsyncSocket(base_socket.BaseSocket):
56
56
  """Make sure the client is still sending pings."""
57
57
  if self.closed:
58
58
  raise exceptions.SocketIsClosedError()
59
- if self.last_ping and \
60
- time.time() - self.last_ping > self.server.ping_timeout:
59
+ last_ping = self.last_ping
60
+ if last_ping and time.time() - last_ping > self.server.ping_timeout:
61
61
  self.server.logger.info('%s: Client is gone, closing socket',
62
62
  self.sid)
63
63
  # Passing abort=False here will cause close() to write a
@@ -276,7 +276,13 @@ class Server(base_server.BaseServer):
276
276
  self._log_error_once(f'{e} {sid}', 'bad-sid')
277
277
  r = self._bad_request(f'{e} {sid}')
278
278
  else:
279
- if socket.upgraded:
279
+ if not socket.connected:
280
+ # cannot accept requests before connecting
281
+ self._log_error_once(
282
+ f'Socket for session {sid} is not connected',
283
+ 'not-connected')
284
+ r = self._bad_request('Not connected')
285
+ elif socket.upgraded:
280
286
  # cannot accept HTTP requests once upgraded
281
287
  self._log_error_once(
282
288
  f'Unexpected HTTP request for session {sid}',
@@ -310,7 +316,13 @@ class Server(base_server.BaseServer):
310
316
  r = self._bad_request(f'Invalid session {sid}')
311
317
  else:
312
318
  socket = self._get_socket(sid)
313
- if not socket.upgraded:
319
+ if not socket.connected:
320
+ # cannot accept requests before connecting
321
+ self._log_error_once(
322
+ f'Socket for session {sid} is not connected',
323
+ 'not-connected')
324
+ r = self._bad_request('Not connected')
325
+ elif not socket.upgraded:
314
326
  try:
315
327
  socket.handle_post_request(environ)
316
328
  r = self._ok(jsonp_index=jsonp_index)
@@ -57,8 +57,8 @@ class Socket(base_socket.BaseSocket):
57
57
  """Make sure the client is still responding to pings."""
58
58
  if self.closed:
59
59
  raise exceptions.SocketIsClosedError()
60
- if self.last_ping and \
61
- time.time() - self.last_ping > self.server.ping_timeout:
60
+ last_ping = self.last_ping
61
+ if last_ping and time.time() - last_ping > self.server.ping_timeout:
62
62
  self.server.logger.info('%s: Client is gone, closing socket',
63
63
  self.sid)
64
64
  # Passing abort=False here will cause close() to write a
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-engineio
3
- Version: 4.15.0
3
+ Version: 4.15.1
4
4
  Summary: Engine.IO server and client for Python
5
5
  Author-email: Miguel Grinberg <miguel.grinberg@gmail.com>
6
6
  License-Expression: MIT
@@ -36,7 +36,7 @@ src/python_engineio.egg-info/dependency_links.txt
36
36
  src/python_engineio.egg-info/not-zip-safe
37
37
  src/python_engineio.egg-info/requires.txt
38
38
  src/python_engineio.egg-info/top_level.txt
39
- tests/async/.test_client.py.swp
39
+ tests/async/.test_server.py.swp
40
40
  tests/async/__init__.py
41
41
  tests/async/index.html
42
42
  tests/async/test_aiohttp.py
@@ -688,6 +688,7 @@ class TestAsyncServer:
688
688
  import_module.side_effect = [a]
689
689
  s = async_server.AsyncServer()
690
690
  s.sockets['foo'] = mock_socket = self._get_mock_socket()
691
+ mock_socket.connected = True
691
692
  mock_socket.upgraded = False
692
693
  await s.handle_request('request')
693
694
  assert a._async['make_response'].call_args[0][0] == '400 BAD REQUEST'
@@ -701,6 +702,7 @@ class TestAsyncServer:
701
702
  import_module.side_effect = [a]
702
703
  s = async_server.AsyncServer()
703
704
  s.sockets['foo'] = mock_socket = self._get_mock_socket()
705
+ mock_socket.connected = True
704
706
  mock_socket.upgraded = True
705
707
  await s.handle_request('request')
706
708
  assert a._async['make_response'].call_args[0][0] == '400 BAD REQUEST'
@@ -724,6 +726,7 @@ class TestAsyncServer:
724
726
  import_module.side_effect = [a]
725
727
  s = async_server.AsyncServer()
726
728
  s.sockets['foo'] = self._get_mock_socket()
729
+ s.sockets['foo'].connected = True
727
730
  s.sockets['foo'].upgraded = True
728
731
  await s.handle_request('request')
729
732
  assert a._async['make_response'].call_args[0][0] == '400 BAD REQUEST'
@@ -757,6 +760,7 @@ class TestAsyncServer:
757
760
  import_module.side_effect = [a]
758
761
  s = async_server.AsyncServer()
759
762
  s.sockets['foo'] = mock_socket = self._get_mock_socket()
763
+ mock_socket.connected = True
760
764
  mock_socket.handle_get_request.return_value = [
761
765
  packet.Packet(packet.MESSAGE, data='hello')
762
766
  ]
@@ -777,6 +781,7 @@ class TestAsyncServer:
777
781
  import_module.side_effect = [a]
778
782
  s = async_server.AsyncServer()
779
783
  s.sockets['foo'] = mock_socket = self._get_mock_socket()
784
+ mock_socket.connected = True
780
785
  mock_socket.handle_get_request.return_value = 'resp'
781
786
  r = await s.handle_request('request')
782
787
  assert r == 'resp'
@@ -789,6 +794,7 @@ class TestAsyncServer:
789
794
  import_module.side_effect = [a]
790
795
  s = async_server.AsyncServer()
791
796
  s.sockets['foo'] = mock_socket = self._get_mock_socket()
797
+ mock_socket.connected = True
792
798
 
793
799
  async def mock_get_request(*args, **kwargs):
794
800
  mock_socket.closed = True
@@ -807,6 +813,7 @@ class TestAsyncServer:
807
813
  import_module.side_effect = [a]
808
814
  s = async_server.AsyncServer()
809
815
  s.sockets['foo'] = mock_socket = self._get_mock_socket()
816
+ mock_socket.connected = True
810
817
 
811
818
  async def mock_get_request(*args, **kwargs):
812
819
  raise exceptions.QueueEmpty()
@@ -823,10 +830,22 @@ class TestAsyncServer:
823
830
  )
824
831
  import_module.side_effect = [a]
825
832
  s = async_server.AsyncServer()
826
- s.sockets['foo'] = self._get_mock_socket()
833
+ s.sockets['foo'] = mock_socket = self._get_mock_socket()
834
+ mock_socket.connected = True
827
835
  await s.handle_request('request')
828
836
  assert a._async['make_response'].call_args[0][0] == '200 OK'
829
837
 
838
+ @mock.patch('importlib.import_module')
839
+ async def test_post_request_before_connecting(self, import_module):
840
+ a = self.get_async_mock(
841
+ {'REQUEST_METHOD': 'POST', 'QUERY_STRING': 'sid=foo'}
842
+ )
843
+ import_module.side_effect = [a]
844
+ s = async_server.AsyncServer()
845
+ s.sockets['foo'] = self._get_mock_socket()
846
+ await s.handle_request('request')
847
+ assert a._async['make_response'].call_args[0][0] == '400 BAD REQUEST'
848
+
830
849
  @mock.patch('importlib.import_module')
831
850
  async def test_post_request_error(self, import_module):
832
851
  a = self.get_async_mock(
@@ -835,6 +854,7 @@ class TestAsyncServer:
835
854
  import_module.side_effect = [a]
836
855
  s = async_server.AsyncServer()
837
856
  s.sockets['foo'] = mock_socket = self._get_mock_socket()
857
+ mock_socket.connected = True
838
858
 
839
859
  async def mock_post_request(*args, **kwargs):
840
860
  raise exceptions.ContentTooLongError()
@@ -35,6 +35,7 @@ class TestServer:
35
35
 
36
36
  def _get_mock_socket(self):
37
37
  mock_socket = mock.MagicMock()
38
+ mock_socket.connected = False
38
39
  mock_socket.closed = False
39
40
  mock_socket.closing = False
40
41
  mock_socket.upgraded = False
@@ -862,6 +863,7 @@ class TestServer:
862
863
  def test_post_request_after_upgrade(self):
863
864
  s = server.Server()
864
865
  mock_socket = self._get_mock_socket()
866
+ mock_socket.connected = True
865
867
  mock_socket.upgraded = True
866
868
  mock_socket.handle_post_request = mock.MagicMock()
867
869
  s.sockets['foo'] = mock_socket
@@ -887,6 +889,7 @@ class TestServer:
887
889
  def test_get_request(self):
888
890
  s = server.Server()
889
891
  mock_socket = self._get_mock_socket()
892
+ mock_socket.connected = True
890
893
  mock_socket.handle_get_request = mock.MagicMock(
891
894
  return_value=[packet.Packet(packet.MESSAGE, data='hello')]
892
895
  )
@@ -903,6 +906,7 @@ class TestServer:
903
906
  def test_get_request_custom_response(self):
904
907
  s = server.Server()
905
908
  mock_socket = self._get_mock_socket()
909
+ mock_socket.connected = True
906
910
  mock_socket.handle_get_request = mock.MagicMock(side_effect=['resp'])
907
911
  s.sockets['foo'] = mock_socket
908
912
  environ = {'REQUEST_METHOD': 'GET', 'QUERY_STRING': 'EIO=4&sid=foo'}
@@ -912,6 +916,7 @@ class TestServer:
912
916
  def test_get_request_closes_socket(self):
913
917
  s = server.Server()
914
918
  mock_socket = self._get_mock_socket()
919
+ mock_socket.connected = True
915
920
 
916
921
  def mock_get_request(*args, **kwargs):
917
922
  mock_socket.closed = True
@@ -927,6 +932,7 @@ class TestServer:
927
932
  def test_get_request_error(self):
928
933
  s = server.Server()
929
934
  mock_socket = self._get_mock_socket()
935
+ mock_socket.connected = True
930
936
  mock_socket.handle_get_request = mock.MagicMock(
931
937
  side_effect=[exceptions.QueueEmpty]
932
938
  )
@@ -940,6 +946,7 @@ class TestServer:
940
946
  def test_get_request_bad_websocket_transport(self):
941
947
  s = server.Server()
942
948
  mock_socket = self._get_mock_socket()
949
+ mock_socket.connected = True
943
950
  mock_socket.upgraded = False
944
951
  s.sockets['foo'] = mock_socket
945
952
  environ = {'REQUEST_METHOD': 'GET',
@@ -951,6 +958,7 @@ class TestServer:
951
958
  def test_get_request_bad_polling_transport(self):
952
959
  s = server.Server()
953
960
  mock_socket = self._get_mock_socket()
961
+ mock_socket.connected = True
954
962
  mock_socket.upgraded = True
955
963
  s.sockets['foo'] = mock_socket
956
964
  environ = {'REQUEST_METHOD': 'GET',
@@ -962,6 +970,7 @@ class TestServer:
962
970
  def test_post_request(self):
963
971
  s = server.Server()
964
972
  mock_socket = self._get_mock_socket()
973
+ mock_socket.connected = True
965
974
  mock_socket.handle_post_request = mock.MagicMock()
966
975
  s.sockets['foo'] = mock_socket
967
976
  environ = {'REQUEST_METHOD': 'POST', 'QUERY_STRING': 'EIO=4&sid=foo'}
@@ -969,9 +978,20 @@ class TestServer:
969
978
  s.handle_request(environ, start_response)
970
979
  assert start_response.call_args[0][0] == '200 OK'
971
980
 
981
+ def test_post_request_before_connecting(self):
982
+ s = server.Server()
983
+ mock_socket = self._get_mock_socket()
984
+ mock_socket.handle_post_request = mock.MagicMock()
985
+ s.sockets['foo'] = mock_socket
986
+ environ = {'REQUEST_METHOD': 'POST', 'QUERY_STRING': 'EIO=4&sid=foo'}
987
+ start_response = mock.MagicMock()
988
+ s.handle_request(environ, start_response)
989
+ assert start_response.call_args[0][0] == '400 BAD REQUEST'
990
+
972
991
  def test_post_request_error(self):
973
992
  s = server.Server()
974
993
  mock_socket = self._get_mock_socket()
994
+ mock_socket.connected = True
975
995
  mock_socket.handle_post_request = mock.MagicMock(
976
996
  side_effect=[exceptions.EngineIOError]
977
997
  )