Index: net/websockets/websocket_handshake_handler_unittest.cc |
diff --git a/net/websockets/websocket_handshake_handler_unittest.cc b/net/websockets/websocket_handshake_handler_unittest.cc |
index 8bac084a28e0d462ffa205870cf8a92d5364162e..4204d6ad6ebc75de757d88dd211ab0a0ab16dca7 100644 |
--- a/net/websockets/websocket_handshake_handler_unittest.cc |
+++ b/net/websockets/websocket_handshake_handler_unittest.cc |
@@ -151,7 +151,7 @@ TEST(WebSocketHandshakeResponseHandlerTest, ReplaceResponseCookies) { |
EXPECT_EQ(kHandshakeResponseExpectedMessage, handler.GetResponse()); |
} |
-TEST(WebSocketHandshakeHandlerTest, RequestResponse) { |
+TEST(WebSocketHandshakeHandlerTest, HttpRequestResponse) { |
WebSocketHandshakeRequestHandler request_handler; |
static const char* kHandshakeRequestMessage = |
@@ -233,4 +233,148 @@ TEST(WebSocketHandshakeHandlerTest, RequestResponse) { |
EXPECT_EQ(kHandshakeResponseExpectedMessage, response_handler.GetResponse()); |
} |
+TEST(WebSocketHandshakeHandlerTest, SpdyRequestResponse) { |
+ WebSocketHandshakeRequestHandler request_handler; |
+ |
+ 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" |
+ "X-bogus-header: X\r\n" |
+ "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n" |
+ "Origin: http://example.com\r\n" |
+ "X-bogus-header: Y\r\n" |
+ "\r\n" |
+ "^n:ds[4U"; |
+ |
+ EXPECT_TRUE(request_handler.ParseRequest(kHandshakeRequestMessage, |
+ strlen(kHandshakeRequestMessage))); |
+ |
+ GURL url("ws://example.com/demo"); |
+ std::string challenge; |
+ spdy::SpdyHeaderBlock headers; |
+ ASSERT_TRUE(request_handler.GetRequestHeaderBlock(url, &headers, &challenge)); |
+ |
+ EXPECT_EQ(url.spec(), headers["url"]); |
+ EXPECT_TRUE(headers.find("upgrade") == headers.end()); |
+ EXPECT_TRUE(headers.find("Upgrade") == headers.end()); |
+ EXPECT_TRUE(headers.find("connection") == headers.end()); |
+ EXPECT_TRUE(headers.find("Connection") == headers.end()); |
+ EXPECT_TRUE(headers.find("Sec-WebSocket-Key1") == headers.end()); |
+ EXPECT_TRUE(headers.find("sec-websocket-key1") == headers.end()); |
+ EXPECT_TRUE(headers.find("Sec-WebSocket-Key2") == headers.end()); |
+ EXPECT_TRUE(headers.find("sec-websocket-key2") == headers.end()); |
+ EXPECT_EQ("example.com", headers["host"]); |
+ EXPECT_EQ("http://example.com", headers["origin"]); |
+ EXPECT_EQ("sample", headers["sec-websocket-protocol"]); |
+ const char bogus_header[] = "X\0Y"; |
+ std::string bogus_header_str(bogus_header, sizeof(bogus_header) - 1); |
+ EXPECT_EQ(bogus_header_str, headers["x-bogus-header"]); |
+ |
+ const char expected_challenge[] = "\x31\x6e\x41\x13\x0f\x7e\xd6\x3c^n:ds[4U"; |
+ |
+ EXPECT_EQ(expected_challenge, challenge); |
+ |
+ headers.clear(); |
+ |
+ headers["sec-websocket-origin"] = "http://example.com"; |
+ headers["sec-websocket-location"] = "ws://example.com/demo"; |
+ headers["sec-websocket-protocol"] = "sample"; |
+ |
+ WebSocketHandshakeResponseHandler response_handler; |
+ EXPECT_TRUE(response_handler.ParseResponseHeaderBlock(headers, challenge)); |
+ EXPECT_TRUE(response_handler.HasResponse()); |
+ |
+ // Note that order of sec-websocket-* is sensitive with hash_map order. |
+ static const char* kHandshakeResponseExpectedMessage = |
+ "HTTP/1.1 101 WebSocket Protocol Handshake\r\n" |
+ "Upgrade: WebSocket\r\n" |
+ "Connection: Upgrade\r\n" |
+ "sec-websocket-location: ws://example.com/demo\r\n" |
Yuta Kitamura
2010/06/29 09:09:08
Why these header names are all lower-case? Is it r
ukai
2010/06/29 09:14:18
These comes from spdy and we'll use lower case fie
Yuta Kitamura
2010/06/29 09:20:33
I know it's valid, but I'm a bit worried about Web
|
+ "sec-websocket-origin: http://example.com\r\n" |
+ "sec-websocket-protocol: sample\r\n" |
+ "\r\n" |
+ "8jKS'y:G*Co,Wxa-"; |
+ |
+ EXPECT_EQ(kHandshakeResponseExpectedMessage, response_handler.GetResponse()); |
+} |
+ |
+ |
+TEST(WebSocketHandshakeHandlerTest, SpdyRequestResponseWithCookies) { |
+ WebSocketHandshakeRequestHandler request_handler; |
+ |
+ // Note that websocket won't use multiple headers in request now. |
+ 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" |
+ "Cookie: WK-websocket-test=1; WK-websocket-test-httponly=1\r\n" |
+ "\r\n" |
+ "^n:ds[4U"; |
+ |
+ EXPECT_TRUE(request_handler.ParseRequest(kHandshakeRequestMessage, |
+ strlen(kHandshakeRequestMessage))); |
+ |
+ GURL url("ws://example.com/demo"); |
+ std::string challenge; |
+ spdy::SpdyHeaderBlock headers; |
+ ASSERT_TRUE(request_handler.GetRequestHeaderBlock(url, &headers, &challenge)); |
+ |
+ EXPECT_EQ(url.spec(), headers["url"]); |
+ EXPECT_TRUE(headers.find("upgrade") == headers.end()); |
+ EXPECT_TRUE(headers.find("Upgrade") == headers.end()); |
+ EXPECT_TRUE(headers.find("connection") == headers.end()); |
+ EXPECT_TRUE(headers.find("Connection") == headers.end()); |
+ EXPECT_TRUE(headers.find("Sec-WebSocket-Key1") == headers.end()); |
+ EXPECT_TRUE(headers.find("sec-websocket-key1") == headers.end()); |
+ EXPECT_TRUE(headers.find("Sec-WebSocket-Key2") == headers.end()); |
+ EXPECT_TRUE(headers.find("sec-websocket-key2") == headers.end()); |
+ EXPECT_EQ("example.com", headers["host"]); |
+ EXPECT_EQ("http://example.com", headers["origin"]); |
+ EXPECT_EQ("sample", headers["sec-websocket-protocol"]); |
+ EXPECT_EQ("WK-websocket-test=1; WK-websocket-test-httponly=1", |
+ headers["cookie"]); |
+ |
+ const char expected_challenge[] = "\x31\x6e\x41\x13\x0f\x7e\xd6\x3c^n:ds[4U"; |
+ |
+ EXPECT_EQ(expected_challenge, challenge); |
+ |
+ headers.clear(); |
+ |
+ headers["sec-websocket-origin"] = "http://example.com"; |
+ headers["sec-websocket-location"] = "ws://example.com/demo"; |
+ headers["sec-websocket-protocol"] = "sample"; |
+ std::string cookie = "WK-websocket-test=1"; |
+ cookie.append(1, '\0'); |
+ cookie += "WK-websocket-test-httponly=1; HttpOnly"; |
+ headers["set-cookie"] = cookie; |
+ |
+ WebSocketHandshakeResponseHandler response_handler; |
+ EXPECT_TRUE(response_handler.ParseResponseHeaderBlock(headers, challenge)); |
+ EXPECT_TRUE(response_handler.HasResponse()); |
+ |
+ // Note that order of sec-websocket-* is sensitive with hash_map order. |
+ static const char* kHandshakeResponseExpectedMessage = |
+ "HTTP/1.1 101 WebSocket Protocol Handshake\r\n" |
+ "Upgrade: WebSocket\r\n" |
+ "Connection: Upgrade\r\n" |
+ "sec-websocket-location: ws://example.com/demo\r\n" |
+ "sec-websocket-origin: http://example.com\r\n" |
+ "sec-websocket-protocol: sample\r\n" |
+ "set-cookie: WK-websocket-test=1\r\n" |
+ "set-cookie: WK-websocket-test-httponly=1; HttpOnly\r\n" |
+ "\r\n" |
+ "8jKS'y:G*Co,Wxa-"; |
+ |
+ EXPECT_EQ(kHandshakeResponseExpectedMessage, response_handler.GetResponse()); |
+} |
+ |
} // namespace net |