| OLD | NEW |
| 1 # Copyright 2012, Google Inc. | 1 # Copyright 2012, Google Inc. |
| 2 # All rights reserved. | 2 # All rights reserved. |
| 3 # | 3 # |
| 4 # Redistribution and use in source and binary forms, with or without | 4 # Redistribution and use in source and binary forms, with or without |
| 5 # modification, are permitted provided that the following conditions are | 5 # modification, are permitted provided that the following conditions are |
| 6 # met: | 6 # met: |
| 7 # | 7 # |
| 8 # * Redistributions of source code must retain the above copyright | 8 # * Redistributions of source code must retain the above copyright |
| 9 # notice, this list of conditions and the following disclaimer. | 9 # notice, this list of conditions and the following disclaimer. |
| 10 # * Redistributions in binary form must reproduce the above | 10 # * Redistributions in binary form must reproduce the above |
| (...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 323 _compression_extension_names.append(common.DEFLATE_FRAME_EXTENSION) | 323 _compression_extension_names.append(common.DEFLATE_FRAME_EXTENSION) |
| 324 | 324 |
| 325 _available_processors[common.X_WEBKIT_DEFLATE_FRAME_EXTENSION] = ( | 325 _available_processors[common.X_WEBKIT_DEFLATE_FRAME_EXTENSION] = ( |
| 326 DeflateFrameExtensionProcessor) | 326 DeflateFrameExtensionProcessor) |
| 327 _compression_extension_names.append(common.X_WEBKIT_DEFLATE_FRAME_EXTENSION) | 327 _compression_extension_names.append(common.X_WEBKIT_DEFLATE_FRAME_EXTENSION) |
| 328 | 328 |
| 329 | 329 |
| 330 def _parse_compression_method(data): | 330 def _parse_compression_method(data): |
| 331 """Parses the value of "method" extension parameter.""" | 331 """Parses the value of "method" extension parameter.""" |
| 332 | 332 |
| 333 return common.parse_extensions(data, allow_quoted_string=True) | 333 return common.parse_extensions(data) |
| 334 | 334 |
| 335 | 335 |
| 336 def _create_accepted_method_desc(method_name, method_params): | 336 def _create_accepted_method_desc(method_name, method_params): |
| 337 """Creates accepted-method-desc from given method name and parameters""" | 337 """Creates accepted-method-desc from given method name and parameters""" |
| 338 | 338 |
| 339 extension = common.ExtensionParameter(method_name) | 339 extension = common.ExtensionParameter(method_name) |
| 340 for name, value in method_params: | 340 for name, value in method_params: |
| 341 extension.add_parameter(name, value) | 341 extension.add_parameter(name, value) |
| 342 return common.format_extension(extension) | 342 return common.format_extension(extension) |
| 343 | 343 |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 414 return | 414 return |
| 415 self._compression_processor.setup_stream_options(stream_options) | 415 self._compression_processor.setup_stream_options(stream_options) |
| 416 | 416 |
| 417 def set_compression_processor_hook(self, hook): | 417 def set_compression_processor_hook(self, hook): |
| 418 self._compression_processor_hook = hook | 418 self._compression_processor_hook = hook |
| 419 | 419 |
| 420 def get_compression_processor(self): | 420 def get_compression_processor(self): |
| 421 return self._compression_processor | 421 return self._compression_processor |
| 422 | 422 |
| 423 | 423 |
| 424 class PerFrameCompressExtensionProcessor(CompressionExtensionProcessorBase): | |
| 425 """perframe-compress processor. | |
| 426 | |
| 427 Specification: | |
| 428 http://tools.ietf.org/html/draft-ietf-hybi-websocket-perframe-compression | |
| 429 """ | |
| 430 | |
| 431 _DEFLATE_METHOD = 'deflate' | |
| 432 | |
| 433 def __init__(self, request): | |
| 434 CompressionExtensionProcessorBase.__init__(self, request) | |
| 435 | |
| 436 def name(self): | |
| 437 return common.PERFRAME_COMPRESSION_EXTENSION | |
| 438 | |
| 439 def _lookup_compression_processor(self, method_desc): | |
| 440 if method_desc.name() == self._DEFLATE_METHOD: | |
| 441 return DeflateFrameExtensionProcessor(method_desc) | |
| 442 return None | |
| 443 | |
| 444 | |
| 445 _available_processors[common.PERFRAME_COMPRESSION_EXTENSION] = ( | |
| 446 PerFrameCompressExtensionProcessor) | |
| 447 _compression_extension_names.append(common.PERFRAME_COMPRESSION_EXTENSION) | |
| 448 | |
| 449 | |
| 450 class PerMessageDeflateExtensionProcessor(ExtensionProcessorInterface): | 424 class PerMessageDeflateExtensionProcessor(ExtensionProcessorInterface): |
| 451 """permessage-deflate extension processor. It's also used for | 425 """permessage-deflate extension processor. It's also used for |
| 452 permessage-compress extension when the deflate method is chosen. | 426 permessage-compress extension when the deflate method is chosen. |
| 453 | 427 |
| 454 Specification: | 428 Specification: |
| 455 http://tools.ietf.org/html/draft-ietf-hybi-permessage-compression-08 | 429 http://tools.ietf.org/html/draft-ietf-hybi-permessage-compression-08 |
| 456 """ | 430 """ |
| 457 | 431 |
| 458 _SERVER_MAX_WINDOW_BITS_PARAM = 'server_max_window_bits' | 432 _SERVER_MAX_WINDOW_BITS_PARAM = 'server_max_window_bits' |
| 459 _SERVER_NO_CONTEXT_TAKEOVER_PARAM = 'server_no_context_takeover' | 433 _SERVER_NO_CONTEXT_TAKEOVER_PARAM = 'server_no_context_takeover' |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 683 message = message.encode('utf-8') | 657 message = message.encode('utf-8') |
| 684 | 658 |
| 685 if not self._compress_outgoing_enabled: | 659 if not self._compress_outgoing_enabled: |
| 686 return message | 660 return message |
| 687 | 661 |
| 688 original_payload_size = len(message) | 662 original_payload_size = len(message) |
| 689 self._outgoing_average_ratio_calculator.add_original_bytes( | 663 self._outgoing_average_ratio_calculator.add_original_bytes( |
| 690 original_payload_size) | 664 original_payload_size) |
| 691 | 665 |
| 692 message = self._rfc1979_deflater.filter( | 666 message = self._rfc1979_deflater.filter( |
| 693 message, flush=end, bfinal=self._bfinal) | 667 message, end=end, bfinal=self._bfinal) |
| 694 | 668 |
| 695 filtered_payload_size = len(message) | 669 filtered_payload_size = len(message) |
| 696 self._outgoing_average_ratio_calculator.add_result_bytes( | 670 self._outgoing_average_ratio_calculator.add_result_bytes( |
| 697 filtered_payload_size) | 671 filtered_payload_size) |
| 698 | 672 |
| 699 _log_outgoing_compression_ratio( | 673 _log_outgoing_compression_ratio( |
| 700 self._logger, | 674 self._logger, |
| 701 original_payload_size, | 675 original_payload_size, |
| 702 filtered_payload_size, | 676 filtered_payload_size, |
| 703 self._outgoing_average_ratio_calculator.get_average_ratio()) | 677 self._outgoing_average_ratio_calculator.get_average_ratio()) |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 837 name = processor.name() | 811 name = processor.name() |
| 838 if name == self.name(): | 812 if name == self.name(): |
| 839 before_mux = False | 813 before_mux = False |
| 840 continue | 814 continue |
| 841 if not processor.is_active(): | 815 if not processor.is_active(): |
| 842 continue | 816 continue |
| 843 if before_mux: | 817 if before_mux: |
| 844 # Mux extension cannot be used after extensions | 818 # Mux extension cannot be used after extensions |
| 845 # that depend on frame boundary, extension data field, or any | 819 # that depend on frame boundary, extension data field, or any |
| 846 # reserved bits which are attributed to each frame. | 820 # reserved bits which are attributed to each frame. |
| 847 if (name == common.PERFRAME_COMPRESSION_EXTENSION or | 821 if (name == common.DEFLATE_FRAME_EXTENSION or |
| 848 name == common.DEFLATE_FRAME_EXTENSION or | |
| 849 name == common.X_WEBKIT_DEFLATE_FRAME_EXTENSION): | 822 name == common.X_WEBKIT_DEFLATE_FRAME_EXTENSION): |
| 850 self.set_active(False) | 823 self.set_active(False) |
| 851 return | 824 return |
| 852 else: | 825 else: |
| 853 # Mux extension should not be applied before any history-based | 826 # Mux extension should not be applied before any history-based |
| 854 # compression extension. | 827 # compression extension. |
| 855 if (name == common.PERFRAME_COMPRESSION_EXTENSION or | 828 if (name == common.DEFLATE_FRAME_EXTENSION or |
| 856 name == common.DEFLATE_FRAME_EXTENSION or | |
| 857 name == common.X_WEBKIT_DEFLATE_FRAME_EXTENSION or | 829 name == common.X_WEBKIT_DEFLATE_FRAME_EXTENSION or |
| 858 name == common.PERMESSAGE_COMPRESSION_EXTENSION or | 830 name == common.PERMESSAGE_COMPRESSION_EXTENSION or |
| 859 name == common.X_WEBKIT_PERMESSAGE_COMPRESSION_EXTENSION): | 831 name == common.X_WEBKIT_PERMESSAGE_COMPRESSION_EXTENSION): |
| 860 self.set_active(False) | 832 self.set_active(False) |
| 861 return | 833 return |
| 862 | 834 |
| 863 def _get_extension_response_internal(self): | 835 def _get_extension_response_internal(self): |
| 864 self._active = False | 836 self._active = False |
| 865 quota = self._request.get_parameter_value(self._QUOTA_PARAM) | 837 quota = self._request.get_parameter_value(self._QUOTA_PARAM) |
| 866 if quota is not None: | 838 if quota is not None: |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 904 if processor_class is None: | 876 if processor_class is None: |
| 905 return None | 877 return None |
| 906 return processor_class(extension_request) | 878 return processor_class(extension_request) |
| 907 | 879 |
| 908 | 880 |
| 909 def is_compression_extension(extension_name): | 881 def is_compression_extension(extension_name): |
| 910 return extension_name in _compression_extension_names | 882 return extension_name in _compression_extension_names |
| 911 | 883 |
| 912 | 884 |
| 913 # vi:sts=4 sw=4 et | 885 # vi:sts=4 sw=4 et |
| OLD | NEW |