Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(324)

Side by Side Diff: net/websockets/websocket_handshake_handler_unittest.cc

Issue 6823075: Accept new WebSocket handshake format (hybi-04 and later). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Revise comments. Created 9 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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_FALSE(handler.is_hybi04_handshake());
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, SimpleRequestHybi04Handshake) {
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_TRUE(handler.is_hybi04_handshake());
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_FALSE(handler.is_hybi04_handshake());
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 ReplaceRequestCookiesHybi04Handshake) {
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_TRUE(handler.is_hybi04_handshake());
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_FALSE(handler.expect_hybi04_handshake());
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, SimpleResponseHybi04Handshake) {
188 WebSocketHandshakeResponseHandler handler;
189 handler.set_expect_hybi04_handshake(true);
190 EXPECT_TRUE(handler.expect_hybi04_handshake());
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_FALSE(handler.expect_hybi04_handshake());
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
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 ReplaceResponseCookiesHybi04Handshake) {
252 WebSocketHandshakeResponseHandler handler;
253 handler.set_expect_hybi04_handshake(true);
254 EXPECT_TRUE(handler.expect_hybi04_handshake());
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
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_FALSE(request_handler.is_hybi04_handshake());
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 =
(...skipping 23 matching lines...) Expand all
251 "Connection: Upgrade\r\n" 381 "Connection: Upgrade\r\n"
252 "Sec-WebSocket-Origin: http://example.com\r\n" 382 "Sec-WebSocket-Origin: http://example.com\r\n"
253 "Sec-WebSocket-Location: ws://example.com/demo\r\n" 383 "Sec-WebSocket-Location: ws://example.com/demo\r\n"
254 "Sec-WebSocket-Protocol: sample\r\n" 384 "Sec-WebSocket-Protocol: sample\r\n"
255 "\r\n" 385 "\r\n"
256 "8jKS'y:G*Co,Wxa-"; 386 "8jKS'y:G*Co,Wxa-";
257 387
258 EXPECT_EQ(kHandshakeResponseExpectedMessage, response_handler.GetResponse()); 388 EXPECT_EQ(kHandshakeResponseExpectedMessage, response_handler.GetResponse());
259 } 389 }
260 390
391 TEST(WebSocketHandshakeHandlerTest, HttpRequestResponseHybi04Handshake) {
392 WebSocketHandshakeRequestHandler request_handler;
393
394 static const char* kHandshakeRequestMessage =
395 "GET /demo HTTP/1.1\r\n"
396 "Host: example.com\r\n"
397 "Upgrade: websocket\r\n"
398 "Connection: Upgrade\r\n"
399 "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
400 "Sec-WebSocket-Origin: http://example.com\r\n"
401 "Sec-WebSocket-Protocol: sample\r\n"
402 "Sec-WebSocket-Version: 6\r\n"
403 "\r\n";
404
405 EXPECT_TRUE(request_handler.ParseRequest(kHandshakeRequestMessage,
406 strlen(kHandshakeRequestMessage)));
407 EXPECT_TRUE(request_handler.is_hybi04_handshake());
408
409 GURL url("ws://example.com/demo");
410 std::string challenge;
411 const HttpRequestInfo& request_info =
412 request_handler.GetRequestInfo(url, &challenge);
413
414 EXPECT_EQ(url, request_info.url);
415 EXPECT_EQ("GET", request_info.method);
416 EXPECT_FALSE(request_info.extra_headers.HasHeader("Upgrade"));
417 EXPECT_FALSE(request_info.extra_headers.HasHeader("Connection"));
418 EXPECT_FALSE(request_info.extra_headers.HasHeader("Sec-WebSocket-Key"));
419 std::string value;
420 EXPECT_TRUE(request_info.extra_headers.GetHeader("Host", &value));
421 EXPECT_EQ("example.com", value);
422 EXPECT_TRUE(request_info.extra_headers.GetHeader("Sec-WebSocket-Origin",
423 &value));
424 EXPECT_EQ("http://example.com", value);
425 EXPECT_TRUE(request_info.extra_headers.GetHeader("Sec-WebSocket-Protocol",
426 &value));
427 EXPECT_EQ("sample", value);
428
429 EXPECT_EQ("dGhlIHNhbXBsZSBub25jZQ==", challenge);
430
431 static const char* kHandshakeResponseHeader =
432 "HTTP/1.1 101 Switching Protocols\r\n"
433 "Sec-WebSocket-Protocol: sample\r\n";
434
435 std::string raw_headers =
436 HttpUtil::AssembleRawHeaders(kHandshakeResponseHeader,
437 strlen(kHandshakeResponseHeader));
438 HttpResponseInfo response_info;
439 response_info.headers = new HttpResponseHeaders(raw_headers);
440
441 EXPECT_TRUE(StartsWithASCII(response_info.headers->GetStatusLine(),
442 "HTTP/1.1 101 ", false));
443 EXPECT_FALSE(response_info.headers->HasHeader("Upgrade"));
444 EXPECT_FALSE(response_info.headers->HasHeader("Connection"));
445 EXPECT_FALSE(response_info.headers->HasHeader("Sec-WebSocket-Accept"));
446 EXPECT_TRUE(response_info.headers->HasHeaderValue("Sec-WebSocket-Protocol",
447 "sample"));
448
449 WebSocketHandshakeResponseHandler response_handler;
450 response_handler.set_expect_hybi04_handshake(true);
451 EXPECT_TRUE(response_handler.expect_hybi04_handshake());
452
453 EXPECT_TRUE(response_handler.ParseResponseInfo(response_info, challenge));
454 EXPECT_TRUE(response_handler.HasResponse());
455
456 static const char* kHandshakeResponseExpectedMessage =
457 "HTTP/1.1 101 Switching Protocols\r\n"
458 "Upgrade: websocket\r\n"
459 "Connection: Upgrade\r\n"
460 "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n"
461 "Sec-WebSocket-Protocol: sample\r\n"
462 "\r\n";
463
464 EXPECT_EQ(kHandshakeResponseExpectedMessage, response_handler.GetResponse());
465 }
466
261 TEST(WebSocketHandshakeHandlerTest, SpdyRequestResponse) { 467 TEST(WebSocketHandshakeHandlerTest, SpdyRequestResponse) {
262 WebSocketHandshakeRequestHandler request_handler; 468 WebSocketHandshakeRequestHandler request_handler;
263 469
264 static const char* kHandshakeRequestMessage = 470 static const char* kHandshakeRequestMessage =
265 "GET /demo HTTP/1.1\r\n" 471 "GET /demo HTTP/1.1\r\n"
266 "Host: example.com\r\n" 472 "Host: example.com\r\n"
267 "Connection: Upgrade\r\n" 473 "Connection: Upgrade\r\n"
268 "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n" 474 "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n"
269 "Sec-WebSocket-Protocol: sample\r\n" 475 "Sec-WebSocket-Protocol: sample\r\n"
270 "Upgrade: WebSocket\r\n" 476 "Upgrade: WebSocket\r\n"
271 "X-bogus-header: X\r\n" 477 "X-bogus-header: X\r\n"
272 "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n" 478 "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n"
273 "Origin: http://example.com\r\n" 479 "Origin: http://example.com\r\n"
274 "X-bogus-header: Y\r\n" 480 "X-bogus-header: Y\r\n"
275 "\r\n" 481 "\r\n"
276 "^n:ds[4U"; 482 "^n:ds[4U";
277 483
278 EXPECT_TRUE(request_handler.ParseRequest(kHandshakeRequestMessage, 484 EXPECT_TRUE(request_handler.ParseRequest(kHandshakeRequestMessage,
279 strlen(kHandshakeRequestMessage))); 485 strlen(kHandshakeRequestMessage)));
486 EXPECT_FALSE(request_handler.is_hybi04_handshake());
280 487
281 GURL url("ws://example.com/demo"); 488 GURL url("ws://example.com/demo");
282 std::string challenge; 489 std::string challenge;
283 spdy::SpdyHeaderBlock headers; 490 spdy::SpdyHeaderBlock headers;
284 ASSERT_TRUE(request_handler.GetRequestHeaderBlock(url, &headers, &challenge)); 491 ASSERT_TRUE(request_handler.GetRequestHeaderBlock(url, &headers, &challenge));
285 492
286 EXPECT_EQ(url.spec(), headers["url"]); 493 EXPECT_EQ(url.spec(), headers["url"]);
287 EXPECT_TRUE(headers.find("upgrade") == headers.end()); 494 EXPECT_TRUE(headers.find("upgrade") == headers.end());
288 EXPECT_TRUE(headers.find("Upgrade") == headers.end()); 495 EXPECT_TRUE(headers.find("Upgrade") == headers.end());
289 EXPECT_TRUE(headers.find("connection") == headers.end()); 496 EXPECT_TRUE(headers.find("connection") == headers.end());
(...skipping 13 matching lines...) Expand all
303 510
304 EXPECT_EQ(expected_challenge, challenge); 511 EXPECT_EQ(expected_challenge, challenge);
305 512
306 headers.clear(); 513 headers.clear();
307 514
308 headers["sec-websocket-origin"] = "http://example.com"; 515 headers["sec-websocket-origin"] = "http://example.com";
309 headers["sec-websocket-location"] = "ws://example.com/demo"; 516 headers["sec-websocket-location"] = "ws://example.com/demo";
310 headers["sec-websocket-protocol"] = "sample"; 517 headers["sec-websocket-protocol"] = "sample";
311 518
312 WebSocketHandshakeResponseHandler response_handler; 519 WebSocketHandshakeResponseHandler response_handler;
520 EXPECT_FALSE(response_handler.expect_hybi04_handshake());
313 EXPECT_TRUE(response_handler.ParseResponseHeaderBlock(headers, challenge)); 521 EXPECT_TRUE(response_handler.ParseResponseHeaderBlock(headers, challenge));
314 EXPECT_TRUE(response_handler.HasResponse()); 522 EXPECT_TRUE(response_handler.HasResponse());
315 523
316 // Note that order of sec-websocket-* is sensitive with hash_map order. 524 // Note that order of sec-websocket-* is sensitive with hash_map order.
317 static const char* kHandshakeResponseExpectedMessage = 525 static const char* kHandshakeResponseExpectedMessage =
318 "HTTP/1.1 101 WebSocket Protocol Handshake\r\n" 526 "HTTP/1.1 101 WebSocket Protocol Handshake\r\n"
319 "Upgrade: WebSocket\r\n" 527 "Upgrade: WebSocket\r\n"
320 "Connection: Upgrade\r\n" 528 "Connection: Upgrade\r\n"
321 "sec-websocket-location: ws://example.com/demo\r\n" 529 "sec-websocket-location: ws://example.com/demo\r\n"
322 "sec-websocket-origin: http://example.com\r\n" 530 "sec-websocket-origin: http://example.com\r\n"
323 "sec-websocket-protocol: sample\r\n" 531 "sec-websocket-protocol: sample\r\n"
324 "\r\n" 532 "\r\n"
325 "8jKS'y:G*Co,Wxa-"; 533 "8jKS'y:G*Co,Wxa-";
326 534
327 EXPECT_EQ(kHandshakeResponseExpectedMessage, response_handler.GetResponse()); 535 EXPECT_EQ(kHandshakeResponseExpectedMessage, response_handler.GetResponse());
328 } 536 }
329 537
538 TEST(WebSocketHandshakeHandlerTest, SpdyRequestResponseHybi04Handshake) {
539 WebSocketHandshakeRequestHandler request_handler;
540
541 static const char* kHandshakeRequestMessage =
542 "GET /demo HTTP/1.1\r\n"
543 "Host: example.com\r\n"
544 "Upgrade: websocket\r\n"
545 "Connection: Upgrade\r\n"
546 "X-bogus-header: X\r\n"
547 "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
548 "Sec-WebSocket-Origin: http://example.com\r\n"
549 "Sec-WebSocket-Protocol: sample\r\n"
550 "Sec-WebSocket-Version: 6\r\n"
551 "X-bogus-header: Y\r\n"
552 "\r\n";
553
554 EXPECT_TRUE(request_handler.ParseRequest(kHandshakeRequestMessage,
555 strlen(kHandshakeRequestMessage)));
556 EXPECT_TRUE(request_handler.is_hybi04_handshake());
557
558 GURL url("ws://example.com/demo");
559 std::string challenge;
560 spdy::SpdyHeaderBlock headers;
561 ASSERT_TRUE(request_handler.GetRequestHeaderBlock(url, &headers, &challenge));
562
563 EXPECT_EQ(url.spec(), headers["url"]);
564 EXPECT_TRUE(headers.find("upgrade") == headers.end());
565 EXPECT_TRUE(headers.find("Upgrade") == headers.end());
566 EXPECT_TRUE(headers.find("connection") == headers.end());
567 EXPECT_TRUE(headers.find("Connection") == headers.end());
568 EXPECT_TRUE(headers.find("Sec-WebSocket-Key") == headers.end());
569 EXPECT_TRUE(headers.find("sec-websocket-key") == headers.end());
570 EXPECT_EQ("example.com", headers["host"]);
571 EXPECT_EQ("http://example.com", headers["sec-websocket-origin"]);
572 EXPECT_EQ("sample", headers["sec-websocket-protocol"]);
573 const char bogus_header[] = "X\0Y";
574 std::string bogus_header_str(bogus_header, sizeof(bogus_header) - 1);
575 EXPECT_EQ(bogus_header_str, headers["x-bogus-header"]);
576
577 EXPECT_EQ("dGhlIHNhbXBsZSBub25jZQ==", challenge);
578
579 headers.clear();
580
581 headers["sec-websocket-protocol"] = "sample";
582
583 WebSocketHandshakeResponseHandler response_handler;
584 response_handler.set_expect_hybi04_handshake(true);
585 EXPECT_TRUE(response_handler.expect_hybi04_handshake());
586 EXPECT_TRUE(response_handler.ParseResponseHeaderBlock(headers, challenge));
587 EXPECT_TRUE(response_handler.HasResponse());
588
589 // Note that order of sec-websocket-* is sensitive with hash_map order.
590 static const char* kHandshakeResponseExpectedMessage =
591 "HTTP/1.1 101 Switching Protocols\r\n"
592 "Upgrade: websocket\r\n"
593 "Connection: Upgrade\r\n"
594 "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n"
595 "sec-websocket-protocol: sample\r\n"
596 "\r\n";
597
598 EXPECT_EQ(kHandshakeResponseExpectedMessage, response_handler.GetResponse());
599 }
330 600
331 TEST(WebSocketHandshakeHandlerTest, SpdyRequestResponseWithCookies) { 601 TEST(WebSocketHandshakeHandlerTest, SpdyRequestResponseWithCookies) {
332 WebSocketHandshakeRequestHandler request_handler; 602 WebSocketHandshakeRequestHandler request_handler;
333 603
334 // Note that websocket won't use multiple headers in request now. 604 // Note that websocket won't use multiple headers in request now.
335 static const char* kHandshakeRequestMessage = 605 static const char* kHandshakeRequestMessage =
336 "GET /demo HTTP/1.1\r\n" 606 "GET /demo HTTP/1.1\r\n"
337 "Host: example.com\r\n" 607 "Host: example.com\r\n"
338 "Connection: Upgrade\r\n" 608 "Connection: Upgrade\r\n"
339 "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n" 609 "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n"
340 "Sec-WebSocket-Protocol: sample\r\n" 610 "Sec-WebSocket-Protocol: sample\r\n"
341 "Upgrade: WebSocket\r\n" 611 "Upgrade: WebSocket\r\n"
342 "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n" 612 "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n"
343 "Origin: http://example.com\r\n" 613 "Origin: http://example.com\r\n"
344 "Cookie: WK-websocket-test=1; WK-websocket-test-httponly=1\r\n" 614 "Cookie: WK-websocket-test=1; WK-websocket-test-httponly=1\r\n"
345 "\r\n" 615 "\r\n"
346 "^n:ds[4U"; 616 "^n:ds[4U";
347 617
348 EXPECT_TRUE(request_handler.ParseRequest(kHandshakeRequestMessage, 618 EXPECT_TRUE(request_handler.ParseRequest(kHandshakeRequestMessage,
349 strlen(kHandshakeRequestMessage))); 619 strlen(kHandshakeRequestMessage)));
620 EXPECT_FALSE(request_handler.is_hybi04_handshake());
350 621
351 GURL url("ws://example.com/demo"); 622 GURL url("ws://example.com/demo");
352 std::string challenge; 623 std::string challenge;
353 spdy::SpdyHeaderBlock headers; 624 spdy::SpdyHeaderBlock headers;
354 ASSERT_TRUE(request_handler.GetRequestHeaderBlock(url, &headers, &challenge)); 625 ASSERT_TRUE(request_handler.GetRequestHeaderBlock(url, &headers, &challenge));
355 626
356 EXPECT_EQ(url.spec(), headers["url"]); 627 EXPECT_EQ(url.spec(), headers["url"]);
357 EXPECT_TRUE(headers.find("upgrade") == headers.end()); 628 EXPECT_TRUE(headers.find("upgrade") == headers.end());
358 EXPECT_TRUE(headers.find("Upgrade") == headers.end()); 629 EXPECT_TRUE(headers.find("Upgrade") == headers.end());
359 EXPECT_TRUE(headers.find("connection") == headers.end()); 630 EXPECT_TRUE(headers.find("connection") == headers.end());
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
395 "sec-websocket-origin: http://example.com\r\n" 666 "sec-websocket-origin: http://example.com\r\n"
396 "sec-websocket-protocol: sample\r\n" 667 "sec-websocket-protocol: sample\r\n"
397 "set-cookie: WK-websocket-test=1\r\n" 668 "set-cookie: WK-websocket-test=1\r\n"
398 "set-cookie: WK-websocket-test-httponly=1; HttpOnly\r\n" 669 "set-cookie: WK-websocket-test-httponly=1; HttpOnly\r\n"
399 "\r\n" 670 "\r\n"
400 "8jKS'y:G*Co,Wxa-"; 671 "8jKS'y:G*Co,Wxa-";
401 672
402 EXPECT_EQ(kHandshakeResponseExpectedMessage, response_handler.GetResponse()); 673 EXPECT_EQ(kHandshakeResponseExpectedMessage, response_handler.GetResponse());
403 } 674 }
404 675
676 TEST(WebSocketHandshakeHandlerTest,
677 SpdyRequestResponseWithCookiesHybi04Handshake) {
678 WebSocketHandshakeRequestHandler request_handler;
679
680 // Note that websocket won't use multiple headers in request now.
681 static const char* kHandshakeRequestMessage =
682 "GET /demo HTTP/1.1\r\n"
683 "Host: example.com\r\n"
684 "Upgrade: websocket\r\n"
685 "Connection: Upgrade\r\n"
686 "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
687 "Sec-WebSocket-Origin: http://example.com\r\n"
688 "Sec-WebSocket-Protocol: sample\r\n"
689 "Sec-WebSocket-Version: 6\r\n"
690 "Cookie: WK-websocket-test=1; WK-websocket-test-httponly=1\r\n"
691 "\r\n";
692
693 EXPECT_TRUE(request_handler.ParseRequest(kHandshakeRequestMessage,
694 strlen(kHandshakeRequestMessage)));
695 EXPECT_TRUE(request_handler.is_hybi04_handshake());
696
697 GURL url("ws://example.com/demo");
698 std::string challenge;
699 spdy::SpdyHeaderBlock headers;
700 ASSERT_TRUE(request_handler.GetRequestHeaderBlock(url, &headers, &challenge));
701
702 EXPECT_EQ(url.spec(), headers["url"]);
703 EXPECT_TRUE(headers.find("upgrade") == headers.end());
704 EXPECT_TRUE(headers.find("Upgrade") == headers.end());
705 EXPECT_TRUE(headers.find("connection") == headers.end());
706 EXPECT_TRUE(headers.find("Connection") == headers.end());
707 EXPECT_TRUE(headers.find("Sec-WebSocket-Key") == headers.end());
708 EXPECT_TRUE(headers.find("sec-websocket-key") == headers.end());
709 EXPECT_EQ("example.com", headers["host"]);
710 EXPECT_EQ("http://example.com", headers["sec-websocket-origin"]);
711 EXPECT_EQ("sample", headers["sec-websocket-protocol"]);
712 EXPECT_EQ("WK-websocket-test=1; WK-websocket-test-httponly=1",
713 headers["cookie"]);
714
715 EXPECT_EQ("dGhlIHNhbXBsZSBub25jZQ==", challenge);
716
717 headers.clear();
718
719 headers["sec-websocket-protocol"] = "sample";
720 std::string cookie = "WK-websocket-test=1";
721 cookie.append(1, '\0');
722 cookie += "WK-websocket-test-httponly=1; HttpOnly";
723 headers["set-cookie"] = cookie;
724
725 WebSocketHandshakeResponseHandler response_handler;
726 response_handler.set_expect_hybi04_handshake(true);
727 EXPECT_TRUE(response_handler.expect_hybi04_handshake());
728 EXPECT_TRUE(response_handler.ParseResponseHeaderBlock(headers, challenge));
729 EXPECT_TRUE(response_handler.HasResponse());
730
731 // Note that order of sec-websocket-* is sensitive with hash_map order.
732 static const char* kHandshakeResponseExpectedMessage =
733 "HTTP/1.1 101 Switching Protocols\r\n"
734 "Upgrade: websocket\r\n"
735 "Connection: Upgrade\r\n"
736 "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n"
737 "sec-websocket-protocol: sample\r\n"
738 "set-cookie: WK-websocket-test=1\r\n"
739 "set-cookie: WK-websocket-test-httponly=1; HttpOnly\r\n"
740 "\r\n";
741
742 EXPECT_EQ(kHandshakeResponseExpectedMessage, response_handler.GetResponse());
743 }
744
405 } // namespace net 745 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698