Chromium Code Reviews| 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 |