OLD | NEW |
---|---|
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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" |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
144 "Connection: Upgrade\r\n" | 144 "Connection: Upgrade\r\n" |
145 "Sec-WebSocket-Origin: http://example.com\r\n" | 145 "Sec-WebSocket-Origin: http://example.com\r\n" |
146 "Sec-WebSocket-Location: ws://example.com/demo\r\n" | 146 "Sec-WebSocket-Location: ws://example.com/demo\r\n" |
147 "Sec-WebSocket-Protocol: sample\r\n" | 147 "Sec-WebSocket-Protocol: sample\r\n" |
148 "\r\n" | 148 "\r\n" |
149 "8jKS'y:G*Co,Wxa-"; | 149 "8jKS'y:G*Co,Wxa-"; |
150 | 150 |
151 EXPECT_EQ(kHandshakeResponseExpectedMessage, handler.GetResponse()); | 151 EXPECT_EQ(kHandshakeResponseExpectedMessage, handler.GetResponse()); |
152 } | 152 } |
153 | 153 |
154 TEST(WebSocketHandshakeHandlerTest, RequestResponse) { | 154 TEST(WebSocketHandshakeHandlerTest, HttpRequestResponse) { |
155 WebSocketHandshakeRequestHandler request_handler; | 155 WebSocketHandshakeRequestHandler request_handler; |
156 | 156 |
157 static const char* kHandshakeRequestMessage = | 157 static const char* kHandshakeRequestMessage = |
158 "GET /demo HTTP/1.1\r\n" | 158 "GET /demo HTTP/1.1\r\n" |
159 "Host: example.com\r\n" | 159 "Host: example.com\r\n" |
160 "Connection: Upgrade\r\n" | 160 "Connection: Upgrade\r\n" |
161 "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n" | 161 "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n" |
162 "Sec-WebSocket-Protocol: sample\r\n" | 162 "Sec-WebSocket-Protocol: sample\r\n" |
163 "Upgrade: WebSocket\r\n" | 163 "Upgrade: WebSocket\r\n" |
164 "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n" | 164 "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n" |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
226 "Connection: Upgrade\r\n" | 226 "Connection: Upgrade\r\n" |
227 "Sec-WebSocket-Origin: http://example.com\r\n" | 227 "Sec-WebSocket-Origin: http://example.com\r\n" |
228 "Sec-WebSocket-Location: ws://example.com/demo\r\n" | 228 "Sec-WebSocket-Location: ws://example.com/demo\r\n" |
229 "Sec-WebSocket-Protocol: sample\r\n" | 229 "Sec-WebSocket-Protocol: sample\r\n" |
230 "\r\n" | 230 "\r\n" |
231 "8jKS'y:G*Co,Wxa-"; | 231 "8jKS'y:G*Co,Wxa-"; |
232 | 232 |
233 EXPECT_EQ(kHandshakeResponseExpectedMessage, response_handler.GetResponse()); | 233 EXPECT_EQ(kHandshakeResponseExpectedMessage, response_handler.GetResponse()); |
234 } | 234 } |
235 | 235 |
236 TEST(WebSocketHandshakeHandlerTest, SpdyRequestResponse) { | |
237 WebSocketHandshakeRequestHandler request_handler; | |
238 | |
239 static const char* kHandshakeRequestMessage = | |
240 "GET /demo HTTP/1.1\r\n" | |
241 "Host: example.com\r\n" | |
242 "Connection: Upgrade\r\n" | |
243 "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n" | |
244 "Sec-WebSocket-Protocol: sample\r\n" | |
245 "Upgrade: WebSocket\r\n" | |
246 "X-bogus-header: X\r\n" | |
247 "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n" | |
248 "Origin: http://example.com\r\n" | |
249 "X-bogus-header: Y\r\n" | |
250 "\r\n" | |
251 "^n:ds[4U"; | |
252 | |
253 EXPECT_TRUE(request_handler.ParseRequest(kHandshakeRequestMessage, | |
254 strlen(kHandshakeRequestMessage))); | |
255 | |
256 GURL url("ws://example.com/demo"); | |
257 std::string challenge; | |
258 spdy::SpdyHeaderBlock headers; | |
259 ASSERT_TRUE(request_handler.GetRequestHeaderBlock(url, &headers, &challenge)); | |
260 | |
261 EXPECT_EQ(url.spec(), headers["url"]); | |
262 EXPECT_TRUE(headers.find("upgrade") == headers.end()); | |
263 EXPECT_TRUE(headers.find("Upgrade") == headers.end()); | |
264 EXPECT_TRUE(headers.find("connection") == headers.end()); | |
265 EXPECT_TRUE(headers.find("Connection") == headers.end()); | |
266 EXPECT_TRUE(headers.find("Sec-WebSocket-Key1") == headers.end()); | |
267 EXPECT_TRUE(headers.find("sec-websocket-key1") == headers.end()); | |
268 EXPECT_TRUE(headers.find("Sec-WebSocket-Key2") == headers.end()); | |
269 EXPECT_TRUE(headers.find("sec-websocket-key2") == headers.end()); | |
270 EXPECT_EQ("example.com", headers["host"]); | |
271 EXPECT_EQ("http://example.com", headers["origin"]); | |
272 EXPECT_EQ("sample", headers["sec-websocket-protocol"]); | |
273 const char bogus_header[] = "X\0Y"; | |
274 std::string bogus_header_str(bogus_header, sizeof(bogus_header) - 1); | |
275 EXPECT_EQ(bogus_header_str, headers["x-bogus-header"]); | |
276 | |
277 const char expected_challenge[] = "\x31\x6e\x41\x13\x0f\x7e\xd6\x3c^n:ds[4U"; | |
278 | |
279 EXPECT_EQ(expected_challenge, challenge); | |
280 | |
281 headers.clear(); | |
282 | |
283 headers["sec-websocket-origin"] = "http://example.com"; | |
284 headers["sec-websocket-location"] = "ws://example.com/demo"; | |
285 headers["sec-websocket-protocol"] = "sample"; | |
286 | |
287 WebSocketHandshakeResponseHandler response_handler; | |
288 EXPECT_TRUE(response_handler.ParseResponseHeaderBlock(headers, challenge)); | |
289 EXPECT_TRUE(response_handler.HasResponse()); | |
290 | |
291 // Note that order of sec-websocket-* is sensitive with hash_map order. | |
292 static const char* kHandshakeResponseExpectedMessage = | |
293 "HTTP/1.1 101 WebSocket Protocol Handshake\r\n" | |
294 "Upgrade: WebSocket\r\n" | |
295 "Connection: Upgrade\r\n" | |
296 "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
| |
297 "sec-websocket-origin: http://example.com\r\n" | |
298 "sec-websocket-protocol: sample\r\n" | |
299 "\r\n" | |
300 "8jKS'y:G*Co,Wxa-"; | |
301 | |
302 EXPECT_EQ(kHandshakeResponseExpectedMessage, response_handler.GetResponse()); | |
303 } | |
304 | |
305 | |
306 TEST(WebSocketHandshakeHandlerTest, SpdyRequestResponseWithCookies) { | |
307 WebSocketHandshakeRequestHandler request_handler; | |
308 | |
309 // Note that websocket won't use multiple headers in request now. | |
310 static const char* kHandshakeRequestMessage = | |
311 "GET /demo HTTP/1.1\r\n" | |
312 "Host: example.com\r\n" | |
313 "Connection: Upgrade\r\n" | |
314 "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n" | |
315 "Sec-WebSocket-Protocol: sample\r\n" | |
316 "Upgrade: WebSocket\r\n" | |
317 "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n" | |
318 "Origin: http://example.com\r\n" | |
319 "Cookie: WK-websocket-test=1; WK-websocket-test-httponly=1\r\n" | |
320 "\r\n" | |
321 "^n:ds[4U"; | |
322 | |
323 EXPECT_TRUE(request_handler.ParseRequest(kHandshakeRequestMessage, | |
324 strlen(kHandshakeRequestMessage))); | |
325 | |
326 GURL url("ws://example.com/demo"); | |
327 std::string challenge; | |
328 spdy::SpdyHeaderBlock headers; | |
329 ASSERT_TRUE(request_handler.GetRequestHeaderBlock(url, &headers, &challenge)); | |
330 | |
331 EXPECT_EQ(url.spec(), headers["url"]); | |
332 EXPECT_TRUE(headers.find("upgrade") == headers.end()); | |
333 EXPECT_TRUE(headers.find("Upgrade") == headers.end()); | |
334 EXPECT_TRUE(headers.find("connection") == headers.end()); | |
335 EXPECT_TRUE(headers.find("Connection") == headers.end()); | |
336 EXPECT_TRUE(headers.find("Sec-WebSocket-Key1") == headers.end()); | |
337 EXPECT_TRUE(headers.find("sec-websocket-key1") == headers.end()); | |
338 EXPECT_TRUE(headers.find("Sec-WebSocket-Key2") == headers.end()); | |
339 EXPECT_TRUE(headers.find("sec-websocket-key2") == headers.end()); | |
340 EXPECT_EQ("example.com", headers["host"]); | |
341 EXPECT_EQ("http://example.com", headers["origin"]); | |
342 EXPECT_EQ("sample", headers["sec-websocket-protocol"]); | |
343 EXPECT_EQ("WK-websocket-test=1; WK-websocket-test-httponly=1", | |
344 headers["cookie"]); | |
345 | |
346 const char expected_challenge[] = "\x31\x6e\x41\x13\x0f\x7e\xd6\x3c^n:ds[4U"; | |
347 | |
348 EXPECT_EQ(expected_challenge, challenge); | |
349 | |
350 headers.clear(); | |
351 | |
352 headers["sec-websocket-origin"] = "http://example.com"; | |
353 headers["sec-websocket-location"] = "ws://example.com/demo"; | |
354 headers["sec-websocket-protocol"] = "sample"; | |
355 std::string cookie = "WK-websocket-test=1"; | |
356 cookie.append(1, '\0'); | |
357 cookie += "WK-websocket-test-httponly=1; HttpOnly"; | |
358 headers["set-cookie"] = cookie; | |
359 | |
360 WebSocketHandshakeResponseHandler response_handler; | |
361 EXPECT_TRUE(response_handler.ParseResponseHeaderBlock(headers, challenge)); | |
362 EXPECT_TRUE(response_handler.HasResponse()); | |
363 | |
364 // Note that order of sec-websocket-* is sensitive with hash_map order. | |
365 static const char* kHandshakeResponseExpectedMessage = | |
366 "HTTP/1.1 101 WebSocket Protocol Handshake\r\n" | |
367 "Upgrade: WebSocket\r\n" | |
368 "Connection: Upgrade\r\n" | |
369 "sec-websocket-location: ws://example.com/demo\r\n" | |
370 "sec-websocket-origin: http://example.com\r\n" | |
371 "sec-websocket-protocol: sample\r\n" | |
372 "set-cookie: WK-websocket-test=1\r\n" | |
373 "set-cookie: WK-websocket-test-httponly=1; HttpOnly\r\n" | |
374 "\r\n" | |
375 "8jKS'y:G*Co,Wxa-"; | |
376 | |
377 EXPECT_EQ(kHandshakeResponseExpectedMessage, response_handler.GetResponse()); | |
378 } | |
379 | |
236 } // namespace net | 380 } // namespace net |
OLD | NEW |