websocket-driver 0.7.7-java → 0.8.1-java

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d5ffeea6159c872d68b58d9eed70a8ed87e43bd1e5903f7921757cacb05ef052
4
- data.tar.gz: dcba2e45aaaad54eae0cc9963bef8f2e10c8d789879d5880279dc4db223b644a
3
+ metadata.gz: 51fb8d62186b84c908b815c0ece5099d0d951a3f2a74850f70b58ba2aa5165e5
4
+ data.tar.gz: 3d899c1487db01b89577d2cd29751bf982056ef95e8ee7b651aedee083a174e4
5
5
  SHA512:
6
- metadata.gz: 90870f5824fee414c6827a78a8590a67bc7d62c09aee40ba141a4041eb18d8e24ff960d0a06ca5d49001c20950bf7db759ce773ba3cb2e03036e9f1645e04703
7
- data.tar.gz: 9cbc5fe58827d684b8c2ada9bc40953c4ff02a17d9d61ff48a2346e125413623cd6a122b0d90e28554f710a7345bc63197f594fc06b8ade20d25be8b1338c11c
6
+ metadata.gz: 2df1d2e57d32a7dbb5d8d49a6ef987a4544a1ae01bcd28cc9ebce8bbd984bcb2a3455117850dc1d681ffeddc31578d9ca86ce4b0a55ae148d27f77234480aa16
7
+ data.tar.gz: 23a6a91922d289e12ca9333576016ff8194435aef939806ac927f699ead5b639264161809b7a92e9eccbc27b1b79d3ab07729017fe884f2e04345214f131fdb0
data/CHANGELOG.md CHANGED
@@ -1,3 +1,16 @@
1
+ ### 0.8.1 / 2026-06-04
2
+
3
+ - Close a draft-75/76 connection if a length header grows to exceed the
4
+ configured max length
5
+ - Fail the connection if a message is larger than the configured max length
6
+ after extension processing
7
+ - Limit the total HTTP request line and headers size to 32K
8
+
9
+ ### 0.8.0 / 2025-05-25
10
+
11
+ - Emit binary message as a string with `Encoding::BINARY` instead of an array
12
+ - Add the option `:binary_data_format` to force the previous behaviour
13
+
1
14
  ### 0.7.7 / 2025-01-04
2
15
 
3
16
  - Add `base64` gem to the dependencies to support Ruby 3.4
data/LICENSE.md CHANGED
@@ -1,4 +1,4 @@
1
- Copyright 2010-2025 James Coglan
1
+ Copyright 2010-2026 James Coglan
2
2
 
3
3
  Licensed under the Apache License, Version 2.0 (the "License"); you may not use
4
4
  this file except in compliance with the License. You may obtain a copy of the
data/README.md CHANGED
@@ -275,6 +275,10 @@ keys:
275
275
  - `:protocols` - an array of strings representing acceptable subprotocols for
276
276
  use over the socket. The driver will negotiate one of these to use via the
277
277
  `Sec-WebSocket-Protocol` header if supported by the other peer.
278
+ - `:binary_data_format` - in older versions of this library, binary messages
279
+ were represented as arrays of bytes, whereas they're now represented as
280
+ strings with `Encoding::BINARY` for performance reasons. Set this option to
281
+ `:array` to restore the old behaviour.
278
282
 
279
283
  All drivers respond to the following API methods, but some of them are no-ops
280
284
  depending on whether the client supports the behaviour.
@@ -290,8 +294,8 @@ Adds a callback block to execute when the socket becomes open.
290
294
  #### `driver.on :message, -> (event) {}`
291
295
 
292
296
  Adds a callback block to execute when a message is received. `event` will have a
293
- `data` attribute containing either a string in the case of a text message or an
294
- array of integers in the case of a binary message.
297
+ `data` attribute whose value is a string with the encoding `Encoding::UTF_8` for
298
+ text message, and `Encoding::BINARY` for binary message.
295
299
 
296
300
  #### `driver.on :error, -> (event) {}`
297
301
 
@@ -346,11 +350,12 @@ Sends a text message over the socket. If the socket handshake is not yet
346
350
  complete, the message will be queued until it is. Returns `true` if the message
347
351
  was sent or queued, and `false` if the socket can no longer send messages.
348
352
 
349
- #### `driver.binary(array)`
353
+ #### `driver.binary(buffer)`
350
354
 
351
- Takes an array of byte-sized integers and sends them as a binary message. Will
352
- queue and return `true` or `false` the same way as the `text` method. It will
353
- also return `false` if the driver does not support binary messages.
355
+ Takes either a string with encoding `Encoding::BINARY`, or an array of
356
+ byte-sized integers, and sends it as a binary message. Will queue and return
357
+ `true` or `false` the same way as the `text` method. It will also return `false`
358
+ if the driver does not support binary messages.
354
359
 
355
360
  #### `driver.ping(string = '', &callback)`
356
361
 
@@ -41,6 +41,7 @@ module WebSocket
41
41
 
42
42
  when 1 then
43
43
  @length = (octet & 0x7F) + 128 * @length
44
+ return close if @length > @max_length
44
45
 
45
46
  if @closing and @length.zero?
46
47
  return close
@@ -163,11 +163,13 @@ module WebSocket
163
163
  message = Message.new
164
164
  frame = Frame.new
165
165
 
166
- message.rsv1 = message.rsv2 = message.rsv3 = false
167
- message.opcode = OPCODES[type || (String === buffer ? :text : :binary)]
166
+ is_binary = (Array === buffer or buffer.encoding == Encoding::BINARY)
167
+ payload = Driver.encode(buffer, is_binary ? nil : Encoding::UTF_8)
168
+ payload = [code, payload].pack('S>a*') if code
169
+ type ||= is_binary ? :binary : :text
168
170
 
169
- payload = Driver.encode(buffer)
170
- payload = [code, payload].pack('S>a*') if code
171
+ message.rsv1 = message.rsv2 = message.rsv3 = false
172
+ message.opcode = OPCODES[type]
171
173
  message.data = payload
172
174
 
173
175
  if MESSAGE_OPCODES.include?(message.opcode)
@@ -398,12 +400,20 @@ module WebSocket
398
400
 
399
401
  payload = message.data
400
402
 
403
+ if payload.bytesize > @max_length
404
+ return fail(:too_large, 'WebSocket frame length too large')
405
+ end
406
+
401
407
  case message.opcode
402
408
  when OPCODES[:text] then
403
409
  payload = Driver.encode(payload, Encoding::UTF_8)
404
410
  payload = nil unless payload.valid_encoding?
405
411
  when OPCODES[:binary]
406
- payload = payload.bytes.to_a
412
+ if @binary_data_format == :array
413
+ payload = payload.bytes.to_a
414
+ else
415
+ payload = Driver.encode(payload, Encoding::BINARY)
416
+ end
407
417
  end
408
418
 
409
419
  if payload
@@ -71,7 +71,7 @@ module WebSocket
71
71
 
72
72
  def initialize(socket, options = {})
73
73
  super()
74
- Driver.validate_options(options, [:max_length, :masking, :require_masking, :protocols])
74
+ Driver.validate_options(options, [:max_length, :masking, :require_masking, :protocols, :binary_data_format])
75
75
 
76
76
  @socket = socket
77
77
  @reader = StreamReader.new
@@ -80,6 +80,8 @@ module WebSocket
80
80
  @headers = Headers.new
81
81
  @queue = []
82
82
  @ready_state = 0
83
+
84
+ @binary_data_format = options[:binary_data_format] || :string
83
85
  end
84
86
 
85
87
  def state
@@ -197,17 +199,18 @@ module WebSocket
197
199
 
198
200
  def self.encode(data, encoding = nil)
199
201
  if Array === data
202
+ data = data.pack('C*')
200
203
  encoding ||= Encoding::BINARY
201
- return data.pack('C*').force_encoding(encoding)
202
204
  end
203
205
 
204
- encoding ||= Encoding::UTF_8
205
-
206
- return data if data.encoding == encoding
207
- return data.encode(encoding) unless data.encoding == Encoding::BINARY
206
+ return data if encoding.nil? or data.encoding == encoding
208
207
 
209
- data = data.dup if data.frozen?
210
- data.force_encoding(encoding)
208
+ if data.encoding == Encoding::BINARY
209
+ data = data.dup if data.frozen?
210
+ data.force_encoding(encoding)
211
+ else
212
+ data.encode(encoding)
213
+ end
211
214
  end
212
215
 
213
216
  def self.host_header(uri)
@@ -224,6 +227,12 @@ module WebSocket
224
227
  raise ConfigurationError, "Unrecognized option: #{ key.inspect }"
225
228
  end
226
229
  end
230
+
231
+ if options[:binary_data_format]
232
+ unless [:array, :string].include?(options[:binary_data_format])
233
+ raise ConfigurationError, "Invalid :binary_data_format: #{options[:binary_data_format].inspect}"
234
+ end
235
+ end
227
236
  end
228
237
 
229
238
  def self.websocket?(env)
@@ -2,7 +2,7 @@ module WebSocket
2
2
  module HTTP
3
3
 
4
4
  module Headers
5
- MAX_LINE_LENGTH = 4096
5
+ MAX_REQUEST_SIZE = 32768
6
6
  CR = 0x0D
7
7
  LF = 0x0A
8
8
 
@@ -38,6 +38,7 @@ module WebSocket
38
38
  attr_reader :headers
39
39
 
40
40
  def initialize
41
+ @size = 0
41
42
  @buffer = []
42
43
  @env = {}
43
44
  @headers = {}
@@ -54,6 +55,9 @@ module WebSocket
54
55
 
55
56
  def parse(chunk)
56
57
  chunk.each_byte do |octet|
58
+ @size += 1
59
+ return error if @size > MAX_REQUEST_SIZE
60
+
57
61
  if octet == LF and @stage < 2
58
62
  @buffer.pop if @buffer.last == CR
59
63
  if @buffer.empty?
@@ -71,9 +75,8 @@ module WebSocket
71
75
  end
72
76
  end
73
77
  @buffer = []
74
- else
75
- @buffer << octet if @stage >= 0
76
- error if @stage < 2 and @buffer.size > MAX_LINE_LENGTH
78
+ elsif @stage >= 0
79
+ @buffer << octet
77
80
  end
78
81
  end
79
82
  @env['rack.input'] = StringIO.new(string_buffer)
Binary file
metadata CHANGED
@@ -1,22 +1,21 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: websocket-driver
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.7
4
+ version: 0.8.1
5
5
  platform: java
6
6
  authors:
7
7
  - James Coglan
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2025-01-04 00:00:00.000000000 Z
10
+ date: 2026-06-04 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
13
+ name: base64
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
16
  - - ">="
17
17
  - !ruby/object:Gem::Version
18
18
  version: '0'
19
- name: base64
20
19
  type: :runtime
21
20
  prerelease: false
22
21
  version_requirements: !ruby/object:Gem::Requirement
@@ -25,12 +24,12 @@ dependencies:
25
24
  - !ruby/object:Gem::Version
26
25
  version: '0'
27
26
  - !ruby/object:Gem::Dependency
27
+ name: websocket-extensions
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
32
  version: 0.1.0
33
- name: websocket-extensions
34
33
  type: :runtime
35
34
  prerelease: false
36
35
  version_requirements: !ruby/object:Gem::Requirement
@@ -39,12 +38,12 @@ dependencies:
39
38
  - !ruby/object:Gem::Version
40
39
  version: 0.1.0
41
40
  - !ruby/object:Gem::Dependency
41
+ name: eventmachine
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - ">="
45
45
  - !ruby/object:Gem::Version
46
46
  version: '0'
47
- name: eventmachine
48
47
  type: :development
49
48
  prerelease: false
50
49
  version_requirements: !ruby/object:Gem::Requirement
@@ -53,12 +52,12 @@ dependencies:
53
52
  - !ruby/object:Gem::Version
54
53
  version: '0'
55
54
  - !ruby/object:Gem::Dependency
55
+ name: permessage_deflate
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - ">="
59
59
  - !ruby/object:Gem::Version
60
60
  version: '0'
61
- name: permessage_deflate
62
61
  type: :development
63
62
  prerelease: false
64
63
  version_requirements: !ruby/object:Gem::Requirement
@@ -67,12 +66,12 @@ dependencies:
67
66
  - !ruby/object:Gem::Version
68
67
  version: '0'
69
68
  - !ruby/object:Gem::Dependency
69
+ name: rake-compiler
70
70
  requirement: !ruby/object:Gem::Requirement
71
71
  requirements:
72
72
  - - ">="
73
73
  - !ruby/object:Gem::Version
74
74
  version: '0'
75
- name: rake-compiler
76
75
  type: :development
77
76
  prerelease: false
78
77
  version_requirements: !ruby/object:Gem::Requirement
@@ -81,12 +80,12 @@ dependencies:
81
80
  - !ruby/object:Gem::Version
82
81
  version: '0'
83
82
  - !ruby/object:Gem::Dependency
83
+ name: rspec
84
84
  requirement: !ruby/object:Gem::Requirement
85
85
  requirements:
86
86
  - - ">="
87
87
  - !ruby/object:Gem::Version
88
88
  version: '0'
89
- name: rspec
90
89
  type: :development
91
90
  prerelease: false
92
91
  version_requirements: !ruby/object:Gem::Requirement
@@ -94,7 +93,6 @@ dependencies:
94
93
  - - ">="
95
94
  - !ruby/object:Gem::Version
96
95
  version: '0'
97
- description:
98
96
  email: jcoglan@gmail.com
99
97
  executables: []
100
98
  extensions: []
@@ -129,8 +127,8 @@ files:
129
127
  homepage: https://github.com/faye/websocket-driver-ruby
130
128
  licenses:
131
129
  - Apache-2.0
132
- metadata: {}
133
- post_install_message:
130
+ metadata:
131
+ changelog_uri: https://github.com/faye/websocket-driver-ruby/blob/main/CHANGELOG.md
134
132
  rdoc_options:
135
133
  - "--main"
136
134
  - README.md
@@ -149,8 +147,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
149
147
  - !ruby/object:Gem::Version
150
148
  version: '0'
151
149
  requirements: []
152
- rubygems_version: 3.3.26
153
- signing_key:
150
+ rubygems_version: 3.6.3
154
151
  specification_version: 4
155
152
  summary: WebSocket protocol handler with pluggable I/O
156
153
  test_files: []