python-engineio 4.13.3__tar.gz → 4.13.5__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 (65) hide show
  1. {python_engineio-4.13.3/src/python_engineio.egg-info → python_engineio-4.13.5}/PKG-INFO +1 -11
  2. {python_engineio-4.13.3 → python_engineio-4.13.5}/README.md +0 -10
  3. {python_engineio-4.13.3 → python_engineio-4.13.5}/pyproject.toml +1 -1
  4. {python_engineio-4.13.3 → python_engineio-4.13.5}/src/engineio/async_drivers/_websocket_wsgi.py +2 -0
  5. {python_engineio-4.13.3 → python_engineio-4.13.5}/src/engineio/async_drivers/asgi.py +2 -1
  6. {python_engineio-4.13.3 → python_engineio-4.13.5}/src/engineio/client.py +14 -2
  7. {python_engineio-4.13.3 → python_engineio-4.13.5/src/python_engineio.egg-info}/PKG-INFO +1 -11
  8. {python_engineio-4.13.3 → python_engineio-4.13.5}/tests/async/test_asgi.py +21 -0
  9. {python_engineio-4.13.3 → python_engineio-4.13.5}/tests/async/test_socket.py +19 -0
  10. {python_engineio-4.13.3 → python_engineio-4.13.5}/LICENSE +0 -0
  11. {python_engineio-4.13.3 → python_engineio-4.13.5}/MANIFEST.in +0 -0
  12. {python_engineio-4.13.3 → python_engineio-4.13.5}/docs/_static/README.md +0 -0
  13. {python_engineio-4.13.3 → python_engineio-4.13.5}/setup.cfg +0 -0
  14. {python_engineio-4.13.3 → python_engineio-4.13.5}/src/engineio/__init__.py +0 -0
  15. {python_engineio-4.13.3 → python_engineio-4.13.5}/src/engineio/async_client.py +0 -0
  16. {python_engineio-4.13.3 → python_engineio-4.13.5}/src/engineio/async_drivers/__init__.py +0 -0
  17. {python_engineio-4.13.3 → python_engineio-4.13.5}/src/engineio/async_drivers/aiohttp.py +0 -0
  18. {python_engineio-4.13.3 → python_engineio-4.13.5}/src/engineio/async_drivers/eventlet.py +0 -0
  19. {python_engineio-4.13.3 → python_engineio-4.13.5}/src/engineio/async_drivers/gevent.py +0 -0
  20. {python_engineio-4.13.3 → python_engineio-4.13.5}/src/engineio/async_drivers/gevent_uwsgi.py +0 -0
  21. {python_engineio-4.13.3 → python_engineio-4.13.5}/src/engineio/async_drivers/sanic.py +0 -0
  22. {python_engineio-4.13.3 → python_engineio-4.13.5}/src/engineio/async_drivers/threading.py +0 -0
  23. {python_engineio-4.13.3 → python_engineio-4.13.5}/src/engineio/async_drivers/tornado.py +0 -0
  24. {python_engineio-4.13.3 → python_engineio-4.13.5}/src/engineio/async_server.py +0 -0
  25. {python_engineio-4.13.3 → python_engineio-4.13.5}/src/engineio/async_socket.py +0 -0
  26. {python_engineio-4.13.3 → python_engineio-4.13.5}/src/engineio/base_client.py +0 -0
  27. {python_engineio-4.13.3 → python_engineio-4.13.5}/src/engineio/base_server.py +0 -0
  28. {python_engineio-4.13.3 → python_engineio-4.13.5}/src/engineio/base_socket.py +0 -0
  29. {python_engineio-4.13.3 → python_engineio-4.13.5}/src/engineio/exceptions.py +0 -0
  30. {python_engineio-4.13.3 → python_engineio-4.13.5}/src/engineio/json.py +0 -0
  31. {python_engineio-4.13.3 → python_engineio-4.13.5}/src/engineio/middleware.py +0 -0
  32. {python_engineio-4.13.3 → python_engineio-4.13.5}/src/engineio/packet.py +0 -0
  33. {python_engineio-4.13.3 → python_engineio-4.13.5}/src/engineio/payload.py +0 -0
  34. {python_engineio-4.13.3 → python_engineio-4.13.5}/src/engineio/server.py +0 -0
  35. {python_engineio-4.13.3 → python_engineio-4.13.5}/src/engineio/socket.py +0 -0
  36. {python_engineio-4.13.3 → python_engineio-4.13.5}/src/engineio/static_files.py +0 -0
  37. {python_engineio-4.13.3 → python_engineio-4.13.5}/src/python_engineio.egg-info/SOURCES.txt +0 -0
  38. {python_engineio-4.13.3 → python_engineio-4.13.5}/src/python_engineio.egg-info/dependency_links.txt +0 -0
  39. {python_engineio-4.13.3 → python_engineio-4.13.5}/src/python_engineio.egg-info/not-zip-safe +0 -0
  40. {python_engineio-4.13.3 → python_engineio-4.13.5}/src/python_engineio.egg-info/requires.txt +0 -0
  41. {python_engineio-4.13.3 → python_engineio-4.13.5}/src/python_engineio.egg-info/top_level.txt +0 -0
  42. {python_engineio-4.13.3 → python_engineio-4.13.5}/tests/async/__init__.py +0 -0
  43. {python_engineio-4.13.3 → python_engineio-4.13.5}/tests/async/index.html +0 -0
  44. {python_engineio-4.13.3 → python_engineio-4.13.5}/tests/async/test_aiohttp.py +0 -0
  45. {python_engineio-4.13.3 → python_engineio-4.13.5}/tests/async/test_client.py +0 -0
  46. {python_engineio-4.13.3 → python_engineio-4.13.5}/tests/async/test_sanic.py +0 -0
  47. {python_engineio-4.13.3 → python_engineio-4.13.5}/tests/async/test_server.py +0 -0
  48. {python_engineio-4.13.3 → python_engineio-4.13.5}/tests/async/test_tornado.py +0 -0
  49. {python_engineio-4.13.3 → python_engineio-4.13.5}/tests/common/__init__.py +0 -0
  50. {python_engineio-4.13.3 → python_engineio-4.13.5}/tests/common/index.html +0 -0
  51. {python_engineio-4.13.3 → python_engineio-4.13.5}/tests/common/test_client.py +0 -0
  52. {python_engineio-4.13.3 → python_engineio-4.13.5}/tests/common/test_middleware.py +0 -0
  53. {python_engineio-4.13.3 → python_engineio-4.13.5}/tests/common/test_packet.py +0 -0
  54. {python_engineio-4.13.3 → python_engineio-4.13.5}/tests/common/test_payload.py +0 -0
  55. {python_engineio-4.13.3 → python_engineio-4.13.5}/tests/common/test_server.py +0 -0
  56. {python_engineio-4.13.3 → python_engineio-4.13.5}/tests/common/test_socket.py +0 -0
  57. {python_engineio-4.13.3 → python_engineio-4.13.5}/tests/performance/README.md +0 -0
  58. {python_engineio-4.13.3 → python_engineio-4.13.5}/tests/performance/binary_b64_packet.py +0 -0
  59. {python_engineio-4.13.3 → python_engineio-4.13.5}/tests/performance/binary_packet.py +0 -0
  60. {python_engineio-4.13.3 → python_engineio-4.13.5}/tests/performance/json_packet.py +0 -0
  61. {python_engineio-4.13.3 → python_engineio-4.13.5}/tests/performance/payload.py +0 -0
  62. {python_engineio-4.13.3 → python_engineio-4.13.5}/tests/performance/run.sh +0 -0
  63. {python_engineio-4.13.3 → python_engineio-4.13.5}/tests/performance/server_receive.py +0 -0
  64. {python_engineio-4.13.3 → python_engineio-4.13.5}/tests/performance/text_packet.py +0 -0
  65. {python_engineio-4.13.3 → python_engineio-4.13.5}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-engineio
3
- Version: 4.13.3
3
+ Version: 4.13.5
4
4
  Summary: Engine.IO server and client for Python
5
5
  Author-email: Miguel Grinberg <miguel.grinberg@gmail.com>
6
6
  License: MIT
@@ -33,16 +33,6 @@ python-engineio
33
33
 
34
34
  Python implementation of the `Engine.IO` realtime client and server.
35
35
 
36
- Sponsors
37
- --------
38
-
39
- The following organizations are funding this project:
40
-
41
- ![Socket.IO](https://images.opencollective.com/socketio/050e5eb/logo/64.png)<br>[Socket.IO](https://socket.io) | [Add your company here!](https://github.com/sponsors/miguelgrinberg)|
42
- -|-
43
-
44
- Many individual sponsors also support this project through small ongoing contributions. Why not [join them](https://github.com/sponsors/miguelgrinberg)?
45
-
46
36
  Resources
47
37
  ---------
48
38
 
@@ -5,16 +5,6 @@ python-engineio
5
5
 
6
6
  Python implementation of the `Engine.IO` realtime client and server.
7
7
 
8
- Sponsors
9
- --------
10
-
11
- The following organizations are funding this project:
12
-
13
- ![Socket.IO](https://images.opencollective.com/socketio/050e5eb/logo/64.png)<br>[Socket.IO](https://socket.io) | [Add your company here!](https://github.com/sponsors/miguelgrinberg)|
14
- -|-
15
-
16
- Many individual sponsors also support this project through small ongoing contributions. Why not [join them](https://github.com/sponsors/miguelgrinberg)?
17
-
18
8
  Resources
19
9
  ---------
20
10
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "python-engineio"
3
- version = "4.13.3"
3
+ version = "4.13.5"
4
4
  license = {text = "MIT"}
5
5
  authors = [{name = "Miguel Grinberg", email = "miguel.grinberg@gmail.com"}]
6
6
  description = "Engine.IO server and client for Python"
@@ -15,6 +15,8 @@ class SimpleWebSocketWSGI: # pragma: no cover
15
15
  ret = self.app(self)
16
16
  if self.ws.mode == 'gunicorn':
17
17
  raise StopIteration()
18
+ elif self.ws.mode == 'werkzeug':
19
+ raise ConnectionError()
18
20
  return ret
19
21
 
20
22
  def close(self):
@@ -147,7 +147,8 @@ async def translate_request(scope, receive, send):
147
147
  while self.event.get('more_body'):
148
148
  self.event = await receive()
149
149
  if self.event['type'] == 'http.request':
150
- self.payload += self.event.get('body') or b''
150
+ if length is None or len(self.payload) < length:
151
+ self.payload += self.event.get('body') or b''
151
152
  if length is None:
152
153
  r = self.payload
153
154
  self.payload = b''
@@ -508,7 +508,13 @@ class Client(base_client.BaseClient):
508
508
 
509
509
  if self.write_loop_task: # pragma: no branch
510
510
  self.logger.info('Waiting for write loop task to end')
511
- self.write_loop_task.join()
511
+ try:
512
+ # the write loop task cleans its own task when it ends, so we
513
+ # avoid a race condition when using threads with a try/catch
514
+ self.write_loop_task.join()
515
+ except AttributeError: # pragma: no cover
516
+ if self.write_loop_task is not None:
517
+ raise # for any erros not related to task == None we raise
512
518
  if self.state == 'connected':
513
519
  self._trigger_event('disconnect', self.reason.TRANSPORT_ERROR,
514
520
  run_async=False)
@@ -559,7 +565,13 @@ class Client(base_client.BaseClient):
559
565
 
560
566
  if self.write_loop_task: # pragma: no branch
561
567
  self.logger.info('Waiting for write loop task to end')
562
- self.write_loop_task.join()
568
+ try:
569
+ # the write loop task cleans its own task when it ends, so we
570
+ # avoid a race condition when using threads with a try/catch
571
+ self.write_loop_task.join()
572
+ except AttributeError: # pragma: no cover
573
+ if self.write_loop_task is not None:
574
+ raise # for any erros not related to task == None we raise
563
575
  if self.state == 'connected':
564
576
  self._trigger_event('disconnect', self.reason.TRANSPORT_ERROR,
565
577
  run_async=False)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-engineio
3
- Version: 4.13.3
3
+ Version: 4.13.5
4
4
  Summary: Engine.IO server and client for Python
5
5
  Author-email: Miguel Grinberg <miguel.grinberg@gmail.com>
6
6
  License: MIT
@@ -33,16 +33,6 @@ python-engineio
33
33
 
34
34
  Python implementation of the `Engine.IO` realtime client and server.
35
35
 
36
- Sponsors
37
- --------
38
-
39
- The following organizations are funding this project:
40
-
41
- ![Socket.IO](https://images.opencollective.com/socketio/050e5eb/logo/64.png)<br>[Socket.IO](https://socket.io) | [Add your company here!](https://github.com/sponsors/miguelgrinberg)|
42
- -|-
43
-
44
- Many individual sponsors also support this project through small ongoing contributions. Why not [join them](https://github.com/sponsors/miguelgrinberg)?
45
-
46
36
  Resources
47
37
  ---------
48
38
 
@@ -441,6 +441,27 @@ class TestAsgi:
441
441
  body = await environ['wsgi.input'].read()
442
442
  assert body == b'hello world'
443
443
 
444
+ async def test_translate_request_read_zero(self):
445
+ receive = mock.AsyncMock(
446
+ return_value={'type': 'http.request', 'body': b'hello world'}
447
+ )
448
+ send = mock.AsyncMock()
449
+ environ = await async_asgi.translate_request(
450
+ {
451
+ 'type': 'http',
452
+ 'method': 'PUT',
453
+ 'headers': [
454
+ (b'content-type', b'application/json'),
455
+ (b'content-length', b'123'),
456
+ ],
457
+ 'path': '/foo/bar',
458
+ },
459
+ receive,
460
+ send,
461
+ )
462
+ body = await environ['wsgi.input'].read(0)
463
+ assert body == b''
464
+
444
465
  async def test_translate_websocket_request(self):
445
466
  receive = mock.AsyncMock(return_value={'type': 'websocket.connect'})
446
467
  send = mock.AsyncMock()
@@ -209,6 +209,8 @@ class TestSocket:
209
209
  }
210
210
  await s.handle_post_request(environ)
211
211
  assert s.receive.await_count == 2
212
+ assert s.receive.call_args_list[0][0][0].data == 'hello'
213
+ assert s.receive.call_args_list[1][0][0].data == 'bye'
212
214
 
213
215
  async def test_polling_write_too_large(self):
214
216
  mock_server = self._get_mock_server()
@@ -227,6 +229,23 @@ class TestSocket:
227
229
  with pytest.raises(exceptions.ContentTooLongError):
228
230
  await s.handle_post_request(environ)
229
231
 
232
+ async def test_polling_write_without_content_length(self):
233
+ mock_server = self._get_mock_server()
234
+ pkt1 = packet.Packet(packet.MESSAGE, data='hello')
235
+ pkt2 = packet.Packet(packet.MESSAGE, data='bye')
236
+ p = payload.Payload(packets=[pkt1, pkt2]).encode().encode('utf-8')
237
+ s = async_socket.AsyncSocket(mock_server, 'foo')
238
+ s.receive = mock.AsyncMock()
239
+ environ = {
240
+ 'REQUEST_METHOD': 'POST',
241
+ 'QUERY_STRING': 'sid=foo',
242
+ 'wsgi.input': self._get_read_mock_coro(p),
243
+ }
244
+ await s.handle_post_request(environ)
245
+ assert s.receive.await_count == 2
246
+ assert environ['wsgi.input'].read.call_count == 1
247
+ assert environ['wsgi.input'].read.call_args[0] == (0,)
248
+
230
249
  async def test_upgrade_handshake(self):
231
250
  mock_server = self._get_mock_server()
232
251
  s = async_socket.AsyncSocket(mock_server, 'foo')