|
1 | 1 | Extensions
|
2 | 2 | ==========
|
3 | 3 |
|
4 |
| -.. currentmodule:: websockets |
| 4 | +.. currentmodule:: websockets.extensions |
5 | 5 |
|
6 | 6 | The WebSocket protocol supports extensions_.
|
7 | 7 |
|
8 |
| -At the time of writing, there's only one `registered extension`_, WebSocket |
9 |
| -Per-Message Deflate, specified in :rfc:`7692`. |
| 8 | +At the time of writing, there's only one `registered extension`_ with a public |
| 9 | +specification, WebSocket Per-Message Deflate, specified in :rfc:`7692`. |
10 | 10 |
|
11 | 11 | .. _extensions: https://tools.ietf.org/html/rfc6455#section-9
|
12 | 12 | .. _registered extension: https://www.iana.org/assignments/websocket/websocket.xhtml#extension-name
|
13 | 13 |
|
14 | 14 | Per-Message Deflate
|
15 | 15 | -------------------
|
16 | 16 |
|
17 |
| -:func:`~legacy.server.serve()` and :func:`~legacy.client.connect` enable the |
18 |
| -Per-Message Deflate extension by default. You can disable this with |
19 |
| -``compression=None``. |
| 17 | +:func:`~websockets.legacy.client.connect` and |
| 18 | +:func:`~websockets.legacy.server.serve` enable the Per-Message Deflate |
| 19 | +extension by default. |
| 20 | + |
| 21 | +If you want to disable it, set ``compression=None``:: |
| 22 | + |
| 23 | + import websockets |
| 24 | + |
| 25 | + websockets.connect(..., compression=None) |
| 26 | + |
| 27 | + websockets.serve(..., compression=None) |
20 | 28 |
|
21 |
| -You can also configure the Per-Message Deflate extension explicitly if you |
22 |
| -want to customize its parameters. |
23 | 29 |
|
24 | 30 | .. _per-message-deflate-configuration-example:
|
25 | 31 |
|
26 |
| -Here's an example on the server side:: |
| 32 | +You can also configure the Per-Message Deflate extension explicitly if you |
| 33 | +want to customize compression settings:: |
27 | 34 |
|
28 | 35 | import websockets
|
29 | 36 | from websockets.extensions import permessage_deflate
|
30 | 37 |
|
31 |
| - websockets.serve( |
| 38 | + websockets.connect( |
32 | 39 | ...,
|
33 | 40 | extensions=[
|
34 |
| - permessage_deflate.ServerPerMessageDeflateFactory( |
| 41 | + permessage_deflate.ClientPerMessageDeflateFactory( |
35 | 42 | server_max_window_bits=11,
|
36 | 43 | client_max_window_bits=11,
|
37 | 44 | compress_settings={'memLevel': 4},
|
38 | 45 | ),
|
39 | 46 | ],
|
40 | 47 | )
|
41 | 48 |
|
42 |
| -Here's an example on the client side:: |
43 |
| - |
44 |
| - import websockets |
45 |
| - from websockets.extensions import permessage_deflate |
46 |
| - |
47 |
| - websockets.connect( |
| 49 | + websockets.serve( |
48 | 50 | ...,
|
49 | 51 | extensions=[
|
50 |
| - permessage_deflate.ClientPerMessageDeflateFactory( |
| 52 | + permessage_deflate.ServerPerMessageDeflateFactory( |
51 | 53 | server_max_window_bits=11,
|
52 | 54 | client_max_window_bits=11,
|
53 | 55 | compress_settings={'memLevel': 4},
|
54 | 56 | ),
|
55 | 57 | ],
|
56 | 58 | )
|
57 | 59 |
|
| 60 | +The window bits and memory level values chosen in these examples reduce memory |
| 61 | +usage. You can read more about :ref:`optimizing compression settings |
| 62 | +<compression-settings>`. |
| 63 | + |
58 | 64 | Refer to the API documentation of
|
59 |
| -:class:`~extensions.permessage_deflate.ServerPerMessageDeflateFactory` and |
60 |
| -:class:`~extensions.permessage_deflate.ClientPerMessageDeflateFactory` for |
61 |
| -details. |
| 65 | +:class:`~permessage_deflate.ClientPerMessageDeflateFactory` and |
| 66 | +:class:`~permessage_deflate.ServerPerMessageDeflateFactory` for details. |
62 | 67 |
|
63 | 68 | Writing an extension
|
64 | 69 | --------------------
|
65 | 70 |
|
66 | 71 | During the opening handshake, WebSocket clients and servers negotiate which
|
67 | 72 | extensions will be used with which parameters. Then each frame is processed by
|
68 |
| -extensions before it's sent and after it's received. |
| 73 | +extensions before being sent or after being received. |
| 74 | + |
| 75 | +As a consequence, writing an extension requires implementing several classes: |
| 76 | + |
| 77 | +* Extension Factory: it negotiates parameters and instantiates the extension. |
69 | 78 |
|
70 |
| -As a consequence writing an extension requires implementing several classes: |
| 79 | + Clients and servers require separate extension factories with distinct APIs. |
71 | 80 |
|
72 |
| -1. Extension Factory: it negotiates parameters and instantiates the extension. |
73 |
| - Clients and servers require separate extension factories with distinct APIs. |
| 81 | + Extension factories are the public API of an extension. |
74 | 82 |
|
75 |
| -2. Extension: it decodes incoming frames and encodes outgoing frames. If the |
76 |
| - extension is symmetrical, clients and servers can use the same class. |
| 83 | +* Extension: it decodes incoming frames and encodes outgoing frames. |
| 84 | + |
| 85 | + If the extension is symmetrical, clients and servers can use the same |
| 86 | + class. |
| 87 | + |
| 88 | + Extensions are initialized by extension factories, so they don't need to be |
| 89 | + part of the public API of an extension. |
77 | 90 |
|
78 | 91 | ``websockets`` provides abstract base classes for extension factories and
|
79 |
| -extensions. |
| 92 | +extensions. See the API documentation for details on their methods: |
| 93 | + |
| 94 | +* :class:`~base.ClientExtensionFactory` and |
| 95 | + :class:`~base.ServerExtensionFactory` for extension factories, |
80 | 96 |
|
81 |
| -.. autoclass:: websockets.extensions.base.ServerExtensionFactory |
82 |
| - :members: |
| 97 | +* :class:`~base.Extension` for extensions. |
83 | 98 |
|
84 |
| -.. autoclass:: websockets.extensions.base.ClientExtensionFactory |
85 |
| - :members: |
86 | 99 |
|
87 |
| -.. autoclass:: websockets.extensions.base.Extension |
88 |
| - :members: |
|
0 commit comments