Clarify behaviour of Driver.encode to convert strings to UTF-8 and arrays to ASCII-8BIT

This commit is contained in:
James Coglan
2021-06-12 16:53:51 +01:00
parent 9a4f2f2d1d
commit 586c27f44e
7 changed files with 25 additions and 27 deletions
+13 -13
View File
@@ -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
View File
@@ -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)
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+3 -3
View File
@@ -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]
+4 -4
View File
@@ -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