diff --git a/lib/websocket/driver.rb b/lib/websocket/driver.rb index 2b592d1..2f52d53 100644 --- a/lib/websocket/driver.rb +++ b/lib/websocket/driver.rb @@ -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) diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 78478bf..c088ba4 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -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) diff --git a/spec/websocket/driver/client_spec.rb b/spec/websocket/driver/client_spec.rb index 3588670..e19e595 100644 --- a/spec/websocket/driver/client_spec.rb +++ b/spec/websocket/driver/client_spec.rb @@ -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 diff --git a/spec/websocket/driver/draft75_examples.rb b/spec/websocket/driver/draft75_examples.rb index 31af3f4..35b5590 100644 --- a/spec/websocket/driver/draft75_examples.rb +++ b/spec/websocket/driver/draft75_examples.rb @@ -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 diff --git a/spec/websocket/driver/draft75_spec.rb b/spec/websocket/driver/draft75_spec.rb index 1ed7156..acb7adf 100644 --- a/spec/websocket/driver/draft75_spec.rb +++ b/spec/websocket/driver/draft75_spec.rb @@ -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 diff --git a/spec/websocket/driver/draft76_spec.rb b/spec/websocket/driver/draft76_spec.rb index 6563749..f9f3f1d 100644 --- a/spec/websocket/driver/draft76_spec.rb +++ b/spec/websocket/driver/draft76_spec.rb @@ -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] diff --git a/spec/websocket/driver/hybi_spec.rb b/spec/websocket/driver/hybi_spec.rb index 1152cb9..fc81bbf 100644 --- a/spec/websocket/driver/hybi_spec.rb +++ b/spec/websocket/driver/hybi_spec.rb @@ -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