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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f231bfb3b009c97db9669dae0668430688d8e6af5640f86ee412b7509fc62c58
4
- data.tar.gz: 1880a0148936c3d53e00339046ead9fe7e2c03735d80c61aaa116ca75d9bac72
3
+ metadata.gz: cd9397ef6b3c46b55d4f5809f8b359f261b983f5a29442d6cbb9791fb40761d8
4
+ data.tar.gz: 871848fa7118981c4543d4533f4a0a845ff848b5da639e42f16f7f5f6762231a
5
5
  SHA512:
6
- metadata.gz: '083f994aebc32b9912c2d342c3c0c25e595fec12e0cad9398fe88f199ba1b17769bb78c7996b59af5cbc5802dc47856ea7249ae9bd36ad9d205b985caffd572e'
7
- data.tar.gz: c5f427ab36c7678a4a2888026c9c843ab4c4296652966f61f7f90771cbdb521afca083ce85c9ccef50d4fc84dd2e11f404173b14523e5999bc73180265491e0c
6
+ metadata.gz: 1d9b3b03d2ada8d5757d7a2ea189097a2b31b4ffbd980317d88176826aa77db2be291a89d8280533d3e3f79c46997d157c540a2d2ef77f3a80c2d00b5bd7965c
7
+ data.tar.gz: f87b7664488e57fc8e976809b6554dd05cac016961fef21efa7331917bb247be14f24dbe4642ae909e295d1c61dedb5a5e42d44d298b10921acbd3bf4aa69293
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ### 0.7.4 / 2021-05-24
2
+
3
+ - Optimise conversions between strings and byte arrays and related encoding
4
+ operations, to reduce amount of allocation and copying
5
+
1
6
  ### 0.7.3 / 2020-07-09
2
7
 
3
8
  - Let the client accept HTTP responses that have an empty reason phrase
data/LICENSE.md CHANGED
@@ -1,4 +1,4 @@
1
- Copyright 2010-2020 James Coglan
1
+ Copyright 2010-2021 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
@@ -1,4 +1,4 @@
1
- # websocket-driver [![Build Status](https://travis-ci.org/faye/websocket-driver-ruby.svg)](https://travis-ci.org/faye/websocket-driver-ruby)
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
 
@@ -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(UNICODE) unless message.encoding.name == UNICODE
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 ||= UNICODE
203
+ encoding ||= Encoding::UTF_8
207
204
  end
208
- unless string.encoding.name == 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.valid_encoding? ? string : nil
209
+ string
213
210
  end
214
211
 
215
212
  def self.validate_options(options, valid_keys)
@@ -56,7 +56,7 @@ module WebSocket
56
56
  when 2 then
57
57
  if octet == 0xFF
58
58
  @stage = 0
59
- emit(:message, MessageEvent.new(Driver.encode(@buffer, UNICODE)))
59
+ emit(:message, MessageEvent.new(Driver.encode(@buffer, Encoding::UTF_8)))
60
60
  else
61
61
  if @length
62
62
  @skipped += 1
@@ -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 => 'n', 8 => 'Q>' }
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 || (is_text ? :text : :binary)]
165
+ message.opcode = OPCODES[type || (String === buffer ? :text : :binary)]
167
166
 
168
- payload = is_text ? buffer.bytes.to_a : buffer
169
- payload = [code].pack(PACK_FORMATS[2]).bytes.to_a + payload if code
170
- message.data = payload.pack('C*')
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
- buffer = []
196
+ values = []
197
+ format = 'C2'
198
198
  masked = frame.masked ? MASK : 0
199
199
 
200
- buffer[0] = (frame.final ? FIN : 0) |
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
- buffer[1] = masked | length
207
+ values[1] = masked | length
208
208
  elsif length <= 65535
209
- buffer[1] = masked | 126
210
- buffer[2..3] = [length].pack(PACK_FORMATS[2]).bytes.to_a
209
+ values[1] = masked | 126
210
+ values[2] = length
211
+ format << 'S>'
211
212
  else
212
- buffer[1] = masked | 127
213
- buffer[2..9] = [length].pack(PACK_FORMATS[8]).bytes.to_a
213
+ values[1] = masked | 127
214
+ values[2] = length
215
+ format << 'Q>'
214
216
  end
215
217
 
216
218
  if frame.masked
217
- buffer.concat(frame.masking_key.bytes.to_a)
218
- buffer.concat(Mask.mask(frame.payload, frame.masking_key).bytes.to_a)
219
+ values << frame.masking_key
220
+ values << Mask.mask(frame.payload, frame.masking_key)
221
+ format << 'a4a*'
219
222
  else
220
- buffer.concat(frame.payload.bytes.to_a)
223
+ values << frame.payload
224
+ format << 'a*'
221
225
  end
222
226
 
223
- @socket.write(buffer.pack('C*'))
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 = (bytesize >= 2) ? payload.unpack(PACK_FORMATS[2]).first : nil
361
- reason = (bytesize > 2) ? Driver.encode(bytes[2..-1] || [], UNICODE) : nil
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 (bytesize > 2 and reason.nil?)
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, UNICODE)
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, UNICODE)
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
@@ -14,7 +14,7 @@ module WebSocket
14
14
  @rsv2 = false
15
15
  @rsv3 = false
16
16
  @opcode = nil
17
- @data = String.new('').force_encoding(BINARY)
17
+ @data = String.new('').force_encoding(Encoding::BINARY)
18
18
  end
19
19
 
20
20
  def <<(frame)
@@ -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.3
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: 2020-07-09 00:00:00.000000000 Z
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