Module: Protocol::WebSocket::Extension::Compression
- Defined in:
- lib/protocol/websocket/extension/compression.rb,
lib/protocol/websocket/extension/compression/deflate.rb,
lib/protocol/websocket/extension/compression/inflate.rb,
lib/protocol/websocket/extension/compression/constants.rb
Overview
Provides support for the permessage-deflate extension.
Defined Under Namespace
Constant Summary collapse
- NAME =
"permessage-deflate"- MINIMUM_WINDOW_BITS =
Zlib is not capable of handling < 9 window bits.
9
Class Method Summary collapse
-
.accept(arguments, **options) ⇒ Object
Accept on the client, the negotiated server response.
- .client(connection, **options) ⇒ Object
-
.negotiate(arguments, **options) ⇒ Object
Negotiate on the server a response to client based on the incoming client offer.
-
.offer(client_max_window_bits: true, server_max_window_bits: true, client_no_context_takeover: false, server_no_context_takeover: false) ⇒ Object
Client offer to server, construct a list of requested compression parameters suitable for the ‘Sec-WebSocket-Extensions` header.
- .server(connection, **options) ⇒ Object
Class Method Details
.accept(arguments, **options) ⇒ Object
Accept on the client, the negotiated server response.
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
# File 'lib/protocol/websocket/extension/compression.rb', line 95 def self.accept(arguments, **) arguments.each do |key, value| case key when "server_no_context_takeover" [:server_no_context_takeover] = true when "client_no_context_takeover" [:client_no_context_takeover] = true when "server_max_window_bits" [:server_max_window_bits] = Integer(value || 15) when "client_max_window_bits" [:client_max_window_bits] = Integer(value || 15) else raise ArgumentError, "Unknown option: #{key}!" end end return end |
.client(connection, **options) ⇒ Object
115 116 117 118 119 120 |
# File 'lib/protocol/websocket/extension/compression.rb', line 115 def self.client(connection, **) connection.reserve!(Frame::RSV1) connection.reader = Inflate.client(connection.reader, **) connection.writer = Deflate.client(connection.writer, **) end |
.negotiate(arguments, **options) ⇒ Object
Negotiate on the server a response to client based on the incoming client offer.
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/protocol/websocket/extension/compression.rb', line 54 def self.negotiate(arguments, **) header = [NAME] arguments.each do |key, value| case key when "server_no_context_takeover" [:server_no_context_takeover] = true header << key when "client_no_context_takeover" [:client_no_context_takeover] = true header << key when "server_max_window_bits" value = Integer(value || 15) value = MINIMUM_WINDOW_BITS if value < MINIMUM_WINDOW_BITS [:server_max_window_bits] = value header << "server_max_window_bits=#{value}" when "client_max_window_bits" value = Integer(value || 15) value = MINIMUM_WINDOW_BITS if value < MINIMUM_WINDOW_BITS [:client_max_window_bits] = value header << "client_max_window_bits=#{value}" else raise ArgumentError, "Unknown option: #{key}!" end end # The header which represents the final accepted/negotiated configuration. return header, end |
.offer(client_max_window_bits: true, server_max_window_bits: true, client_no_context_takeover: false, server_no_context_takeover: false) ⇒ Object
Client offer to server, construct a list of requested compression parameters suitable for the ‘Sec-WebSocket-Extensions` header.
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# File 'lib/protocol/websocket/extension/compression.rb', line 18 def self.offer(client_max_window_bits: true, server_max_window_bits: true, client_no_context_takeover: false, server_no_context_takeover: false) header = [NAME] case client_max_window_bits when 8..15 header << "client_max_window_bits=#{client_max_window_bits}" when true header << "client_max_window_bits" else raise ArgumentError, "Invalid local maximum window bits!" end if client_no_context_takeover header << "client_no_context_takeover" end case server_max_window_bits when 8..15 header << "server_max_window_bits=#{server_max_window_bits}" when true # Default (unspecified) to the server maximum window bits. else raise ArgumentError, "Invalid remote maximum window bits!" end if server_no_context_takeover header << "server_no_context_takeover" end return header end |
.server(connection, **options) ⇒ Object
85 86 87 88 89 90 |
# File 'lib/protocol/websocket/extension/compression.rb', line 85 def self.server(connection, **) connection.reserve!(Frame::RSV1) connection.reader = Inflate.server(connection.reader, **) connection.writer = Deflate.server(connection.writer, **) end |