diff options
-rw-r--r-- | net/websockets/websocket_job.cc | 14 | ||||
-rw-r--r-- | net/websockets/websocket_job_unittest.cc | 45 |
2 files changed, 54 insertions, 5 deletions
diff --git a/net/websockets/websocket_job.cc b/net/websockets/websocket_job.cc index 6e20c17..2f6d4a2 100644 --- a/net/websockets/websocket_job.cc +++ b/net/websockets/websocket_job.cc @@ -331,12 +331,16 @@ void WebSocketJob::OnCanGetCookiesCompleted(int policy) { } } - // Simply ignore rest data in original request header after - // original_handshake_request_header_length_, because websocket protocol - // doesn't allow sending message before handshake is completed. - // TODO(ukai): report as error? + // draft-hixie-thewebsocketprotocol-76 or later will send /key3/ + // after handshake request header. + std::string additional_data = + std::string(original_handshake_request_.data() + + original_handshake_request_header_length_, + original_handshake_request_.size() - + original_handshake_request_header_length_); handshake_request_ = - handshake_request_status_line + handshake_request_header + "\r\n"; + handshake_request_status_line + handshake_request_header + "\r\n" + + additional_data; handshake_request_sent_ = 0; socket_->SendData(handshake_request_.data(), diff --git a/net/websockets/websocket_job_unittest.cc b/net/websockets/websocket_job_unittest.cc index 8a32be0..cadadc1 100644 --- a/net/websockets/websocket_job_unittest.cc +++ b/net/websockets/websocket_job_unittest.cc @@ -283,6 +283,51 @@ TEST_F(WebSocketJobTest, SimpleHandshake) { CloseWebSocketJob(); } +TEST_F(WebSocketJobTest, SimpleHandshakeDraft76) { + GURL url("ws://example.com/demo"); + MockSocketStreamDelegate delegate; + InitWebSocketJob(url, &delegate); + + static const char* kHandshakeRequestMessage = + "GET /demo HTTP/1.1\r\n" + "Host: example.com\r\n" + "Connection: Upgrade\r\n" + "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n" + "Sec-WebSocket-Protocol: sample\r\n" + "Upgrade: WebSocket\r\n" + "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n" + "Origin: http://example.com\r\n" + "\r\n" + "^n:ds[4U"; + + bool sent = websocket_->SendData(kHandshakeRequestMessage, + strlen(kHandshakeRequestMessage)); + EXPECT_EQ(true, sent); + MessageLoop::current()->RunAllPending(); + EXPECT_EQ(kHandshakeRequestMessage, socket_->sent_data()); + EXPECT_EQ(WebSocketJob::CONNECTING, GetWebSocketJobState()); + websocket_->OnSentData(socket_.get(), strlen(kHandshakeRequestMessage)); + EXPECT_EQ(strlen(kHandshakeRequestMessage), delegate.amount_sent()); + + const char kHandshakeResponseMessage[] = + "HTTP/1.1 101 WebSocket Protocol Handshake\r\n" + "Upgrade: WebSocket\r\n" + "Connection: Upgrade\r\n" + "Sec-WebSocket-Origin: http://example.com\r\n" + "Sec-WebSocket-Location: ws://example.com/demo\r\n" + "Sec-WebSocket-Protocol: sample\r\n" + "\r\n" + "8jKS'y:G*Co,Wxa-"; + + websocket_->OnReceivedData(socket_.get(), + kHandshakeResponseMessage, + strlen(kHandshakeResponseMessage)); + MessageLoop::current()->RunAllPending(); + EXPECT_EQ(kHandshakeResponseMessage, delegate.received_data()); + EXPECT_EQ(WebSocketJob::OPEN, GetWebSocketJobState()); + CloseWebSocketJob(); +} + TEST_F(WebSocketJobTest, SlowHandshake) { GURL url("ws://example.com/demo"); MockSocketStreamDelegate delegate; |