websocket-driver 0.7.3-java → 0.7.4-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 +4 -4
- data/CHANGELOG.md +5 -0
- data/LICENSE.md +1 -1
- data/README.md +11 -2
- data/lib/websocket/driver.rb +5 -8
- data/lib/websocket/driver/draft75.rb +1 -1
- data/lib/websocket/driver/draft76.rb +1 -1
- data/lib/websocket/driver/hybi.rb +27 -23
- data/lib/websocket/driver/hybi/message.rb +1 -1
- data/lib/websocket/driver/stream_reader.rb +3 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cd9397ef6b3c46b55d4f5809f8b359f261b983f5a29442d6cbb9791fb40761d8
|
4
|
+
data.tar.gz: 871848fa7118981c4543d4533f4a0a845ff848b5da639e42f16f7f5f6762231a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1d9b3b03d2ada8d5757d7a2ea189097a2b31b4ffbd980317d88176826aa77db2be291a89d8280533d3e3f79c46997d157c540a2d2ef77f3a80c2d00b5bd7965c
|
7
|
+
data.tar.gz: f87b7664488e57fc8e976809b6554dd05cac016961fef21efa7331917bb247be14f24dbe4642ae909e295d1c61dedb5a5e42d44d298b10921acbd3bf4aa69293
|
data/CHANGELOG.md
CHANGED
data/LICENSE.md
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# websocket-driver
|
1
|
+
# websocket-driver
|
2
2
|
|
3
3
|
This module provides a complete implementation of the WebSocket protocols that
|
4
4
|
can be hooked up to any TCP library. It aims to simplify things by decoupling
|
@@ -150,7 +150,16 @@ module Connection
|
|
150
150
|
if WebSocket::Driver.websocket?(@driver.env)
|
151
151
|
@driver.start
|
152
152
|
else
|
153
|
-
# handle other HTTP requests
|
153
|
+
# handle other HTTP requests, for example
|
154
|
+
body = '<h1>hello</h1>'
|
155
|
+
response = [
|
156
|
+
'HTTP/1.1 200 OK',
|
157
|
+
'Content-Type: text/plain',
|
158
|
+
"Content-Length: #{body.bytesize}",
|
159
|
+
'',
|
160
|
+
body
|
161
|
+
]
|
162
|
+
send_data response.join("\r\n")
|
154
163
|
end
|
155
164
|
end
|
156
165
|
|
data/lib/websocket/driver.rb
CHANGED
@@ -44,9 +44,6 @@ module WebSocket
|
|
44
44
|
MAX_LENGTH = 0x3ffffff
|
45
45
|
STATES = [:connecting, :open, :closing, :closed]
|
46
46
|
|
47
|
-
BINARY = 'ASCII-8BIT'
|
48
|
-
UNICODE = 'UTF-8'
|
49
|
-
|
50
47
|
ConnectEvent = Struct.new(nil)
|
51
48
|
OpenEvent = Struct.new(nil)
|
52
49
|
MessageEvent = Struct.new(:data)
|
@@ -118,7 +115,7 @@ module WebSocket
|
|
118
115
|
end
|
119
116
|
|
120
117
|
def text(message)
|
121
|
-
message = message.encode(
|
118
|
+
message = message.encode(Encoding::UTF_8) unless message.encoding == Encoding::UTF_8
|
122
119
|
frame(message, :text)
|
123
120
|
end
|
124
121
|
|
@@ -201,15 +198,15 @@ module WebSocket
|
|
201
198
|
case string
|
202
199
|
when Array then
|
203
200
|
string = string.pack('C*')
|
204
|
-
encoding ||= BINARY
|
201
|
+
encoding ||= Encoding::BINARY
|
205
202
|
when String then
|
206
|
-
encoding ||=
|
203
|
+
encoding ||= Encoding::UTF_8
|
207
204
|
end
|
208
|
-
unless string.encoding
|
205
|
+
unless string.encoding == encoding
|
209
206
|
string = string.dup if string.frozen?
|
210
207
|
string.force_encoding(encoding)
|
211
208
|
end
|
212
|
-
string
|
209
|
+
string
|
213
210
|
end
|
214
211
|
|
215
212
|
def self.validate_options(options, valid_keys)
|
@@ -9,7 +9,7 @@ module WebSocket
|
|
9
9
|
input = (@socket.env['rack.input'] || StringIO.new('')).read
|
10
10
|
input = input.dup if input.frozen?
|
11
11
|
@stage = -1
|
12
|
-
@body = input.force_encoding(BINARY)
|
12
|
+
@body = input.force_encoding(Encoding::BINARY)
|
13
13
|
|
14
14
|
@headers.clear
|
15
15
|
@headers['Upgrade'] = 'WebSocket'
|
@@ -52,7 +52,7 @@ module WebSocket
|
|
52
52
|
MIN_RESERVED_ERROR = 3000
|
53
53
|
MAX_RESERVED_ERROR = 4999
|
54
54
|
|
55
|
-
PACK_FORMATS = { 2 => '
|
55
|
+
PACK_FORMATS = { 2 => 'S>', 8 => 'Q>' }
|
56
56
|
|
57
57
|
def initialize(socket, options = {})
|
58
58
|
super
|
@@ -160,14 +160,13 @@ module WebSocket
|
|
160
160
|
|
161
161
|
message = Message.new
|
162
162
|
frame = Frame.new
|
163
|
-
is_text = String === buffer
|
164
163
|
|
165
164
|
message.rsv1 = message.rsv2 = message.rsv3 = false
|
166
|
-
message.opcode = OPCODES[type || (
|
165
|
+
message.opcode = OPCODES[type || (String === buffer ? :text : :binary)]
|
167
166
|
|
168
|
-
payload =
|
169
|
-
payload = [code].pack(
|
170
|
-
message.data = payload
|
167
|
+
payload = Driver.encode(buffer, Encoding::BINARY)
|
168
|
+
payload = [code, payload].pack('S>a*') if code
|
169
|
+
message.data = payload
|
171
170
|
|
172
171
|
if MESSAGE_OPCODES.include?(message.opcode)
|
173
172
|
message = @extensions.process_outgoing_message(message)
|
@@ -194,33 +193,38 @@ module WebSocket
|
|
194
193
|
|
195
194
|
def send_frame(frame)
|
196
195
|
length = frame.length
|
197
|
-
|
196
|
+
values = []
|
197
|
+
format = 'C2'
|
198
198
|
masked = frame.masked ? MASK : 0
|
199
199
|
|
200
|
-
|
200
|
+
values[0] = (frame.final ? FIN : 0) |
|
201
201
|
(frame.rsv1 ? RSV1 : 0) |
|
202
202
|
(frame.rsv2 ? RSV2 : 0) |
|
203
203
|
(frame.rsv3 ? RSV3 : 0) |
|
204
204
|
frame.opcode
|
205
205
|
|
206
206
|
if length <= 125
|
207
|
-
|
207
|
+
values[1] = masked | length
|
208
208
|
elsif length <= 65535
|
209
|
-
|
210
|
-
|
209
|
+
values[1] = masked | 126
|
210
|
+
values[2] = length
|
211
|
+
format << 'S>'
|
211
212
|
else
|
212
|
-
|
213
|
-
|
213
|
+
values[1] = masked | 127
|
214
|
+
values[2] = length
|
215
|
+
format << 'Q>'
|
214
216
|
end
|
215
217
|
|
216
218
|
if frame.masked
|
217
|
-
|
218
|
-
|
219
|
+
values << frame.masking_key
|
220
|
+
values << Mask.mask(frame.payload, frame.masking_key)
|
221
|
+
format << 'a4a*'
|
219
222
|
else
|
220
|
-
|
223
|
+
values << frame.payload
|
224
|
+
format << 'a*'
|
221
225
|
end
|
222
226
|
|
223
|
-
@socket.write(
|
227
|
+
@socket.write(values.pack(format))
|
224
228
|
end
|
225
229
|
|
226
230
|
def handshake_response
|
@@ -343,7 +347,6 @@ module WebSocket
|
|
343
347
|
opcode = frame.opcode
|
344
348
|
payload = frame.payload = Mask.mask(buffer, @frame.masking_key)
|
345
349
|
bytesize = payload.bytesize
|
346
|
-
bytes = payload.bytes.to_a
|
347
350
|
|
348
351
|
@frame = nil
|
349
352
|
|
@@ -357,8 +360,8 @@ module WebSocket
|
|
357
360
|
@message << frame
|
358
361
|
|
359
362
|
when OPCODES[:close] then
|
360
|
-
code
|
361
|
-
reason =
|
363
|
+
code, reason = payload.unpack('S>a*') if bytesize >= 2
|
364
|
+
reason = Driver.encode(reason || '', Encoding::UTF_8)
|
362
365
|
|
363
366
|
unless (bytesize == 0) or
|
364
367
|
(code && code >= MIN_RESERVED_ERROR && code <= MAX_RESERVED_ERROR) or
|
@@ -366,7 +369,7 @@ module WebSocket
|
|
366
369
|
code = ERRORS[:protocol_error]
|
367
370
|
end
|
368
371
|
|
369
|
-
if bytesize > 125 or
|
372
|
+
if bytesize > 125 or !reason.valid_encoding?
|
370
373
|
code = ERRORS[:protocol_error]
|
371
374
|
end
|
372
375
|
|
@@ -377,7 +380,7 @@ module WebSocket
|
|
377
380
|
emit(:ping, PingEvent.new(payload))
|
378
381
|
|
379
382
|
when OPCODES[:pong] then
|
380
|
-
message = Driver.encode(payload,
|
383
|
+
message = Driver.encode(payload, Encoding::UTF_8)
|
381
384
|
callback = @ping_callbacks[message]
|
382
385
|
@ping_callbacks.delete(message)
|
383
386
|
callback.call if callback
|
@@ -395,7 +398,8 @@ module WebSocket
|
|
395
398
|
|
396
399
|
case message.opcode
|
397
400
|
when OPCODES[:text] then
|
398
|
-
payload = Driver.encode(payload,
|
401
|
+
payload = Driver.encode(payload, Encoding::UTF_8)
|
402
|
+
payload = nil unless payload.valid_encoding?
|
399
403
|
when OPCODES[:binary]
|
400
404
|
payload = payload.bytes.to_a
|
401
405
|
end
|
@@ -6,13 +6,13 @@ module WebSocket
|
|
6
6
|
MINIMUM_AUTOMATIC_PRUNE_OFFSET = 128
|
7
7
|
|
8
8
|
def initialize
|
9
|
-
@buffer = String.new('').force_encoding(BINARY)
|
9
|
+
@buffer = String.new('').force_encoding(Encoding::BINARY)
|
10
10
|
@offset = 0
|
11
11
|
end
|
12
12
|
|
13
13
|
def put(chunk)
|
14
14
|
return unless chunk and chunk.bytesize > 0
|
15
|
-
@buffer << chunk.force_encoding(BINARY)
|
15
|
+
@buffer << chunk.force_encoding(Encoding::BINARY)
|
16
16
|
end
|
17
17
|
|
18
18
|
# Read bytes from the data:
|
@@ -42,7 +42,7 @@ module WebSocket
|
|
42
42
|
buffer_size = @buffer.bytesize
|
43
43
|
|
44
44
|
if @offset > buffer_size
|
45
|
-
@buffer = String.new('').force_encoding(BINARY)
|
45
|
+
@buffer = String.new('').force_encoding(Encoding::BINARY)
|
46
46
|
else
|
47
47
|
@buffer = @buffer.byteslice(@offset, buffer_size - @offset)
|
48
48
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: websocket-driver
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.4
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- James Coglan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-05-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|