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 |