websocket-driver 0.6.3 → 0.6.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e35545d555e0f2a1d4846483ed021aed831be4aa
4
- data.tar.gz: 4fbb5db8194130225cc4130862cec3126729fafe
3
+ metadata.gz: 4cf0e0cdac07ab4b3dd087f8d74b36613f3e9090
4
+ data.tar.gz: 3282dd2b2f10817324192f29966b14be4611a8b9
5
5
  SHA512:
6
- metadata.gz: ddf14ddda68f212cd4453fd0b5e97f8e3b1e0c9741d2bfbb1e6b7b208846cd636b7d73045af9975de3451d7a1c8995e455429e10ea00b3a03026b64d90c44d9f
7
- data.tar.gz: dd0fd4513efe1a75012d942293b751de86e1c45836b3551b54e52044df95c0f005ae50ad2a8a761e79f5e3f1f4ec872d97116c7750ffbb3964f4ca327509abeb
6
+ metadata.gz: b99062bf639a33cf257613632b7f5bf9f08d514c4c7d13de6ee022e62fb749632318c534087b5800b23e958b53389b96d9efb78ca324b3a17089ab13e3817736
7
+ data.tar.gz: 51dff6847b37deb3e0451dfbbfa220ab93fb149215cae124ef4fb94b52974c891c175bbab537ac3d6cc9c6e851e95fe6db805286639bb72051e6b57ca5cd01ad
@@ -1,3 +1,9 @@
1
+ ### 0.6.4 / 2016-05-20
2
+
3
+ * Amend warnings issued when running with -W2
4
+ * Make sure message strings passed in by the app are transcoded to UTF-8
5
+ * Copy strings if necessary for frozen-string compatibility
6
+
1
7
  ### 0.6.3 / 2015-11-06
2
8
 
3
9
  * Reject draft-76 handshakes if their Sec-WebSocket-Key headers are invalid
data/README.md CHANGED
@@ -373,7 +373,7 @@ using the `Sec-WebSocket-Protocol` mechanism. This value becomes available after
373
373
 
374
374
  (The MIT License)
375
375
 
376
- Copyright (c) 2010-2015 James Coglan
376
+ Copyright (c) 2010-2016 James Coglan
377
377
 
378
378
  Permission is hereby granted, free of charge, to any person obtaining a copy of
379
379
  this software and associated documentation files (the 'Software'), to deal in
@@ -33,13 +33,12 @@ module WebSocket
33
33
  end
34
34
  end
35
35
 
36
- unless String.instance_methods.include?(:force_encoding)
37
- require root + '/utf8_match'
38
- end
39
-
40
36
  MAX_LENGTH = 0x3ffffff
41
37
  STATES = [:connecting, :open, :closing, :closed]
42
38
 
39
+ BINARY = 'ASCII-8BIT'
40
+ UNICODE = 'UTF-8'
41
+
43
42
  ConnectEvent = Struct.new(nil)
44
43
  OpenEvent = Struct.new(nil)
45
44
  MessageEvent = Struct.new(:data)
@@ -94,13 +93,14 @@ module WebSocket
94
93
  return false unless @ready_state == 0
95
94
  response = handshake_response
96
95
  return false unless response
97
- @socket.write(Driver.encode(response, :binary))
96
+ @socket.write(response)
98
97
  open unless @stage == -1
99
98
  true
100
99
  end
101
100
 
102
101
  def text(message)
103
- frame(message)
102
+ message = message.encode(UNICODE) unless message.encoding.name == UNICODE
103
+ frame(message, :text)
104
104
  end
105
105
 
106
106
  def binary(message)
@@ -159,14 +159,15 @@ module WebSocket
159
159
  case string
160
160
  when Array then
161
161
  string = string.pack('C*')
162
- encoding ||= :binary
162
+ encoding ||= BINARY
163
163
  when String then
164
- encoding ||= :utf8
164
+ encoding ||= UNICODE
165
+ end
166
+ unless string.encoding.name == encoding
167
+ string = string.dup if string.frozen?
168
+ string.force_encoding(encoding)
165
169
  end
166
- encodings = {:utf8 => 'UTF-8', :binary => 'ASCII-8BIT'}
167
- string.force_encoding(encodings[encoding]) if string.respond_to?(:force_encoding)
168
- return nil if encoding == :utf8 and not valid_utf8?(string)
169
- string
170
+ string.valid_encoding? ? string : nil
170
171
  end
171
172
 
172
173
  def self.validate_options(options, valid_keys)
@@ -177,14 +178,6 @@ module WebSocket
177
178
  end
178
179
  end
179
180
 
180
- def self.valid_utf8?(string)
181
- if defined?(UTF8_MATCH)
182
- UTF8_MATCH =~ string ? true : false
183
- else
184
- string.valid_encoding?
185
- end
186
- end
187
-
188
181
  def self.websocket?(env)
189
182
  connection = env['HTTP_CONNECTION'] || ''
190
183
  upgrade = env['HTTP_UPGRADE'] || ''
@@ -53,7 +53,7 @@ module WebSocket
53
53
 
54
54
  def start
55
55
  return false unless @ready_state == -1
56
- @socket.write(Driver.encode(handshake_request, :binary))
56
+ @socket.write(handshake_request)
57
57
  @ready_state = 0
58
58
  true
59
59
  end
@@ -4,7 +4,9 @@ module WebSocket
4
4
  class Draft75 < Driver
5
5
  def initialize(socket, options = {})
6
6
  super
7
- @stage = 0
7
+
8
+ @stage = 0
9
+ @closing = false
8
10
 
9
11
  @headers['Upgrade'] = 'WebSocket'
10
12
  @headers['Connection'] = 'Upgrade'
@@ -54,7 +56,7 @@ module WebSocket
54
56
  when 2 then
55
57
  if octet == 0xFF
56
58
  @stage = 0
57
- emit(:message, MessageEvent.new(Driver.encode(@buffer, :utf8)))
59
+ emit(:message, MessageEvent.new(Driver.encode(@buffer, UNICODE)))
58
60
  else
59
61
  if @length
60
62
  @skipped += 1
@@ -8,7 +8,7 @@ module WebSocket
8
8
  super
9
9
  input = @socket.env['rack.input']
10
10
  @stage = -1
11
- @body = Driver.encode(input ? input.read : '', :binary)
11
+ @body = (input ? input.read : String.new('')).force_encoding(BINARY)
12
12
 
13
13
  @headers.clear
14
14
  @headers['Upgrade'] = 'WebSocket'
@@ -70,7 +70,7 @@ module WebSocket
70
70
 
71
71
  def send_handshake_body
72
72
  return unless signature = handshake_signature
73
- @socket.write(Driver.encode(signature, :binary))
73
+ @socket.write(signature)
74
74
  @stage = 0
75
75
  open
76
76
  parse(@body[BODY_SIZE..-1]) if @body.bytesize > BODY_SIZE
@@ -64,6 +64,8 @@ module WebSocket
64
64
  @require_masking = options[:require_masking]
65
65
  @ping_callbacks = {}
66
66
 
67
+ @frame = @message = nil
68
+
67
69
  return unless @socket.respond_to?(:env)
68
70
 
69
71
  sec_key = @socket.env['HTTP_SEC_WEBSOCKET_KEY']
@@ -127,10 +129,6 @@ module WebSocket
127
129
  end
128
130
  end
129
131
 
130
- def text(message)
131
- frame(message, :text)
132
- end
133
-
134
132
  def binary(message)
135
133
  frame(message, :binary)
136
134
  end
@@ -201,8 +199,6 @@ module WebSocket
201
199
 
202
200
  def send_frame(frame)
203
201
  length = frame.length
204
- header = (length <= 125) ? 2 : (length <= 65535 ? 4 : 10)
205
- offset = header + (frame.masked ? 4 : 0)
206
202
  buffer = []
207
203
  masked = frame.masked ? MASK : 0
208
204
 
@@ -356,7 +352,7 @@ module WebSocket
356
352
 
357
353
  when OPCODES[:close] then
358
354
  code = (bytesize >= 2) ? payload.unpack(PACK_FORMATS[2]).first : nil
359
- reason = (bytesize > 2) ? Driver.encode(bytes[2..-1] || [], :utf8) : nil
355
+ reason = (bytesize > 2) ? Driver.encode(bytes[2..-1] || [], UNICODE) : nil
360
356
 
361
357
  unless (bytesize == 0) or
362
358
  (code && code >= MIN_RESERVED_ERROR && code <= MAX_RESERVED_ERROR) or
@@ -374,7 +370,7 @@ module WebSocket
374
370
  frame(payload, :pong)
375
371
 
376
372
  when OPCODES[:pong] then
377
- message = Driver.encode(payload, :utf8)
373
+ message = Driver.encode(payload, UNICODE)
378
374
  callback = @ping_callbacks[message]
379
375
  @ping_callbacks.delete(message)
380
376
  callback.call if callback
@@ -391,7 +387,7 @@ module WebSocket
391
387
 
392
388
  case message.opcode
393
389
  when OPCODES[:text] then
394
- payload = Driver.encode(payload, :utf8)
390
+ payload = Driver.encode(payload, UNICODE)
395
391
  when OPCODES[:binary]
396
392
  payload = payload.bytes.to_a
397
393
  end
@@ -14,7 +14,7 @@ module WebSocket
14
14
  @rsv2 = false
15
15
  @rsv3 = false
16
16
  @opcode = nil
17
- @data = Driver.encode('', :binary)
17
+ @data = String.new('').force_encoding(BINARY)
18
18
  end
19
19
 
20
20
  def <<(frame)
@@ -44,7 +44,7 @@ module WebSocket
44
44
  start = "CONNECT #{@origin.host}:#{port} HTTP/1.1"
45
45
  headers = [start, @headers.to_s, '']
46
46
 
47
- @socket.write(Driver.encode(headers.join("\r\n"), :binary))
47
+ @socket.write(headers.join("\r\n"))
48
48
  true
49
49
  end
50
50
 
@@ -58,7 +58,7 @@ module WebSocket
58
58
  end
59
59
 
60
60
  def write(buffer)
61
- @socket.write(Driver.encode(buffer, :binary))
61
+ @socket.write(buffer)
62
62
  end
63
63
 
64
64
  private
@@ -6,13 +6,13 @@ module WebSocket
6
6
  MINIMUM_AUTOMATIC_PRUNE_OFFSET = 128
7
7
 
8
8
  def initialize
9
- @buffer = Driver.encode('', :binary)
9
+ @buffer = String.new('').force_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 << Driver.encode(chunk, :binary)
15
+ @buffer << chunk.force_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 = Driver.encode('', :binary)
45
+ @buffer = String.new('').force_encoding(BINARY)
46
46
  else
47
47
  @buffer = @buffer.byteslice(@offset, buffer_size - @offset)
48
48
  end
@@ -39,6 +39,7 @@ module WebSocket
39
39
 
40
40
  def initialize
41
41
  @buffer = []
42
+ @env = {}
42
43
  @headers = {}
43
44
  @stage = 0
44
45
  end
@@ -75,7 +76,7 @@ module WebSocket
75
76
  error if @stage < 2 and @buffer.size > MAX_LINE_LENGTH
76
77
  end
77
78
  end
78
- @env['rack.input'] = StringIO.new(string_buffer) if @env
79
+ @env['rack.input'] = StringIO.new(string_buffer)
79
80
  end
80
81
 
81
82
  private
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.6.3
4
+ version: 0.6.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Coglan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-06 00:00:00.000000000 Z
11
+ date: 2016-05-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: websocket-extensions
@@ -106,7 +106,6 @@ files:
106
106
  - lib/websocket/driver/proxy.rb
107
107
  - lib/websocket/driver/server.rb
108
108
  - lib/websocket/driver/stream_reader.rb
109
- - lib/websocket/driver/utf8_match.rb
110
109
  - lib/websocket/http.rb
111
110
  - lib/websocket/http/headers.rb
112
111
  - lib/websocket/http/request.rb
@@ -136,7 +135,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
136
135
  version: '0'
137
136
  requirements: []
138
137
  rubyforge_project:
139
- rubygems_version: 2.4.5.1
138
+ rubygems_version: 2.5.1
140
139
  signing_key:
141
140
  specification_version: 4
142
141
  summary: WebSocket protocol handler with pluggable I/O
@@ -1,6 +0,0 @@
1
- module WebSocket
2
- class Driver
3
- # http://www.w3.org/International/questions/qa-forms-utf-8.en.php
4
- UTF8_MATCH = /^([\x00-\x7F]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}|\xED[\x80-\x9F][\x80-\xBF]|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x80-\xBF]{3}|\xF4[\x80-\x8F][\x80-\xBF]{2})*$/
5
- end
6
- end