| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <string> | 5 #include <string> |
| 6 #include <vector> | 6 #include <vector> |
| 7 | 7 |
| 8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
| 9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
| 10 #include "googleurl/src/gurl.h" | 10 #include "googleurl/src/gurl.h" |
| 11 #include "net/http/http_response_headers.h" | 11 #include "net/http/http_response_headers.h" |
| (...skipping 28 matching lines...) Expand all Loading... |
| 40 "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n" | 40 "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n" |
| 41 "Sec-WebSocket-Protocol: sample\r\n" | 41 "Sec-WebSocket-Protocol: sample\r\n" |
| 42 "Upgrade: WebSocket\r\n" | 42 "Upgrade: WebSocket\r\n" |
| 43 "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n" | 43 "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n" |
| 44 "Origin: http://example.com\r\n" | 44 "Origin: http://example.com\r\n" |
| 45 "\r\n" | 45 "\r\n" |
| 46 "^n:ds[4U"; | 46 "^n:ds[4U"; |
| 47 | 47 |
| 48 EXPECT_TRUE(handler.ParseRequest(kHandshakeRequestMessage, | 48 EXPECT_TRUE(handler.ParseRequest(kHandshakeRequestMessage, |
| 49 strlen(kHandshakeRequestMessage))); | 49 strlen(kHandshakeRequestMessage))); |
| 50 EXPECT_EQ(0, handler.protocol_version()); |
| 50 | 51 |
| 51 handler.RemoveHeaders(kCookieHeaders, arraysize(kCookieHeaders)); | 52 handler.RemoveHeaders(kCookieHeaders, arraysize(kCookieHeaders)); |
| 52 | 53 |
| 54 EXPECT_EQ(kHandshakeRequestMessage, handler.GetRawRequest()); |
| 55 } |
| 56 |
| 57 TEST(WebSocketHandshakeRequestHandlerTest, SimpleRequestHybi06Handshake) { |
| 58 WebSocketHandshakeRequestHandler handler; |
| 59 |
| 60 static const char* kHandshakeRequestMessage = |
| 61 "GET /demo HTTP/1.1\r\n" |
| 62 "Host: example.com\r\n" |
| 63 "Upgrade: websocket\r\n" |
| 64 "Connection: Upgrade\r\n" |
| 65 "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n" |
| 66 "Sec-WebSocket-Origin: http://example.com\r\n" |
| 67 "Sec-WebSocket-Protocol: sample\r\n" |
| 68 "Sec-WebSocket-Version: 6\r\n" |
| 69 "\r\n"; |
| 70 |
| 71 EXPECT_TRUE(handler.ParseRequest(kHandshakeRequestMessage, |
| 72 strlen(kHandshakeRequestMessage))); |
| 73 EXPECT_EQ(6, handler.protocol_version()); |
| 74 |
| 75 handler.RemoveHeaders(kCookieHeaders, arraysize(kCookieHeaders)); |
| 76 |
| 53 EXPECT_EQ(kHandshakeRequestMessage, handler.GetRawRequest()); | 77 EXPECT_EQ(kHandshakeRequestMessage, handler.GetRawRequest()); |
| 54 } | 78 } |
| 55 | 79 |
| 56 TEST(WebSocketHandshakeRequestHandlerTest, ReplaceRequestCookies) { | 80 TEST(WebSocketHandshakeRequestHandlerTest, ReplaceRequestCookies) { |
| 57 WebSocketHandshakeRequestHandler handler; | 81 WebSocketHandshakeRequestHandler handler; |
| 58 | 82 |
| 59 static const char* kHandshakeRequestMessage = | 83 static const char* kHandshakeRequestMessage = |
| 60 "GET /demo HTTP/1.1\r\n" | 84 "GET /demo HTTP/1.1\r\n" |
| 61 "Host: example.com\r\n" | 85 "Host: example.com\r\n" |
| 62 "Connection: Upgrade\r\n" | 86 "Connection: Upgrade\r\n" |
| 63 "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n" | 87 "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n" |
| 64 "Sec-WebSocket-Protocol: sample\r\n" | 88 "Sec-WebSocket-Protocol: sample\r\n" |
| 65 "Upgrade: WebSocket\r\n" | 89 "Upgrade: WebSocket\r\n" |
| 66 "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n" | 90 "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n" |
| 67 "Origin: http://example.com\r\n" | 91 "Origin: http://example.com\r\n" |
| 68 "Cookie: WK-websocket-test=1\r\n" | 92 "Cookie: WK-websocket-test=1\r\n" |
| 69 "\r\n" | 93 "\r\n" |
| 70 "^n:ds[4U"; | 94 "^n:ds[4U"; |
| 71 | 95 |
| 72 EXPECT_TRUE(handler.ParseRequest(kHandshakeRequestMessage, | 96 EXPECT_TRUE(handler.ParseRequest(kHandshakeRequestMessage, |
| 73 strlen(kHandshakeRequestMessage))); | 97 strlen(kHandshakeRequestMessage))); |
| 98 EXPECT_EQ(0, handler.protocol_version()); |
| 74 | 99 |
| 75 handler.RemoveHeaders(kCookieHeaders, arraysize(kCookieHeaders)); | 100 handler.RemoveHeaders(kCookieHeaders, arraysize(kCookieHeaders)); |
| 76 | 101 |
| 77 handler.AppendHeaderIfMissing("Cookie", | 102 handler.AppendHeaderIfMissing("Cookie", |
| 78 "WK-websocket-test=1; " | 103 "WK-websocket-test=1; " |
| 79 "WK-websocket-test-httponly=1"); | 104 "WK-websocket-test-httponly=1"); |
| 80 | 105 |
| 81 static const char* kHandshakeRequestExpectedMessage = | 106 static const char* kHandshakeRequestExpectedMessage = |
| 82 "GET /demo HTTP/1.1\r\n" | 107 "GET /demo HTTP/1.1\r\n" |
| 83 "Host: example.com\r\n" | 108 "Host: example.com\r\n" |
| 84 "Connection: Upgrade\r\n" | 109 "Connection: Upgrade\r\n" |
| 85 "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n" | 110 "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n" |
| 86 "Sec-WebSocket-Protocol: sample\r\n" | 111 "Sec-WebSocket-Protocol: sample\r\n" |
| 87 "Upgrade: WebSocket\r\n" | 112 "Upgrade: WebSocket\r\n" |
| 88 "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n" | 113 "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n" |
| 89 "Origin: http://example.com\r\n" | 114 "Origin: http://example.com\r\n" |
| 90 "Cookie: WK-websocket-test=1; WK-websocket-test-httponly=1\r\n" | 115 "Cookie: WK-websocket-test=1; WK-websocket-test-httponly=1\r\n" |
| 91 "\r\n" | 116 "\r\n" |
| 92 "^n:ds[4U"; | 117 "^n:ds[4U"; |
| 93 | 118 |
| 94 EXPECT_EQ(kHandshakeRequestExpectedMessage, handler.GetRawRequest()); | 119 EXPECT_EQ(kHandshakeRequestExpectedMessage, handler.GetRawRequest()); |
| 95 } | 120 } |
| 96 | 121 |
| 122 TEST(WebSocketHandshakeRequestHandlerTest, |
| 123 ReplaceRequestCookiesHybi06Handshake) { |
| 124 WebSocketHandshakeRequestHandler handler; |
| 125 |
| 126 static const char* kHandshakeRequestMessage = |
| 127 "GET /demo HTTP/1.1\r\n" |
| 128 "Host: example.com\r\n" |
| 129 "Upgrade: websocket\r\n" |
| 130 "Connection: Upgrade\r\n" |
| 131 "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n" |
| 132 "Sec-WebSocket-Origin: http://example.com\r\n" |
| 133 "Sec-WebSocket-Protocol: sample\r\n" |
| 134 "Sec-WebSocket-Version: 6\r\n" |
| 135 "Cookie: WK-websocket-test=1\r\n" |
| 136 "\r\n"; |
| 137 |
| 138 EXPECT_TRUE(handler.ParseRequest(kHandshakeRequestMessage, |
| 139 strlen(kHandshakeRequestMessage))); |
| 140 EXPECT_EQ(6, handler.protocol_version()); |
| 141 |
| 142 handler.RemoveHeaders(kCookieHeaders, arraysize(kCookieHeaders)); |
| 143 |
| 144 handler.AppendHeaderIfMissing("Cookie", |
| 145 "WK-websocket-test=1; " |
| 146 "WK-websocket-test-httponly=1"); |
| 147 |
| 148 static const char* kHandshakeRequestExpectedMessage = |
| 149 "GET /demo HTTP/1.1\r\n" |
| 150 "Host: example.com\r\n" |
| 151 "Upgrade: websocket\r\n" |
| 152 "Connection: Upgrade\r\n" |
| 153 "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n" |
| 154 "Sec-WebSocket-Origin: http://example.com\r\n" |
| 155 "Sec-WebSocket-Protocol: sample\r\n" |
| 156 "Sec-WebSocket-Version: 6\r\n" |
| 157 "Cookie: WK-websocket-test=1; WK-websocket-test-httponly=1\r\n" |
| 158 "\r\n"; |
| 159 |
| 160 EXPECT_EQ(kHandshakeRequestExpectedMessage, handler.GetRawRequest()); |
| 161 } |
| 162 |
| 97 TEST(WebSocketHandshakeResponseHandlerTest, SimpleResponse) { | 163 TEST(WebSocketHandshakeResponseHandlerTest, SimpleResponse) { |
| 98 WebSocketHandshakeResponseHandler handler; | 164 WebSocketHandshakeResponseHandler handler; |
| 165 EXPECT_EQ(0, handler.protocol_version()); |
| 99 | 166 |
| 100 static const char* kHandshakeResponseMessage = | 167 static const char* kHandshakeResponseMessage = |
| 101 "HTTP/1.1 101 WebSocket Protocol Handshake\r\n" | 168 "HTTP/1.1 101 WebSocket Protocol Handshake\r\n" |
| 102 "Upgrade: WebSocket\r\n" | 169 "Upgrade: WebSocket\r\n" |
| 103 "Connection: Upgrade\r\n" | 170 "Connection: Upgrade\r\n" |
| 104 "Sec-WebSocket-Origin: http://example.com\r\n" | 171 "Sec-WebSocket-Origin: http://example.com\r\n" |
| 105 "Sec-WebSocket-Location: ws://example.com/demo\r\n" | 172 "Sec-WebSocket-Location: ws://example.com/demo\r\n" |
| 106 "Sec-WebSocket-Protocol: sample\r\n" | 173 "Sec-WebSocket-Protocol: sample\r\n" |
| 107 "\r\n" | 174 "\r\n" |
| 108 "8jKS'y:G*Co,Wxa-"; | 175 "8jKS'y:G*Co,Wxa-"; |
| 109 | 176 |
| 110 EXPECT_EQ(strlen(kHandshakeResponseMessage), | 177 EXPECT_EQ(strlen(kHandshakeResponseMessage), |
| 111 handler.ParseRawResponse(kHandshakeResponseMessage, | 178 handler.ParseRawResponse(kHandshakeResponseMessage, |
| 112 strlen(kHandshakeResponseMessage))); | 179 strlen(kHandshakeResponseMessage))); |
| 113 EXPECT_TRUE(handler.HasResponse()); | 180 EXPECT_TRUE(handler.HasResponse()); |
| 114 | 181 |
| 115 handler.RemoveHeaders(kCookieHeaders, arraysize(kCookieHeaders)); | 182 handler.RemoveHeaders(kCookieHeaders, arraysize(kCookieHeaders)); |
| 116 | 183 |
| 117 EXPECT_EQ(kHandshakeResponseMessage, handler.GetResponse()); | 184 EXPECT_EQ(kHandshakeResponseMessage, handler.GetResponse()); |
| 118 } | 185 } |
| 119 | 186 |
| 187 TEST(WebSocketHandshakeResponseHandlerTest, SimpleResponseHybi06Handshake) { |
| 188 WebSocketHandshakeResponseHandler handler; |
| 189 handler.set_protocol_version(6); |
| 190 EXPECT_EQ(6, handler.protocol_version()); |
| 191 |
| 192 static const char* kHandshakeResponseMessage = |
| 193 "HTTP/1.1 101 Switching Protocols\r\n" |
| 194 "Upgrade: websocket\r\n" |
| 195 "Connection: Upgrade\r\n" |
| 196 "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n" |
| 197 "Sec-WebSocket-Protocol: sample\r\n" |
| 198 "\r\n"; |
| 199 |
| 200 EXPECT_EQ(strlen(kHandshakeResponseMessage), |
| 201 handler.ParseRawResponse(kHandshakeResponseMessage, |
| 202 strlen(kHandshakeResponseMessage))); |
| 203 EXPECT_TRUE(handler.HasResponse()); |
| 204 |
| 205 handler.RemoveHeaders(kCookieHeaders, arraysize(kCookieHeaders)); |
| 206 |
| 207 EXPECT_EQ(kHandshakeResponseMessage, handler.GetResponse()); |
| 208 } |
| 209 |
| 120 TEST(WebSocketHandshakeResponseHandlerTest, ReplaceResponseCookies) { | 210 TEST(WebSocketHandshakeResponseHandlerTest, ReplaceResponseCookies) { |
| 121 WebSocketHandshakeResponseHandler handler; | 211 WebSocketHandshakeResponseHandler handler; |
| 212 EXPECT_EQ(0, handler.protocol_version()); |
| 122 | 213 |
| 123 static const char* kHandshakeResponseMessage = | 214 static const char* kHandshakeResponseMessage = |
| 124 "HTTP/1.1 101 WebSocket Protocol Handshake\r\n" | 215 "HTTP/1.1 101 WebSocket Protocol Handshake\r\n" |
| 125 "Upgrade: WebSocket\r\n" | 216 "Upgrade: WebSocket\r\n" |
| 126 "Connection: Upgrade\r\n" | 217 "Connection: Upgrade\r\n" |
| 127 "Sec-WebSocket-Origin: http://example.com\r\n" | 218 "Sec-WebSocket-Origin: http://example.com\r\n" |
| 128 "Sec-WebSocket-Location: ws://example.com/demo\r\n" | 219 "Sec-WebSocket-Location: ws://example.com/demo\r\n" |
| 129 "Sec-WebSocket-Protocol: sample\r\n" | 220 "Sec-WebSocket-Protocol: sample\r\n" |
| 130 "Set-Cookie: WK-websocket-test-1\r\n" | 221 "Set-Cookie: WK-websocket-test-1\r\n" |
| 131 "Set-Cookie: WK-websocket-test-httponly=1; HttpOnly\r\n" | 222 "Set-Cookie: WK-websocket-test-httponly=1; HttpOnly\r\n" |
| (...skipping 17 matching lines...) Expand all Loading... |
| 149 "Connection: Upgrade\r\n" | 240 "Connection: Upgrade\r\n" |
| 150 "Sec-WebSocket-Origin: http://example.com\r\n" | 241 "Sec-WebSocket-Origin: http://example.com\r\n" |
| 151 "Sec-WebSocket-Location: ws://example.com/demo\r\n" | 242 "Sec-WebSocket-Location: ws://example.com/demo\r\n" |
| 152 "Sec-WebSocket-Protocol: sample\r\n" | 243 "Sec-WebSocket-Protocol: sample\r\n" |
| 153 "\r\n" | 244 "\r\n" |
| 154 "8jKS'y:G*Co,Wxa-"; | 245 "8jKS'y:G*Co,Wxa-"; |
| 155 | 246 |
| 156 EXPECT_EQ(kHandshakeResponseExpectedMessage, handler.GetResponse()); | 247 EXPECT_EQ(kHandshakeResponseExpectedMessage, handler.GetResponse()); |
| 157 } | 248 } |
| 158 | 249 |
| 250 TEST(WebSocketHandshakeResponseHandlerTest, |
| 251 ReplaceResponseCookiesHybi06Handshake) { |
| 252 WebSocketHandshakeResponseHandler handler; |
| 253 handler.set_protocol_version(6); |
| 254 EXPECT_EQ(6, handler.protocol_version()); |
| 255 |
| 256 static const char* kHandshakeResponseMessage = |
| 257 "HTTP/1.1 101 Switching Protocols\r\n" |
| 258 "Upgrade: websocket\r\n" |
| 259 "Connection: Upgrade\r\n" |
| 260 "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n" |
| 261 "Sec-WebSocket-Protocol: sample\r\n" |
| 262 "Set-Cookie: WK-websocket-test-1\r\n" |
| 263 "Set-Cookie: WK-websocket-test-httponly=1; HttpOnly\r\n" |
| 264 "\r\n"; |
| 265 |
| 266 EXPECT_EQ(strlen(kHandshakeResponseMessage), |
| 267 handler.ParseRawResponse(kHandshakeResponseMessage, |
| 268 strlen(kHandshakeResponseMessage))); |
| 269 EXPECT_TRUE(handler.HasResponse()); |
| 270 std::vector<std::string> cookies; |
| 271 handler.GetHeaders(kSetCookieHeaders, arraysize(kSetCookieHeaders), &cookies); |
| 272 ASSERT_EQ(2U, cookies.size()); |
| 273 EXPECT_EQ("WK-websocket-test-1", cookies[0]); |
| 274 EXPECT_EQ("WK-websocket-test-httponly=1; HttpOnly", cookies[1]); |
| 275 handler.RemoveHeaders(kSetCookieHeaders, arraysize(kSetCookieHeaders)); |
| 276 |
| 277 static const char* kHandshakeResponseExpectedMessage = |
| 278 "HTTP/1.1 101 Switching Protocols\r\n" |
| 279 "Upgrade: websocket\r\n" |
| 280 "Connection: Upgrade\r\n" |
| 281 "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n" |
| 282 "Sec-WebSocket-Protocol: sample\r\n" |
| 283 "\r\n"; |
| 284 |
| 285 EXPECT_EQ(kHandshakeResponseExpectedMessage, handler.GetResponse()); |
| 286 } |
| 287 |
| 159 TEST(WebSocketHandshakeResponseHandlerTest, BadResponse) { | 288 TEST(WebSocketHandshakeResponseHandlerTest, BadResponse) { |
| 160 WebSocketHandshakeResponseHandler handler; | 289 WebSocketHandshakeResponseHandler handler; |
| 161 | 290 |
| 162 static const char* kBadMessage = "\n\n\r\net-Location: w"; | 291 static const char* kBadMessage = "\n\n\r\net-Location: w"; |
| 163 EXPECT_EQ(strlen(kBadMessage), | 292 EXPECT_EQ(strlen(kBadMessage), |
| 164 handler.ParseRawResponse(kBadMessage, strlen(kBadMessage))); | 293 handler.ParseRawResponse(kBadMessage, strlen(kBadMessage))); |
| 165 EXPECT_TRUE(handler.HasResponse()); | 294 EXPECT_TRUE(handler.HasResponse()); |
| 166 EXPECT_EQ(kBadMessage, handler.GetResponse()); | 295 EXPECT_EQ(kBadMessage, handler.GetResponse()); |
| 167 } | 296 } |
| 168 | 297 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 186 "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n" | 315 "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n" |
| 187 "Sec-WebSocket-Protocol: sample\r\n" | 316 "Sec-WebSocket-Protocol: sample\r\n" |
| 188 "Upgrade: WebSocket\r\n" | 317 "Upgrade: WebSocket\r\n" |
| 189 "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n" | 318 "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n" |
| 190 "Origin: http://example.com\r\n" | 319 "Origin: http://example.com\r\n" |
| 191 "\r\n" | 320 "\r\n" |
| 192 "^n:ds[4U"; | 321 "^n:ds[4U"; |
| 193 | 322 |
| 194 EXPECT_TRUE(request_handler.ParseRequest(kHandshakeRequestMessage, | 323 EXPECT_TRUE(request_handler.ParseRequest(kHandshakeRequestMessage, |
| 195 strlen(kHandshakeRequestMessage))); | 324 strlen(kHandshakeRequestMessage))); |
| 325 EXPECT_EQ(0, request_handler.protocol_version()); |
| 196 | 326 |
| 197 GURL url("ws://example.com/demo"); | 327 GURL url("ws://example.com/demo"); |
| 198 std::string challenge; | 328 std::string challenge; |
| 199 const HttpRequestInfo& request_info = | 329 const HttpRequestInfo& request_info = |
| 200 request_handler.GetRequestInfo(url, &challenge); | 330 request_handler.GetRequestInfo(url, &challenge); |
| 201 | 331 |
| 202 EXPECT_EQ(url, request_info.url); | 332 EXPECT_EQ(url, request_info.url); |
| 203 EXPECT_EQ("GET", request_info.method); | 333 EXPECT_EQ("GET", request_info.method); |
| 204 EXPECT_FALSE(request_info.extra_headers.HasHeader("Upgrade")); | 334 EXPECT_FALSE(request_info.extra_headers.HasHeader("Upgrade")); |
| 205 EXPECT_FALSE(request_info.extra_headers.HasHeader("Connection")); | 335 EXPECT_FALSE(request_info.extra_headers.HasHeader("Connection")); |
| 206 EXPECT_FALSE(request_info.extra_headers.HasHeader("Sec-WebSocket-Key1")); | 336 EXPECT_FALSE(request_info.extra_headers.HasHeader("Sec-WebSocket-Key1")); |
| 207 EXPECT_FALSE(request_info.extra_headers.HasHeader("Sec-WebSocket-Key2")); | 337 EXPECT_FALSE(request_info.extra_headers.HasHeader("Sec-WebSocket-Key2")); |
| 208 std::string value; | 338 std::string value; |
| 209 EXPECT_TRUE(request_info.extra_headers.GetHeader("Host", &value)); | 339 EXPECT_TRUE(request_info.extra_headers.GetHeader("Host", &value)); |
| 210 EXPECT_EQ("example.com", value); | 340 EXPECT_EQ("example.com", value); |
| 211 EXPECT_TRUE(request_info.extra_headers.GetHeader("Origin", &value)); | 341 EXPECT_TRUE(request_info.extra_headers.GetHeader("Origin", &value)); |
| 212 EXPECT_EQ("http://example.com", value); | 342 EXPECT_EQ("http://example.com", value); |
| 213 EXPECT_TRUE(request_info.extra_headers.GetHeader("Sec-WebSocket-Protocol", | 343 EXPECT_TRUE(request_info.extra_headers.GetHeader("Sec-WebSocket-Protocol", |
| 214 &value)); | 344 &value)); |
| 215 EXPECT_EQ("sample", value); | 345 EXPECT_EQ("sample", value); |
| 216 | 346 |
| 217 const char expected_challenge[] = "\x31\x6e\x41\x13\x0f\x7e\xd6\x3c^n:ds[4U"; | 347 const char* expected_challenge = "\x31\x6e\x41\x13\x0f\x7e\xd6\x3c^n:ds[4U"; |
| 218 | 348 |
| 219 EXPECT_EQ(expected_challenge, challenge); | 349 EXPECT_EQ(expected_challenge, challenge); |
| 220 | 350 |
| 221 static const char* kHandshakeResponseHeader = | 351 static const char* kHandshakeResponseHeader = |
| 222 "HTTP/1.1 101 WebSocket Protocol Handshake\r\n" | 352 "HTTP/1.1 101 WebSocket Protocol Handshake\r\n" |
| 223 "Sec-WebSocket-Origin: http://example.com\r\n" | 353 "Sec-WebSocket-Origin: http://example.com\r\n" |
| 224 "Sec-WebSocket-Location: ws://example.com/demo\r\n" | 354 "Sec-WebSocket-Location: ws://example.com/demo\r\n" |
| 225 "Sec-WebSocket-Protocol: sample\r\n"; | 355 "Sec-WebSocket-Protocol: sample\r\n"; |
| 226 | 356 |
| 227 std::string raw_headers = | 357 std::string raw_headers = |
| 228 HttpUtil::AssembleRawHeaders(kHandshakeResponseHeader, | 358 HttpUtil::AssembleRawHeaders(kHandshakeResponseHeader, |
| 229 strlen(kHandshakeResponseHeader)); | 359 strlen(kHandshakeResponseHeader)); |
| 230 HttpResponseInfo response_info; | 360 HttpResponseInfo response_info; |
| 231 response_info.headers = new HttpResponseHeaders(raw_headers); | 361 response_info.headers = new HttpResponseHeaders(raw_headers); |
| 232 | 362 |
| 233 EXPECT_TRUE(StartsWithASCII(response_info.headers->GetStatusLine(), | 363 EXPECT_TRUE(StartsWithASCII(response_info.headers->GetStatusLine(), |
| 234 "HTTP/1.1 101 ", false)); | 364 "HTTP/1.1 101 ", false)); |
| 235 EXPECT_FALSE(response_info.headers->HasHeader("Upgrade")); | 365 EXPECT_FALSE(response_info.headers->HasHeader("Upgrade")); |
| 236 EXPECT_FALSE(response_info.headers->HasHeader("Connection")); | 366 EXPECT_FALSE(response_info.headers->HasHeader("Connection")); |
| 237 EXPECT_TRUE(response_info.headers->HasHeaderValue("Sec-WebSocket-Origin", | 367 EXPECT_TRUE(response_info.headers->HasHeaderValue("Sec-WebSocket-Origin", |
| 238 "http://example.com")); | 368 "http://example.com")); |
| 239 EXPECT_TRUE(response_info.headers->HasHeaderValue("Sec-WebSocket-Location", | 369 EXPECT_TRUE(response_info.headers->HasHeaderValue("Sec-WebSocket-Location", |
| 240 "ws://example.com/demo")); | 370 "ws://example.com/demo")); |
| 241 EXPECT_TRUE(response_info.headers->HasHeaderValue("Sec-WebSocket-Protocol", | 371 EXPECT_TRUE(response_info.headers->HasHeaderValue("Sec-WebSocket-Protocol", |
| 242 "sample")); | 372 "sample")); |
| 243 | 373 |
| 244 WebSocketHandshakeResponseHandler response_handler; | 374 WebSocketHandshakeResponseHandler response_handler; |
| 375 EXPECT_EQ(0, response_handler.protocol_version()); |
| 245 EXPECT_TRUE(response_handler.ParseResponseInfo(response_info, challenge)); | 376 EXPECT_TRUE(response_handler.ParseResponseInfo(response_info, challenge)); |
| 246 EXPECT_TRUE(response_handler.HasResponse()); | 377 EXPECT_TRUE(response_handler.HasResponse()); |
| 247 | 378 |
| 248 static const char* kHandshakeResponseExpectedMessage = | 379 static const char* kHandshakeResponseExpectedMessage = |
| 249 "HTTP/1.1 101 WebSocket Protocol Handshake\r\n" | 380 "HTTP/1.1 101 WebSocket Protocol Handshake\r\n" |
| 250 "Upgrade: WebSocket\r\n" | 381 "Upgrade: WebSocket\r\n" |
| 251 "Connection: Upgrade\r\n" | 382 "Connection: Upgrade\r\n" |
| 252 "Sec-WebSocket-Origin: http://example.com\r\n" | 383 "Sec-WebSocket-Origin: http://example.com\r\n" |
| 253 "Sec-WebSocket-Location: ws://example.com/demo\r\n" | 384 "Sec-WebSocket-Location: ws://example.com/demo\r\n" |
| 254 "Sec-WebSocket-Protocol: sample\r\n" | 385 "Sec-WebSocket-Protocol: sample\r\n" |
| 255 "\r\n" | 386 "\r\n" |
| 256 "8jKS'y:G*Co,Wxa-"; | 387 "8jKS'y:G*Co,Wxa-"; |
| 257 | 388 |
| 258 EXPECT_EQ(kHandshakeResponseExpectedMessage, response_handler.GetResponse()); | 389 EXPECT_EQ(kHandshakeResponseExpectedMessage, response_handler.GetResponse()); |
| 259 } | 390 } |
| 260 | 391 |
| 392 TEST(WebSocketHandshakeHandlerTest, HttpRequestResponseHybi06Handshake) { |
| 393 WebSocketHandshakeRequestHandler request_handler; |
| 394 |
| 395 static const char* kHandshakeRequestMessage = |
| 396 "GET /demo HTTP/1.1\r\n" |
| 397 "Host: example.com\r\n" |
| 398 "Upgrade: websocket\r\n" |
| 399 "Connection: Upgrade\r\n" |
| 400 "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n" |
| 401 "Sec-WebSocket-Origin: http://example.com\r\n" |
| 402 "Sec-WebSocket-Protocol: sample\r\n" |
| 403 "Sec-WebSocket-Version: 6\r\n" |
| 404 "\r\n"; |
| 405 |
| 406 EXPECT_TRUE(request_handler.ParseRequest(kHandshakeRequestMessage, |
| 407 strlen(kHandshakeRequestMessage))); |
| 408 EXPECT_EQ(6, request_handler.protocol_version()); |
| 409 |
| 410 GURL url("ws://example.com/demo"); |
| 411 std::string challenge; |
| 412 const HttpRequestInfo& request_info = |
| 413 request_handler.GetRequestInfo(url, &challenge); |
| 414 |
| 415 EXPECT_EQ(url, request_info.url); |
| 416 EXPECT_EQ("GET", request_info.method); |
| 417 EXPECT_FALSE(request_info.extra_headers.HasHeader("Upgrade")); |
| 418 EXPECT_FALSE(request_info.extra_headers.HasHeader("Connection")); |
| 419 EXPECT_FALSE(request_info.extra_headers.HasHeader("Sec-WebSocket-Key")); |
| 420 std::string value; |
| 421 EXPECT_TRUE(request_info.extra_headers.GetHeader("Host", &value)); |
| 422 EXPECT_EQ("example.com", value); |
| 423 EXPECT_TRUE(request_info.extra_headers.GetHeader("Sec-WebSocket-Origin", |
| 424 &value)); |
| 425 EXPECT_EQ("http://example.com", value); |
| 426 EXPECT_TRUE(request_info.extra_headers.GetHeader("Sec-WebSocket-Protocol", |
| 427 &value)); |
| 428 EXPECT_EQ("sample", value); |
| 429 |
| 430 EXPECT_EQ("dGhlIHNhbXBsZSBub25jZQ==", challenge); |
| 431 |
| 432 static const char* kHandshakeResponseHeader = |
| 433 "HTTP/1.1 101 Switching Protocols\r\n" |
| 434 "Sec-WebSocket-Protocol: sample\r\n"; |
| 435 |
| 436 std::string raw_headers = |
| 437 HttpUtil::AssembleRawHeaders(kHandshakeResponseHeader, |
| 438 strlen(kHandshakeResponseHeader)); |
| 439 HttpResponseInfo response_info; |
| 440 response_info.headers = new HttpResponseHeaders(raw_headers); |
| 441 |
| 442 EXPECT_TRUE(StartsWithASCII(response_info.headers->GetStatusLine(), |
| 443 "HTTP/1.1 101 ", false)); |
| 444 EXPECT_FALSE(response_info.headers->HasHeader("Upgrade")); |
| 445 EXPECT_FALSE(response_info.headers->HasHeader("Connection")); |
| 446 EXPECT_FALSE(response_info.headers->HasHeader("Sec-WebSocket-Accept")); |
| 447 EXPECT_TRUE(response_info.headers->HasHeaderValue("Sec-WebSocket-Protocol", |
| 448 "sample")); |
| 449 |
| 450 WebSocketHandshakeResponseHandler response_handler; |
| 451 response_handler.set_protocol_version(request_handler.protocol_version()); |
| 452 EXPECT_EQ(6, response_handler.protocol_version()); |
| 453 |
| 454 EXPECT_TRUE(response_handler.ParseResponseInfo(response_info, challenge)); |
| 455 EXPECT_TRUE(response_handler.HasResponse()); |
| 456 |
| 457 static const char* kHandshakeResponseExpectedMessage = |
| 458 "HTTP/1.1 101 Switching Protocols\r\n" |
| 459 "Upgrade: websocket\r\n" |
| 460 "Connection: Upgrade\r\n" |
| 461 "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n" |
| 462 "Sec-WebSocket-Protocol: sample\r\n" |
| 463 "\r\n"; |
| 464 |
| 465 EXPECT_EQ(kHandshakeResponseExpectedMessage, response_handler.GetResponse()); |
| 466 } |
| 467 |
| 261 TEST(WebSocketHandshakeHandlerTest, SpdyRequestResponse) { | 468 TEST(WebSocketHandshakeHandlerTest, SpdyRequestResponse) { |
| 262 WebSocketHandshakeRequestHandler request_handler; | 469 WebSocketHandshakeRequestHandler request_handler; |
| 263 | 470 |
| 264 static const char* kHandshakeRequestMessage = | 471 static const char* kHandshakeRequestMessage = |
| 265 "GET /demo HTTP/1.1\r\n" | 472 "GET /demo HTTP/1.1\r\n" |
| 266 "Host: example.com\r\n" | 473 "Host: example.com\r\n" |
| 267 "Connection: Upgrade\r\n" | 474 "Connection: Upgrade\r\n" |
| 268 "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n" | 475 "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n" |
| 269 "Sec-WebSocket-Protocol: sample\r\n" | 476 "Sec-WebSocket-Protocol: sample\r\n" |
| 270 "Upgrade: WebSocket\r\n" | 477 "Upgrade: WebSocket\r\n" |
| 271 "X-bogus-header: X\r\n" | 478 "X-bogus-header: X\r\n" |
| 272 "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n" | 479 "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n" |
| 273 "Origin: http://example.com\r\n" | 480 "Origin: http://example.com\r\n" |
| 274 "X-bogus-header: Y\r\n" | 481 "X-bogus-header: Y\r\n" |
| 275 "\r\n" | 482 "\r\n" |
| 276 "^n:ds[4U"; | 483 "^n:ds[4U"; |
| 277 | 484 |
| 278 EXPECT_TRUE(request_handler.ParseRequest(kHandshakeRequestMessage, | 485 EXPECT_TRUE(request_handler.ParseRequest(kHandshakeRequestMessage, |
| 279 strlen(kHandshakeRequestMessage))); | 486 strlen(kHandshakeRequestMessage))); |
| 487 EXPECT_EQ(0, request_handler.protocol_version()); |
| 280 | 488 |
| 281 GURL url("ws://example.com/demo"); | 489 GURL url("ws://example.com/demo"); |
| 282 std::string challenge; | 490 std::string challenge; |
| 283 spdy::SpdyHeaderBlock headers; | 491 spdy::SpdyHeaderBlock headers; |
| 284 ASSERT_TRUE(request_handler.GetRequestHeaderBlock(url, &headers, &challenge)); | 492 ASSERT_TRUE(request_handler.GetRequestHeaderBlock(url, &headers, &challenge)); |
| 285 | 493 |
| 286 EXPECT_EQ(url.spec(), headers["url"]); | 494 EXPECT_EQ(url.spec(), headers["url"]); |
| 287 EXPECT_TRUE(headers.find("upgrade") == headers.end()); | 495 EXPECT_TRUE(headers.find("upgrade") == headers.end()); |
| 288 EXPECT_TRUE(headers.find("Upgrade") == headers.end()); | 496 EXPECT_TRUE(headers.find("Upgrade") == headers.end()); |
| 289 EXPECT_TRUE(headers.find("connection") == headers.end()); | 497 EXPECT_TRUE(headers.find("connection") == headers.end()); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 303 | 511 |
| 304 EXPECT_EQ(expected_challenge, challenge); | 512 EXPECT_EQ(expected_challenge, challenge); |
| 305 | 513 |
| 306 headers.clear(); | 514 headers.clear(); |
| 307 | 515 |
| 308 headers["sec-websocket-origin"] = "http://example.com"; | 516 headers["sec-websocket-origin"] = "http://example.com"; |
| 309 headers["sec-websocket-location"] = "ws://example.com/demo"; | 517 headers["sec-websocket-location"] = "ws://example.com/demo"; |
| 310 headers["sec-websocket-protocol"] = "sample"; | 518 headers["sec-websocket-protocol"] = "sample"; |
| 311 | 519 |
| 312 WebSocketHandshakeResponseHandler response_handler; | 520 WebSocketHandshakeResponseHandler response_handler; |
| 521 EXPECT_EQ(0, response_handler.protocol_version()); |
| 313 EXPECT_TRUE(response_handler.ParseResponseHeaderBlock(headers, challenge)); | 522 EXPECT_TRUE(response_handler.ParseResponseHeaderBlock(headers, challenge)); |
| 314 EXPECT_TRUE(response_handler.HasResponse()); | 523 EXPECT_TRUE(response_handler.HasResponse()); |
| 315 | 524 |
| 316 // Note that order of sec-websocket-* is sensitive with hash_map order. | 525 // Note that order of sec-websocket-* is sensitive with hash_map order. |
| 317 static const char* kHandshakeResponseExpectedMessage = | 526 static const char* kHandshakeResponseExpectedMessage = |
| 318 "HTTP/1.1 101 WebSocket Protocol Handshake\r\n" | 527 "HTTP/1.1 101 WebSocket Protocol Handshake\r\n" |
| 319 "Upgrade: WebSocket\r\n" | 528 "Upgrade: WebSocket\r\n" |
| 320 "Connection: Upgrade\r\n" | 529 "Connection: Upgrade\r\n" |
| 321 "sec-websocket-location: ws://example.com/demo\r\n" | 530 "sec-websocket-location: ws://example.com/demo\r\n" |
| 322 "sec-websocket-origin: http://example.com\r\n" | 531 "sec-websocket-origin: http://example.com\r\n" |
| 323 "sec-websocket-protocol: sample\r\n" | 532 "sec-websocket-protocol: sample\r\n" |
| 324 "\r\n" | 533 "\r\n" |
| 325 "8jKS'y:G*Co,Wxa-"; | 534 "8jKS'y:G*Co,Wxa-"; |
| 326 | 535 |
| 327 EXPECT_EQ(kHandshakeResponseExpectedMessage, response_handler.GetResponse()); | 536 EXPECT_EQ(kHandshakeResponseExpectedMessage, response_handler.GetResponse()); |
| 328 } | 537 } |
| 329 | 538 |
| 539 TEST(WebSocketHandshakeHandlerTest, SpdyRequestResponseHybi06Handshake) { |
| 540 WebSocketHandshakeRequestHandler request_handler; |
| 541 |
| 542 static const char* kHandshakeRequestMessage = |
| 543 "GET /demo HTTP/1.1\r\n" |
| 544 "Host: example.com\r\n" |
| 545 "Upgrade: websocket\r\n" |
| 546 "Connection: Upgrade\r\n" |
| 547 "X-bogus-header: X\r\n" |
| 548 "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n" |
| 549 "Sec-WebSocket-Origin: http://example.com\r\n" |
| 550 "Sec-WebSocket-Protocol: sample\r\n" |
| 551 "Sec-WebSocket-Version: 6\r\n" |
| 552 "X-bogus-header: Y\r\n" |
| 553 "\r\n"; |
| 554 |
| 555 EXPECT_TRUE(request_handler.ParseRequest(kHandshakeRequestMessage, |
| 556 strlen(kHandshakeRequestMessage))); |
| 557 EXPECT_EQ(6, request_handler.protocol_version()); |
| 558 |
| 559 GURL url("ws://example.com/demo"); |
| 560 std::string challenge; |
| 561 spdy::SpdyHeaderBlock headers; |
| 562 ASSERT_TRUE(request_handler.GetRequestHeaderBlock(url, &headers, &challenge)); |
| 563 |
| 564 EXPECT_EQ(url.spec(), headers["url"]); |
| 565 EXPECT_TRUE(headers.find("upgrade") == headers.end()); |
| 566 EXPECT_TRUE(headers.find("Upgrade") == headers.end()); |
| 567 EXPECT_TRUE(headers.find("connection") == headers.end()); |
| 568 EXPECT_TRUE(headers.find("Connection") == headers.end()); |
| 569 EXPECT_TRUE(headers.find("Sec-WebSocket-Key") == headers.end()); |
| 570 EXPECT_TRUE(headers.find("sec-websocket-key") == headers.end()); |
| 571 EXPECT_EQ("example.com", headers["host"]); |
| 572 EXPECT_EQ("http://example.com", headers["sec-websocket-origin"]); |
| 573 EXPECT_EQ("sample", headers["sec-websocket-protocol"]); |
| 574 const char bogus_header[] = "X\0Y"; |
| 575 std::string bogus_header_str(bogus_header, sizeof(bogus_header) - 1); |
| 576 EXPECT_EQ(bogus_header_str, headers["x-bogus-header"]); |
| 577 |
| 578 EXPECT_EQ("dGhlIHNhbXBsZSBub25jZQ==", challenge); |
| 579 |
| 580 headers.clear(); |
| 581 |
| 582 headers["sec-websocket-protocol"] = "sample"; |
| 583 |
| 584 WebSocketHandshakeResponseHandler response_handler; |
| 585 response_handler.set_protocol_version(request_handler.protocol_version()); |
| 586 EXPECT_EQ(6, response_handler.protocol_version()); |
| 587 EXPECT_TRUE(response_handler.ParseResponseHeaderBlock(headers, challenge)); |
| 588 EXPECT_TRUE(response_handler.HasResponse()); |
| 589 |
| 590 // Note that order of sec-websocket-* is sensitive with hash_map order. |
| 591 static const char* kHandshakeResponseExpectedMessage = |
| 592 "HTTP/1.1 101 Switching Protocols\r\n" |
| 593 "Upgrade: websocket\r\n" |
| 594 "Connection: Upgrade\r\n" |
| 595 "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n" |
| 596 "sec-websocket-protocol: sample\r\n" |
| 597 "\r\n"; |
| 598 |
| 599 EXPECT_EQ(kHandshakeResponseExpectedMessage, response_handler.GetResponse()); |
| 600 } |
| 330 | 601 |
| 331 TEST(WebSocketHandshakeHandlerTest, SpdyRequestResponseWithCookies) { | 602 TEST(WebSocketHandshakeHandlerTest, SpdyRequestResponseWithCookies) { |
| 332 WebSocketHandshakeRequestHandler request_handler; | 603 WebSocketHandshakeRequestHandler request_handler; |
| 333 | 604 |
| 334 // Note that websocket won't use multiple headers in request now. | 605 // Note that websocket won't use multiple headers in request now. |
| 335 static const char* kHandshakeRequestMessage = | 606 static const char* kHandshakeRequestMessage = |
| 336 "GET /demo HTTP/1.1\r\n" | 607 "GET /demo HTTP/1.1\r\n" |
| 337 "Host: example.com\r\n" | 608 "Host: example.com\r\n" |
| 338 "Connection: Upgrade\r\n" | 609 "Connection: Upgrade\r\n" |
| 339 "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n" | 610 "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n" |
| 340 "Sec-WebSocket-Protocol: sample\r\n" | 611 "Sec-WebSocket-Protocol: sample\r\n" |
| 341 "Upgrade: WebSocket\r\n" | 612 "Upgrade: WebSocket\r\n" |
| 342 "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n" | 613 "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n" |
| 343 "Origin: http://example.com\r\n" | 614 "Origin: http://example.com\r\n" |
| 344 "Cookie: WK-websocket-test=1; WK-websocket-test-httponly=1\r\n" | 615 "Cookie: WK-websocket-test=1; WK-websocket-test-httponly=1\r\n" |
| 345 "\r\n" | 616 "\r\n" |
| 346 "^n:ds[4U"; | 617 "^n:ds[4U"; |
| 347 | 618 |
| 348 EXPECT_TRUE(request_handler.ParseRequest(kHandshakeRequestMessage, | 619 EXPECT_TRUE(request_handler.ParseRequest(kHandshakeRequestMessage, |
| 349 strlen(kHandshakeRequestMessage))); | 620 strlen(kHandshakeRequestMessage))); |
| 621 EXPECT_EQ(0, request_handler.protocol_version()); |
| 350 | 622 |
| 351 GURL url("ws://example.com/demo"); | 623 GURL url("ws://example.com/demo"); |
| 352 std::string challenge; | 624 std::string challenge; |
| 353 spdy::SpdyHeaderBlock headers; | 625 spdy::SpdyHeaderBlock headers; |
| 354 ASSERT_TRUE(request_handler.GetRequestHeaderBlock(url, &headers, &challenge)); | 626 ASSERT_TRUE(request_handler.GetRequestHeaderBlock(url, &headers, &challenge)); |
| 355 | 627 |
| 356 EXPECT_EQ(url.spec(), headers["url"]); | 628 EXPECT_EQ(url.spec(), headers["url"]); |
| 357 EXPECT_TRUE(headers.find("upgrade") == headers.end()); | 629 EXPECT_TRUE(headers.find("upgrade") == headers.end()); |
| 358 EXPECT_TRUE(headers.find("Upgrade") == headers.end()); | 630 EXPECT_TRUE(headers.find("Upgrade") == headers.end()); |
| 359 EXPECT_TRUE(headers.find("connection") == headers.end()); | 631 EXPECT_TRUE(headers.find("connection") == headers.end()); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 376 | 648 |
| 377 headers["sec-websocket-origin"] = "http://example.com"; | 649 headers["sec-websocket-origin"] = "http://example.com"; |
| 378 headers["sec-websocket-location"] = "ws://example.com/demo"; | 650 headers["sec-websocket-location"] = "ws://example.com/demo"; |
| 379 headers["sec-websocket-protocol"] = "sample"; | 651 headers["sec-websocket-protocol"] = "sample"; |
| 380 std::string cookie = "WK-websocket-test=1"; | 652 std::string cookie = "WK-websocket-test=1"; |
| 381 cookie.append(1, '\0'); | 653 cookie.append(1, '\0'); |
| 382 cookie += "WK-websocket-test-httponly=1; HttpOnly"; | 654 cookie += "WK-websocket-test-httponly=1; HttpOnly"; |
| 383 headers["set-cookie"] = cookie; | 655 headers["set-cookie"] = cookie; |
| 384 | 656 |
| 385 WebSocketHandshakeResponseHandler response_handler; | 657 WebSocketHandshakeResponseHandler response_handler; |
| 658 EXPECT_EQ(0, response_handler.protocol_version()); |
| 386 EXPECT_TRUE(response_handler.ParseResponseHeaderBlock(headers, challenge)); | 659 EXPECT_TRUE(response_handler.ParseResponseHeaderBlock(headers, challenge)); |
| 387 EXPECT_TRUE(response_handler.HasResponse()); | 660 EXPECT_TRUE(response_handler.HasResponse()); |
| 388 | 661 |
| 389 // Note that order of sec-websocket-* is sensitive with hash_map order. | 662 // Note that order of sec-websocket-* is sensitive with hash_map order. |
| 390 static const char* kHandshakeResponseExpectedMessage = | 663 static const char* kHandshakeResponseExpectedMessage = |
| 391 "HTTP/1.1 101 WebSocket Protocol Handshake\r\n" | 664 "HTTP/1.1 101 WebSocket Protocol Handshake\r\n" |
| 392 "Upgrade: WebSocket\r\n" | 665 "Upgrade: WebSocket\r\n" |
| 393 "Connection: Upgrade\r\n" | 666 "Connection: Upgrade\r\n" |
| 394 "sec-websocket-location: ws://example.com/demo\r\n" | 667 "sec-websocket-location: ws://example.com/demo\r\n" |
| 395 "sec-websocket-origin: http://example.com\r\n" | 668 "sec-websocket-origin: http://example.com\r\n" |
| 396 "sec-websocket-protocol: sample\r\n" | 669 "sec-websocket-protocol: sample\r\n" |
| 397 "set-cookie: WK-websocket-test=1\r\n" | 670 "set-cookie: WK-websocket-test=1\r\n" |
| 398 "set-cookie: WK-websocket-test-httponly=1; HttpOnly\r\n" | 671 "set-cookie: WK-websocket-test-httponly=1; HttpOnly\r\n" |
| 399 "\r\n" | 672 "\r\n" |
| 400 "8jKS'y:G*Co,Wxa-"; | 673 "8jKS'y:G*Co,Wxa-"; |
| 401 | 674 |
| 402 EXPECT_EQ(kHandshakeResponseExpectedMessage, response_handler.GetResponse()); | 675 EXPECT_EQ(kHandshakeResponseExpectedMessage, response_handler.GetResponse()); |
| 403 } | 676 } |
| 404 | 677 |
| 678 TEST(WebSocketHandshakeHandlerTest, |
| 679 SpdyRequestResponseWithCookiesHybi06Handshake) { |
| 680 WebSocketHandshakeRequestHandler request_handler; |
| 681 |
| 682 // Note that websocket won't use multiple headers in request now. |
| 683 static const char* kHandshakeRequestMessage = |
| 684 "GET /demo HTTP/1.1\r\n" |
| 685 "Host: example.com\r\n" |
| 686 "Upgrade: websocket\r\n" |
| 687 "Connection: Upgrade\r\n" |
| 688 "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n" |
| 689 "Sec-WebSocket-Origin: http://example.com\r\n" |
| 690 "Sec-WebSocket-Protocol: sample\r\n" |
| 691 "Sec-WebSocket-Version: 6\r\n" |
| 692 "Cookie: WK-websocket-test=1; WK-websocket-test-httponly=1\r\n" |
| 693 "\r\n"; |
| 694 |
| 695 EXPECT_TRUE(request_handler.ParseRequest(kHandshakeRequestMessage, |
| 696 strlen(kHandshakeRequestMessage))); |
| 697 EXPECT_EQ(6, request_handler.protocol_version()); |
| 698 |
| 699 GURL url("ws://example.com/demo"); |
| 700 std::string challenge; |
| 701 spdy::SpdyHeaderBlock headers; |
| 702 ASSERT_TRUE(request_handler.GetRequestHeaderBlock(url, &headers, &challenge)); |
| 703 |
| 704 EXPECT_EQ(url.spec(), headers["url"]); |
| 705 EXPECT_TRUE(headers.find("upgrade") == headers.end()); |
| 706 EXPECT_TRUE(headers.find("Upgrade") == headers.end()); |
| 707 EXPECT_TRUE(headers.find("connection") == headers.end()); |
| 708 EXPECT_TRUE(headers.find("Connection") == headers.end()); |
| 709 EXPECT_TRUE(headers.find("Sec-WebSocket-Key") == headers.end()); |
| 710 EXPECT_TRUE(headers.find("sec-websocket-key") == headers.end()); |
| 711 EXPECT_EQ("example.com", headers["host"]); |
| 712 EXPECT_EQ("http://example.com", headers["sec-websocket-origin"]); |
| 713 EXPECT_EQ("sample", headers["sec-websocket-protocol"]); |
| 714 EXPECT_EQ("WK-websocket-test=1; WK-websocket-test-httponly=1", |
| 715 headers["cookie"]); |
| 716 |
| 717 EXPECT_EQ("dGhlIHNhbXBsZSBub25jZQ==", challenge); |
| 718 |
| 719 headers.clear(); |
| 720 |
| 721 headers["sec-websocket-protocol"] = "sample"; |
| 722 std::string cookie = "WK-websocket-test=1"; |
| 723 cookie.append(1, '\0'); |
| 724 cookie += "WK-websocket-test-httponly=1; HttpOnly"; |
| 725 headers["set-cookie"] = cookie; |
| 726 |
| 727 WebSocketHandshakeResponseHandler response_handler; |
| 728 response_handler.set_protocol_version(request_handler.protocol_version()); |
| 729 EXPECT_EQ(6, response_handler.protocol_version()); |
| 730 EXPECT_TRUE(response_handler.ParseResponseHeaderBlock(headers, challenge)); |
| 731 EXPECT_TRUE(response_handler.HasResponse()); |
| 732 |
| 733 // Note that order of sec-websocket-* is sensitive with hash_map order. |
| 734 static const char* kHandshakeResponseExpectedMessage = |
| 735 "HTTP/1.1 101 Switching Protocols\r\n" |
| 736 "Upgrade: websocket\r\n" |
| 737 "Connection: Upgrade\r\n" |
| 738 "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n" |
| 739 "sec-websocket-protocol: sample\r\n" |
| 740 "set-cookie: WK-websocket-test=1\r\n" |
| 741 "set-cookie: WK-websocket-test-httponly=1; HttpOnly\r\n" |
| 742 "\r\n"; |
| 743 |
| 744 EXPECT_EQ(kHandshakeResponseExpectedMessage, response_handler.GetResponse()); |
| 745 } |
| 746 |
| 405 } // namespace net | 747 } // namespace net |
| OLD | NEW |