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_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 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 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 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_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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |