mirror of
https://github.com/faye/websocket-driver-ruby.git
synced 2025-11-01 13:59:38 +00:00
Clarify behaviour of Driver.encode to convert strings to UTF-8 and arrays to ASCII-8BIT
This commit is contained in:
+13
-13
@@ -115,7 +115,7 @@ module WebSocket
|
||||
end
|
||||
|
||||
def text(message)
|
||||
message = message.encode(Encoding::UTF_8) unless message.encoding == Encoding::UTF_8
|
||||
message = Driver.encode(message, Encoding::UTF_8)
|
||||
frame(message, :text)
|
||||
end
|
||||
|
||||
@@ -194,19 +194,19 @@ module WebSocket
|
||||
end
|
||||
end
|
||||
|
||||
def self.encode(string, encoding = nil)
|
||||
case string
|
||||
when Array then
|
||||
string = string.pack('C*')
|
||||
encoding ||= Encoding::BINARY
|
||||
when String then
|
||||
encoding ||= string.encoding
|
||||
def self.encode(data, encoding = nil)
|
||||
if Array === data
|
||||
encoding ||= Encoding::BINARY
|
||||
return data.pack('C*').force_encoding(encoding)
|
||||
end
|
||||
unless string.encoding == encoding
|
||||
string = string.dup if string.frozen?
|
||||
string.force_encoding(encoding)
|
||||
end
|
||||
string
|
||||
|
||||
encoding ||= Encoding::UTF_8
|
||||
|
||||
return data if data.encoding == encoding
|
||||
return data.encode(encoding) unless data.encoding == Encoding::BINARY
|
||||
|
||||
data = data.dup if data.frozen?
|
||||
data.force_encoding(encoding)
|
||||
end
|
||||
|
||||
def self.validate_options(options, valid_keys)
|
||||
|
||||
+2
-4
@@ -4,10 +4,8 @@ require File.expand_path('../../lib/websocket/driver', __FILE__)
|
||||
require File.expand_path('../websocket/driver/draft75_examples', __FILE__)
|
||||
|
||||
module EncodingHelper
|
||||
def encode(message)
|
||||
message.respond_to?(:force_encoding) ?
|
||||
message.force_encoding(Encoding::UTF_8) :
|
||||
message
|
||||
def encode(message, encoding = nil)
|
||||
WebSocket::Driver.encode(message, encoding)
|
||||
end
|
||||
|
||||
def bytes(string)
|
||||
|
||||
@@ -230,7 +230,7 @@ describe WebSocket::Driver::Client do
|
||||
|
||||
describe "with a valid response followed by a frame" do
|
||||
before do
|
||||
resp = response + WebSocket::Driver.encode([0x81, 0x02, 72, 105])
|
||||
resp = response + encode([0x81, 0x02, 72, 105])
|
||||
driver.parse(resp)
|
||||
end
|
||||
|
||||
|
||||
@@ -72,7 +72,7 @@ shared_examples_for "draft-75 protocol" do
|
||||
end
|
||||
|
||||
it "encodes multibyte characters correctly" do
|
||||
message = encode "Apple = "
|
||||
message = encode("Apple = ")
|
||||
driver.frame message
|
||||
expect(@bytes).to eq [0x00, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0xef, 0xa3, 0xbf, 0xff]
|
||||
end
|
||||
|
||||
@@ -90,7 +90,7 @@ describe WebSocket::Driver::Draft75 do
|
||||
"WebSocket-Origin: http://www.example.com\r\n" +
|
||||
"WebSocket-Location: ws://www.example.com/socket\r\n" +
|
||||
"\r\n")
|
||||
expect(socket).to receive(:write).with(WebSocket::Driver.encode "\x00Hi\xFF", Encoding::BINARY)
|
||||
expect(socket).to receive(:write).with(encode "\x00Hi\xFF".bytes)
|
||||
|
||||
driver.frame("Hi")
|
||||
driver.start
|
||||
|
||||
@@ -6,7 +6,7 @@ describe WebSocket::Driver::Draft76 do
|
||||
include EncodingHelper
|
||||
|
||||
let :body do
|
||||
WebSocket::Driver.encode [0x91, 0x25, 0x3e, 0xd3, 0xa9, 0xe7, 0x6a, 0x88]
|
||||
encode [0x91, 0x25, 0x3e, 0xd3, 0xa9, 0xe7, 0x6a, 0x88]
|
||||
end
|
||||
|
||||
let :response do
|
||||
@@ -142,7 +142,7 @@ describe WebSocket::Driver::Draft76 do
|
||||
"Sec-WebSocket-Location: ws://www.example.com/socket\r\n" +
|
||||
"\r\n")
|
||||
expect(socket).to receive(:write).with(response)
|
||||
expect(socket).to receive(:write).with(WebSocket::Driver.encode "\x00Hi\xFF", Encoding::BINARY)
|
||||
expect(socket).to receive(:write).with(encode "\x00Hi\xFF".bytes)
|
||||
|
||||
driver.frame("Hi")
|
||||
driver.start
|
||||
@@ -196,7 +196,7 @@ describe WebSocket::Driver::Draft76 do
|
||||
|
||||
it "sends any frames queued before the handshake was complete" do
|
||||
expect(socket).to receive(:write).with(response)
|
||||
expect(socket).to receive(:write).with(WebSocket::Driver.encode "\x00hello\xFF", Encoding::BINARY)
|
||||
expect(socket).to receive(:write).with(encode "\x00hello\xFF".bytes)
|
||||
driver.frame("hello")
|
||||
driver.parse(body)
|
||||
expect(@bytes).to eq [0, 104, 101, 108, 108, 111, 255]
|
||||
|
||||
@@ -171,7 +171,7 @@ describe WebSocket::Driver::Hybi do
|
||||
"Connection: Upgrade\r\n" +
|
||||
"Sec-WebSocket-Accept: JdiiuafpBKRqD7eol0y4vJDTsTs=\r\n" +
|
||||
"\r\n")
|
||||
expect(socket).to receive(:write).with(WebSocket::Driver.encode [0x81, 0x02, 72, 105])
|
||||
expect(socket).to receive(:write).with(encode [0x81, 0x02, 72, 105])
|
||||
|
||||
driver.frame("Hi")
|
||||
driver.start
|
||||
@@ -195,7 +195,7 @@ describe WebSocket::Driver::Hybi do
|
||||
"Connection: Upgrade\r\n" +
|
||||
"Sec-WebSocket-Accept: JdiiuafpBKRqD7eol0y4vJDTsTs=\r\n" +
|
||||
"\r\n")
|
||||
expect(socket).to receive(:write).with(WebSocket::Driver.encode [0x89, 0])
|
||||
expect(socket).to receive(:write).with(encode [0x89, 0])
|
||||
|
||||
driver.ping
|
||||
driver.start
|
||||
@@ -219,7 +219,7 @@ describe WebSocket::Driver::Hybi do
|
||||
"Connection: Upgrade\r\n" +
|
||||
"Sec-WebSocket-Accept: JdiiuafpBKRqD7eol0y4vJDTsTs=\r\n" +
|
||||
"\r\n")
|
||||
expect(socket).to receive(:write).with(WebSocket::Driver.encode [0x8a, 0])
|
||||
expect(socket).to receive(:write).with(encode [0x8a, 0])
|
||||
|
||||
driver.pong
|
||||
driver.start
|
||||
@@ -410,7 +410,7 @@ describe WebSocket::Driver::Hybi do
|
||||
end
|
||||
|
||||
it "encodes multibyte characters correctly" do
|
||||
message = encode "Apple = "
|
||||
message = encode("Apple = ")
|
||||
driver.frame message
|
||||
expect(@bytes).to eq [0x81, 0x0b, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0xef, 0xa3, 0xbf]
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user