2424from concurrent .futures import CancelledError
2525from functools import partial
2626
27+ from autobahn .websocket .compress import PERMESSAGE_COMPRESSION_EXTENSION as EXTENSIONS
2728from twisted .internet import defer , reactor
2829from twisted .internet .endpoints import serverFromString
2930from twisted .logger import STDLibLogObserver , globalLogBeginner
@@ -46,6 +47,11 @@ def __init__(
4647 request_buffer_size = 8192 ,
4748 websocket_timeout = 86400 ,
4849 websocket_connect_timeout = 20 ,
50+ websocket_permessage_compression_extensions = (
51+ "permessage-deflate" ,
52+ "permessage-bzip2" ,
53+ "permessage-snappy" ,
54+ ),
4955 ping_interval = 20 ,
5056 ping_timeout = 30 ,
5157 root_path = "" ,
@@ -76,6 +82,9 @@ def __init__(
7682 self .websocket_timeout = websocket_timeout
7783 self .websocket_connect_timeout = websocket_connect_timeout
7884 self .websocket_handshake_timeout = websocket_handshake_timeout
85+ self .websocket_permessage_compression_extensions = (
86+ websocket_permessage_compression_extensions
87+ )
7988 self .application_close_timeout = application_close_timeout
8089 self .root_path = root_path
8190 self .verbosity = verbosity
@@ -97,6 +106,7 @@ def run(self):
97106 autoPingTimeout = self .ping_timeout ,
98107 allowNullOrigin = True ,
99108 openHandshakeTimeout = self .websocket_handshake_timeout ,
109+ perMessageCompressionAccept = self .accept_permessage_compression_extension ,
100110 )
101111 if self .verbosity <= 1 :
102112 # Redirect the Twisted log to nowhere
@@ -251,6 +261,21 @@ def check_headers_type(message):
251261 )
252262 )
253263
264+ def accept_permessage_compression_extension (self , offers ):
265+ """
266+ Accepts websocket compression extension as required by `autobahn` package.
267+ """
268+ for offer in offers :
269+ for ext in self .websocket_permessage_compression_extensions :
270+ if ext in EXTENSIONS and isinstance (offer , EXTENSIONS [ext ]["Offer" ]):
271+ return EXTENSIONS [ext ]["OfferAccept" ](offer )
272+ elif ext not in EXTENSIONS :
273+ logger .warning (
274+ "Compression extension %s could not be accepted. "
275+ "It is not supported or a dependency is missing." ,
276+ ext ,
277+ )
278+
254279 ### Utility
255280
256281 def application_checker (self ):
0 commit comments