OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "net/http/http_network_transaction.h" | 5 #include "net/http/http_network_transaction.h" |
6 | 6 |
7 #include <math.h> // ceil | 7 #include <math.h> // ceil |
8 #include <stdarg.h> | 8 #include <stdarg.h> |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
85 const base::string16 kFoo(ASCIIToUTF16("foo")); | 85 const base::string16 kFoo(ASCIIToUTF16("foo")); |
86 const base::string16 kFoo2(ASCIIToUTF16("foo2")); | 86 const base::string16 kFoo2(ASCIIToUTF16("foo2")); |
87 const base::string16 kFoo3(ASCIIToUTF16("foo3")); | 87 const base::string16 kFoo3(ASCIIToUTF16("foo3")); |
88 const base::string16 kFou(ASCIIToUTF16("fou")); | 88 const base::string16 kFou(ASCIIToUTF16("fou")); |
89 const base::string16 kSecond(ASCIIToUTF16("second")); | 89 const base::string16 kSecond(ASCIIToUTF16("second")); |
90 const base::string16 kTestingNTLM(ASCIIToUTF16("testing-ntlm")); | 90 const base::string16 kTestingNTLM(ASCIIToUTF16("testing-ntlm")); |
91 const base::string16 kWrongPassword(ASCIIToUTF16("wrongpassword")); | 91 const base::string16 kWrongPassword(ASCIIToUTF16("wrongpassword")); |
92 | 92 |
93 int GetIdleSocketCountInTransportSocketPool(net::HttpNetworkSession* session) { | 93 int GetIdleSocketCountInTransportSocketPool(net::HttpNetworkSession* session) { |
94 return session->GetTransportSocketPool( | 94 return session->GetTransportSocketPool( |
95 net::HttpNetworkSession::NORMAL_SOCKET_POOL)->IdleSocketCount(); | 95 net::HttpNetworkSession::NORMAL_SOCKET_POOL) |
| 96 ->IdleSocketCount(); |
96 } | 97 } |
97 | 98 |
98 int GetIdleSocketCountInSSLSocketPool(net::HttpNetworkSession* session) { | 99 int GetIdleSocketCountInSSLSocketPool(net::HttpNetworkSession* session) { |
99 return session->GetSSLSocketPool( | 100 return session->GetSSLSocketPool(net::HttpNetworkSession::NORMAL_SOCKET_POOL) |
100 net::HttpNetworkSession::NORMAL_SOCKET_POOL)->IdleSocketCount(); | 101 ->IdleSocketCount(); |
101 } | 102 } |
102 | 103 |
103 bool IsTransportSocketPoolStalled(net::HttpNetworkSession* session) { | 104 bool IsTransportSocketPoolStalled(net::HttpNetworkSession* session) { |
104 return session->GetTransportSocketPool( | 105 return session->GetTransportSocketPool( |
105 net::HttpNetworkSession::NORMAL_SOCKET_POOL)->IsStalled(); | 106 net::HttpNetworkSession::NORMAL_SOCKET_POOL)->IsStalled(); |
106 } | 107 } |
107 | 108 |
108 // Takes in a Value created from a NetLogHttpResponseParameter, and returns | 109 // Takes in a Value created from a NetLogHttpResponseParameter, and returns |
109 // a JSONified list of headers as a single string. Uses single quotes instead | 110 // a JSONified list of headers as a single string. Uses single quotes instead |
110 // of double quotes for easier comparison. Returns false on failure. | 111 // of double quotes for easier comparison. Returns false on failure. |
111 bool GetHeaders(base::DictionaryValue* params, std::string* headers) { | 112 bool GetHeaders(base::DictionaryValue* params, std::string* headers) { |
112 if (!params) | 113 if (!params) |
113 return false; | 114 return false; |
114 base::ListValue* header_list; | 115 base::ListValue* header_list; |
115 if (!params->GetList("headers", &header_list)) | 116 if (!params->GetList("headers", &header_list)) |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
167 // used. | 168 // used. |
168 void TestLoadTimingReusedWithPac(const net::LoadTimingInfo& load_timing_info) { | 169 void TestLoadTimingReusedWithPac(const net::LoadTimingInfo& load_timing_info) { |
169 EXPECT_TRUE(load_timing_info.socket_reused); | 170 EXPECT_TRUE(load_timing_info.socket_reused); |
170 EXPECT_NE(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id); | 171 EXPECT_NE(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id); |
171 | 172 |
172 net::ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing); | 173 net::ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing); |
173 | 174 |
174 EXPECT_FALSE(load_timing_info.proxy_resolve_start.is_null()); | 175 EXPECT_FALSE(load_timing_info.proxy_resolve_start.is_null()); |
175 EXPECT_LE(load_timing_info.proxy_resolve_start, | 176 EXPECT_LE(load_timing_info.proxy_resolve_start, |
176 load_timing_info.proxy_resolve_end); | 177 load_timing_info.proxy_resolve_end); |
177 EXPECT_LE(load_timing_info.proxy_resolve_end, | 178 EXPECT_LE(load_timing_info.proxy_resolve_end, load_timing_info.send_start); |
178 load_timing_info.send_start); | |
179 EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end); | 179 EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end); |
180 | 180 |
181 // Set at a higher level. | 181 // Set at a higher level. |
182 EXPECT_TRUE(load_timing_info.request_start_time.is_null()); | 182 EXPECT_TRUE(load_timing_info.request_start_time.is_null()); |
183 EXPECT_TRUE(load_timing_info.request_start.is_null()); | 183 EXPECT_TRUE(load_timing_info.request_start.is_null()); |
184 EXPECT_TRUE(load_timing_info.receive_headers_end.is_null()); | 184 EXPECT_TRUE(load_timing_info.receive_headers_end.is_null()); |
185 } | 185 } |
186 | 186 |
187 // Tests LoadTimingInfo in the case a new socket is used and a PAC script is | 187 // Tests LoadTimingInfo in the case a new socket is used and a PAC script is |
188 // used. | 188 // used. |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
234 HttpNetworkSession::NORMAL_SOCKET_POOL, old_max_group_sockets_); | 234 HttpNetworkSession::NORMAL_SOCKET_POOL, old_max_group_sockets_); |
235 } | 235 } |
236 | 236 |
237 protected: | 237 protected: |
238 HttpNetworkTransactionTest() | 238 HttpNetworkTransactionTest() |
239 : spdy_util_(GetParam()), | 239 : spdy_util_(GetParam()), |
240 session_deps_(GetParam()), | 240 session_deps_(GetParam()), |
241 old_max_group_sockets_(ClientSocketPoolManager::max_sockets_per_group( | 241 old_max_group_sockets_(ClientSocketPoolManager::max_sockets_per_group( |
242 HttpNetworkSession::NORMAL_SOCKET_POOL)), | 242 HttpNetworkSession::NORMAL_SOCKET_POOL)), |
243 old_max_pool_sockets_(ClientSocketPoolManager::max_sockets_per_pool( | 243 old_max_pool_sockets_(ClientSocketPoolManager::max_sockets_per_pool( |
244 HttpNetworkSession::NORMAL_SOCKET_POOL)) { | 244 HttpNetworkSession::NORMAL_SOCKET_POOL)) {} |
245 } | |
246 | 245 |
247 struct SimpleGetHelperResult { | 246 struct SimpleGetHelperResult { |
248 int rv; | 247 int rv; |
249 std::string status_line; | 248 std::string status_line; |
250 std::string response_data; | 249 std::string response_data; |
251 int64 totalReceivedBytes; | 250 int64 totalReceivedBytes; |
252 LoadTimingInfo load_timing_info; | 251 LoadTimingInfo load_timing_info; |
253 }; | 252 }; |
254 | 253 |
255 virtual void SetUp() { | 254 virtual void SetUp() { |
256 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); | 255 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); |
257 base::MessageLoop::current()->RunUntilIdle(); | 256 base::MessageLoop::current()->RunUntilIdle(); |
258 } | 257 } |
259 | 258 |
260 virtual void TearDown() { | 259 virtual void TearDown() { |
261 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); | 260 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); |
262 base::MessageLoop::current()->RunUntilIdle(); | 261 base::MessageLoop::current()->RunUntilIdle(); |
263 // Empty the current queue. | 262 // Empty the current queue. |
264 base::MessageLoop::current()->RunUntilIdle(); | 263 base::MessageLoop::current()->RunUntilIdle(); |
265 PlatformTest::TearDown(); | 264 PlatformTest::TearDown(); |
266 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); | 265 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); |
267 base::MessageLoop::current()->RunUntilIdle(); | 266 base::MessageLoop::current()->RunUntilIdle(); |
268 HttpStreamFactory::set_use_alternate_protocols(false); | 267 HttpStreamFactory::set_use_alternate_protocols(false); |
269 HttpStreamFactory::SetNextProtos(std::vector<NextProto>()); | 268 HttpStreamFactory::SetNextProtos(std::vector<NextProto>()); |
270 } | 269 } |
271 | 270 |
272 // This is the expected return from a current server advertising SPDY. | 271 // This is the expected return from a current server advertising SPDY. |
273 std::string GetAlternateProtocolHttpHeader() { | 272 std::string GetAlternateProtocolHttpHeader() { |
274 return | 273 return std::string("Alternate-Protocol: 443:") + |
275 std::string("Alternate-Protocol: 443:") + | 274 AlternateProtocolToString( |
276 AlternateProtocolToString(AlternateProtocolFromNextProto(GetParam())) + | 275 AlternateProtocolFromNextProto(GetParam())) + |
277 "\r\n\r\n"; | 276 "\r\n\r\n"; |
278 } | 277 } |
279 | 278 |
280 // Either |write_failure| specifies a write failure or |read_failure| | 279 // Either |write_failure| specifies a write failure or |read_failure| |
281 // specifies a read failure when using a reused socket. In either case, the | 280 // specifies a read failure when using a reused socket. In either case, the |
282 // failure should cause the network transaction to resend the request, and the | 281 // failure should cause the network transaction to resend the request, and the |
283 // other argument should be NULL. | 282 // other argument should be NULL. |
284 void KeepAliveConnectionResendRequestTest(const MockWrite* write_failure, | 283 void KeepAliveConnectionResendRequestTest(const MockWrite* write_failure, |
285 const MockRead* read_failure); | 284 const MockRead* read_failure); |
286 | 285 |
287 // Either |write_failure| specifies a write failure or |read_failure| | 286 // Either |write_failure| specifies a write failure or |read_failure| |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
338 | 337 |
339 EXPECT_EQ("127.0.0.1", response->socket_address.host()); | 338 EXPECT_EQ("127.0.0.1", response->socket_address.host()); |
340 EXPECT_EQ(80, response->socket_address.port()); | 339 EXPECT_EQ(80, response->socket_address.port()); |
341 | 340 |
342 rv = ReadTransaction(trans.get(), &out.response_data); | 341 rv = ReadTransaction(trans.get(), &out.response_data); |
343 EXPECT_EQ(OK, rv); | 342 EXPECT_EQ(OK, rv); |
344 | 343 |
345 net::CapturingNetLog::CapturedEntryList entries; | 344 net::CapturingNetLog::CapturedEntryList entries; |
346 log.GetEntries(&entries); | 345 log.GetEntries(&entries); |
347 size_t pos = ExpectLogContainsSomewhere( | 346 size_t pos = ExpectLogContainsSomewhere( |
348 entries, 0, NetLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST_HEADERS, | 347 entries, |
| 348 0, |
| 349 NetLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST_HEADERS, |
349 NetLog::PHASE_NONE); | 350 NetLog::PHASE_NONE); |
350 ExpectLogContainsSomewhere( | 351 ExpectLogContainsSomewhere( |
351 entries, pos, | 352 entries, |
| 353 pos, |
352 NetLog::TYPE_HTTP_TRANSACTION_READ_RESPONSE_HEADERS, | 354 NetLog::TYPE_HTTP_TRANSACTION_READ_RESPONSE_HEADERS, |
353 NetLog::PHASE_NONE); | 355 NetLog::PHASE_NONE); |
354 | 356 |
355 std::string line; | 357 std::string line; |
356 EXPECT_TRUE(entries[pos].GetStringValue("line", &line)); | 358 EXPECT_TRUE(entries[pos].GetStringValue("line", &line)); |
357 EXPECT_EQ("GET / HTTP/1.1\r\n", line); | 359 EXPECT_EQ("GET / HTTP/1.1\r\n", line); |
358 | 360 |
359 HttpRequestHeaders request_headers; | 361 HttpRequestHeaders request_headers; |
360 EXPECT_TRUE(trans->GetFullRequestHeaders(&request_headers)); | 362 EXPECT_TRUE(trans->GetFullRequestHeaders(&request_headers)); |
361 std::string value; | 363 std::string value; |
362 EXPECT_TRUE(request_headers.GetHeader("Host", &value)); | 364 EXPECT_TRUE(request_headers.GetHeader("Host", &value)); |
363 EXPECT_EQ("www.google.com", value); | 365 EXPECT_EQ("www.google.com", value); |
364 EXPECT_TRUE(request_headers.GetHeader("Connection", &value)); | 366 EXPECT_TRUE(request_headers.GetHeader("Connection", &value)); |
365 EXPECT_EQ("keep-alive", value); | 367 EXPECT_EQ("keep-alive", value); |
366 | 368 |
367 std::string response_headers; | 369 std::string response_headers; |
368 EXPECT_TRUE(GetHeaders(entries[pos].params.get(), &response_headers)); | 370 EXPECT_TRUE(GetHeaders(entries[pos].params.get(), &response_headers)); |
369 EXPECT_EQ("['Host: www.google.com','Connection: keep-alive']", | 371 EXPECT_EQ("['Host: www.google.com','Connection: keep-alive']", |
370 response_headers); | 372 response_headers); |
371 | 373 |
372 out.totalReceivedBytes = trans->GetTotalReceivedBytes(); | 374 out.totalReceivedBytes = trans->GetTotalReceivedBytes(); |
373 return out; | 375 return out; |
374 } | 376 } |
375 | 377 |
376 SimpleGetHelperResult SimpleGetHelper(MockRead data_reads[], | 378 SimpleGetHelperResult SimpleGetHelper(MockRead data_reads[], |
377 size_t reads_count) { | 379 size_t reads_count) { |
378 StaticSocketDataProvider reads(data_reads, reads_count, NULL, 0); | 380 StaticSocketDataProvider reads(data_reads, reads_count, NULL, 0); |
379 StaticSocketDataProvider* data[] = { &reads }; | 381 StaticSocketDataProvider* data[] = {&reads}; |
380 return SimpleGetHelperForData(data, 1); | 382 return SimpleGetHelperForData(data, 1); |
381 } | 383 } |
382 | 384 |
383 int64 ReadsSize(MockRead data_reads[], size_t reads_count) { | 385 int64 ReadsSize(MockRead data_reads[], size_t reads_count) { |
384 int64 size = 0; | 386 int64 size = 0; |
385 for (size_t i = 0; i < reads_count; ++i) | 387 for (size_t i = 0; i < reads_count; ++i) |
386 size += data_reads[i].data_len; | 388 size += data_reads[i].data_len; |
387 return size; | 389 return size; |
388 } | 390 } |
389 | 391 |
390 void ConnectStatusHelperWithExpectedStatus(const MockRead& status, | 392 void ConnectStatusHelperWithExpectedStatus(const MockRead& status, |
391 int expected_status); | 393 int expected_status); |
392 | 394 |
393 void ConnectStatusHelper(const MockRead& status); | 395 void ConnectStatusHelper(const MockRead& status); |
394 | 396 |
395 void BypassHostCacheOnRefreshHelper(int load_flags); | 397 void BypassHostCacheOnRefreshHelper(int load_flags); |
396 | 398 |
397 void CheckErrorIsPassedBack(int error, IoMode mode); | 399 void CheckErrorIsPassedBack(int error, IoMode mode); |
398 | 400 |
399 SpdyTestUtil spdy_util_; | 401 SpdyTestUtil spdy_util_; |
400 SpdySessionDependencies session_deps_; | 402 SpdySessionDependencies session_deps_; |
401 | 403 |
402 // Original socket limits. Some tests set these. Safest to always restore | 404 // Original socket limits. Some tests set these. Safest to always restore |
403 // them once each test has been run. | 405 // them once each test has been run. |
404 int old_max_group_sockets_; | 406 int old_max_group_sockets_; |
405 int old_max_pool_sockets_; | 407 int old_max_pool_sockets_; |
406 }; | 408 }; |
407 | 409 |
408 INSTANTIATE_TEST_CASE_P( | 410 INSTANTIATE_TEST_CASE_P(NextProto, |
409 NextProto, | 411 HttpNetworkTransactionTest, |
410 HttpNetworkTransactionTest, | 412 testing::Values(kProtoDeprecatedSPDY2, |
411 testing::Values(kProtoDeprecatedSPDY2, | 413 kProtoSPDY3, |
412 kProtoSPDY3, kProtoSPDY31, kProtoSPDY4)); | 414 kProtoSPDY31, |
| 415 kProtoSPDY4)); |
413 | 416 |
414 namespace { | 417 namespace { |
415 | 418 |
416 class BeforeNetworkStartHandler { | 419 class BeforeNetworkStartHandler { |
417 public: | 420 public: |
418 explicit BeforeNetworkStartHandler(bool defer) | 421 explicit BeforeNetworkStartHandler(bool defer) |
419 : defer_on_before_network_start_(defer), | 422 : defer_on_before_network_start_(defer), |
420 observed_before_network_start_(false) {} | 423 observed_before_network_start_(false) {} |
421 | 424 |
422 void OnBeforeNetworkStart(bool* defer) { | 425 void OnBeforeNetworkStart(bool* defer) { |
(...skipping 10 matching lines...) Expand all Loading... |
433 bool observed_before_network_start_; | 436 bool observed_before_network_start_; |
434 | 437 |
435 DISALLOW_COPY_AND_ASSIGN(BeforeNetworkStartHandler); | 438 DISALLOW_COPY_AND_ASSIGN(BeforeNetworkStartHandler); |
436 }; | 439 }; |
437 | 440 |
438 // Fill |str| with a long header list that consumes >= |size| bytes. | 441 // Fill |str| with a long header list that consumes >= |size| bytes. |
439 void FillLargeHeadersString(std::string* str, int size) { | 442 void FillLargeHeadersString(std::string* str, int size) { |
440 const char* row = | 443 const char* row = |
441 "SomeHeaderName: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n"; | 444 "SomeHeaderName: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n"; |
442 const int sizeof_row = strlen(row); | 445 const int sizeof_row = strlen(row); |
443 const int num_rows = static_cast<int>( | 446 const int num_rows = |
444 ceil(static_cast<float>(size) / sizeof_row)); | 447 static_cast<int>(ceil(static_cast<float>(size) / sizeof_row)); |
445 const int sizeof_data = num_rows * sizeof_row; | 448 const int sizeof_data = num_rows * sizeof_row; |
446 DCHECK(sizeof_data >= size); | 449 DCHECK(sizeof_data >= size); |
447 str->reserve(sizeof_data); | 450 str->reserve(sizeof_data); |
448 | 451 |
449 for (int i = 0; i < num_rows; ++i) | 452 for (int i = 0; i < num_rows; ++i) |
450 str->append(row, sizeof_row); | 453 str->append(row, sizeof_row); |
451 } | 454 } |
452 | 455 |
453 // Alternative functions that eliminate randomness and dependency on the local | 456 // Alternative functions that eliminate randomness and dependency on the local |
454 // host name so that the generated NTLM messages are reproducible. | 457 // host name so that the generated NTLM messages are reproducible. |
455 void MockGenerateRandom1(uint8* output, size_t n) { | 458 void MockGenerateRandom1(uint8* output, size_t n) { |
456 static const uint8 bytes[] = { | 459 static const uint8 bytes[] = {0x55, 0x29, 0x66, 0x26, 0x6b, 0x9c, 0x73, 0x54}; |
457 0x55, 0x29, 0x66, 0x26, 0x6b, 0x9c, 0x73, 0x54 | |
458 }; | |
459 static size_t current_byte = 0; | 460 static size_t current_byte = 0; |
460 for (size_t i = 0; i < n; ++i) { | 461 for (size_t i = 0; i < n; ++i) { |
461 output[i] = bytes[current_byte++]; | 462 output[i] = bytes[current_byte++]; |
462 current_byte %= arraysize(bytes); | 463 current_byte %= arraysize(bytes); |
463 } | 464 } |
464 } | 465 } |
465 | 466 |
466 void MockGenerateRandom2(uint8* output, size_t n) { | 467 void MockGenerateRandom2(uint8* output, size_t n) { |
467 static const uint8 bytes[] = { | 468 static const uint8 bytes[] = {0x96, 0x79, 0x85, 0xe7, 0x49, 0x93, 0x70, 0xa1, |
468 0x96, 0x79, 0x85, 0xe7, 0x49, 0x93, 0x70, 0xa1, | 469 0x4e, 0xe7, 0x87, 0x45, 0x31, 0x5b, 0xd3, 0x1f}; |
469 0x4e, 0xe7, 0x87, 0x45, 0x31, 0x5b, 0xd3, 0x1f | |
470 }; | |
471 static size_t current_byte = 0; | 470 static size_t current_byte = 0; |
472 for (size_t i = 0; i < n; ++i) { | 471 for (size_t i = 0; i < n; ++i) { |
473 output[i] = bytes[current_byte++]; | 472 output[i] = bytes[current_byte++]; |
474 current_byte %= arraysize(bytes); | 473 current_byte %= arraysize(bytes); |
475 } | 474 } |
476 } | 475 } |
477 | 476 |
478 std::string MockGetHostName() { | 477 std::string MockGetHostName() { |
479 return "WTC-WIN7"; | 478 return "WTC-WIN7"; |
480 } | 479 } |
481 | 480 |
482 template<typename ParentPool> | 481 template <typename ParentPool> |
483 class CaptureGroupNameSocketPool : public ParentPool { | 482 class CaptureGroupNameSocketPool : public ParentPool { |
484 public: | 483 public: |
485 CaptureGroupNameSocketPool(HostResolver* host_resolver, | 484 CaptureGroupNameSocketPool(HostResolver* host_resolver, |
486 CertVerifier* cert_verifier); | 485 CertVerifier* cert_verifier); |
487 | 486 |
488 const std::string last_group_name_received() const { | 487 const std::string last_group_name_received() const { |
489 return last_group_name_; | 488 return last_group_name_; |
490 } | 489 } |
491 | 490 |
492 virtual int RequestSocket(const std::string& group_name, | 491 virtual int RequestSocket(const std::string& group_name, |
493 const void* socket_params, | 492 const void* socket_params, |
494 RequestPriority priority, | 493 RequestPriority priority, |
495 ClientSocketHandle* handle, | 494 ClientSocketHandle* handle, |
496 const CompletionCallback& callback, | 495 const CompletionCallback& callback, |
497 const BoundNetLog& net_log) { | 496 const BoundNetLog& net_log) { |
498 last_group_name_ = group_name; | 497 last_group_name_ = group_name; |
499 return ERR_IO_PENDING; | 498 return ERR_IO_PENDING; |
500 } | 499 } |
501 virtual void CancelRequest(const std::string& group_name, | 500 virtual void CancelRequest(const std::string& group_name, |
502 ClientSocketHandle* handle) {} | 501 ClientSocketHandle* handle) {} |
503 virtual void ReleaseSocket(const std::string& group_name, | 502 virtual void ReleaseSocket(const std::string& group_name, |
504 scoped_ptr<StreamSocket> socket, | 503 scoped_ptr<StreamSocket> socket, |
505 int id) {} | 504 int id) {} |
506 virtual void CloseIdleSockets() {} | 505 virtual void CloseIdleSockets() {} |
507 virtual int IdleSocketCount() const { | 506 virtual int IdleSocketCount() const { return 0; } |
508 return 0; | |
509 } | |
510 virtual int IdleSocketCountInGroup(const std::string& group_name) const { | 507 virtual int IdleSocketCountInGroup(const std::string& group_name) const { |
511 return 0; | 508 return 0; |
512 } | 509 } |
513 virtual LoadState GetLoadState(const std::string& group_name, | 510 virtual LoadState GetLoadState(const std::string& group_name, |
514 const ClientSocketHandle* handle) const { | 511 const ClientSocketHandle* handle) const { |
515 return LOAD_STATE_IDLE; | 512 return LOAD_STATE_IDLE; |
516 } | 513 } |
517 virtual base::TimeDelta ConnectionTimeout() const { | 514 virtual base::TimeDelta ConnectionTimeout() const { |
518 return base::TimeDelta(); | 515 return base::TimeDelta(); |
519 } | 516 } |
520 | 517 |
521 private: | 518 private: |
522 std::string last_group_name_; | 519 std::string last_group_name_; |
523 }; | 520 }; |
524 | 521 |
525 typedef CaptureGroupNameSocketPool<TransportClientSocketPool> | 522 typedef CaptureGroupNameSocketPool<TransportClientSocketPool> |
526 CaptureGroupNameTransportSocketPool; | 523 CaptureGroupNameTransportSocketPool; |
527 typedef CaptureGroupNameSocketPool<HttpProxyClientSocketPool> | 524 typedef CaptureGroupNameSocketPool<HttpProxyClientSocketPool> |
528 CaptureGroupNameHttpProxySocketPool; | 525 CaptureGroupNameHttpProxySocketPool; |
529 typedef CaptureGroupNameSocketPool<SOCKSClientSocketPool> | 526 typedef CaptureGroupNameSocketPool<SOCKSClientSocketPool> |
530 CaptureGroupNameSOCKSSocketPool; | 527 CaptureGroupNameSOCKSSocketPool; |
531 typedef CaptureGroupNameSocketPool<SSLClientSocketPool> | 528 typedef CaptureGroupNameSocketPool<SSLClientSocketPool> |
532 CaptureGroupNameSSLSocketPool; | 529 CaptureGroupNameSSLSocketPool; |
533 | 530 |
534 template<typename ParentPool> | 531 template <typename ParentPool> |
535 CaptureGroupNameSocketPool<ParentPool>::CaptureGroupNameSocketPool( | 532 CaptureGroupNameSocketPool<ParentPool>::CaptureGroupNameSocketPool( |
536 HostResolver* host_resolver, | 533 HostResolver* host_resolver, |
537 CertVerifier* /* cert_verifier */) | 534 CertVerifier* /* cert_verifier */) |
538 : ParentPool(0, 0, NULL, host_resolver, NULL, NULL) {} | 535 : ParentPool(0, 0, NULL, host_resolver, NULL, NULL) { |
| 536 } |
539 | 537 |
540 template<> | 538 template <> |
541 CaptureGroupNameHttpProxySocketPool::CaptureGroupNameSocketPool( | 539 CaptureGroupNameHttpProxySocketPool::CaptureGroupNameSocketPool( |
542 HostResolver* host_resolver, | 540 HostResolver* host_resolver, |
543 CertVerifier* /* cert_verifier */) | 541 CertVerifier* /* cert_verifier */) |
544 : HttpProxyClientSocketPool(0, 0, NULL, host_resolver, NULL, NULL, NULL) {} | 542 : HttpProxyClientSocketPool(0, 0, NULL, host_resolver, NULL, NULL, NULL) { |
| 543 } |
545 | 544 |
546 template <> | 545 template <> |
547 CaptureGroupNameSSLSocketPool::CaptureGroupNameSocketPool( | 546 CaptureGroupNameSSLSocketPool::CaptureGroupNameSocketPool( |
548 HostResolver* host_resolver, | 547 HostResolver* host_resolver, |
549 CertVerifier* cert_verifier) | 548 CertVerifier* cert_verifier) |
550 : SSLClientSocketPool(0, | 549 : SSLClientSocketPool(0, |
551 0, | 550 0, |
552 NULL, | 551 NULL, |
553 host_resolver, | 552 host_resolver, |
554 cert_verifier, | 553 cert_verifier, |
555 NULL, | 554 NULL, |
556 NULL, | 555 NULL, |
557 NULL, | 556 NULL, |
558 std::string(), | 557 std::string(), |
559 NULL, | 558 NULL, |
560 NULL, | 559 NULL, |
561 NULL, | 560 NULL, |
562 NULL, | 561 NULL, |
563 NULL, | 562 NULL, |
564 NULL) {} | 563 NULL) { |
| 564 } |
565 | 565 |
566 //----------------------------------------------------------------------------- | 566 //----------------------------------------------------------------------------- |
567 | 567 |
568 // Helper functions for validating that AuthChallengeInfo's are correctly | 568 // Helper functions for validating that AuthChallengeInfo's are correctly |
569 // configured for common cases. | 569 // configured for common cases. |
570 bool CheckBasicServerAuth(const AuthChallengeInfo* auth_challenge) { | 570 bool CheckBasicServerAuth(const AuthChallengeInfo* auth_challenge) { |
571 if (!auth_challenge) | 571 if (!auth_challenge) |
572 return false; | 572 return false; |
573 EXPECT_FALSE(auth_challenge->is_proxy); | 573 EXPECT_FALSE(auth_challenge->is_proxy); |
574 EXPECT_EQ("www.google.com:80", auth_challenge->challenger.ToString()); | 574 EXPECT_EQ("www.google.com:80", auth_challenge->challenger.ToString()); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
610 } // namespace | 610 } // namespace |
611 | 611 |
612 TEST_P(HttpNetworkTransactionTest, Basic) { | 612 TEST_P(HttpNetworkTransactionTest, Basic) { |
613 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 613 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
614 scoped_ptr<HttpTransaction> trans( | 614 scoped_ptr<HttpTransaction> trans( |
615 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 615 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
616 } | 616 } |
617 | 617 |
618 TEST_P(HttpNetworkTransactionTest, SimpleGET) { | 618 TEST_P(HttpNetworkTransactionTest, SimpleGET) { |
619 MockRead data_reads[] = { | 619 MockRead data_reads[] = { |
620 MockRead("HTTP/1.0 200 OK\r\n\r\n"), | 620 MockRead("HTTP/1.0 200 OK\r\n\r\n"), MockRead("hello world"), |
621 MockRead("hello world"), | 621 MockRead(SYNCHRONOUS, OK), |
622 MockRead(SYNCHRONOUS, OK), | |
623 }; | 622 }; |
624 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 623 SimpleGetHelperResult out = |
625 arraysize(data_reads)); | 624 SimpleGetHelper(data_reads, arraysize(data_reads)); |
626 EXPECT_EQ(OK, out.rv); | 625 EXPECT_EQ(OK, out.rv); |
627 EXPECT_EQ("HTTP/1.0 200 OK", out.status_line); | 626 EXPECT_EQ("HTTP/1.0 200 OK", out.status_line); |
628 EXPECT_EQ("hello world", out.response_data); | 627 EXPECT_EQ("hello world", out.response_data); |
629 int64 reads_size = ReadsSize(data_reads, arraysize(data_reads)); | 628 int64 reads_size = ReadsSize(data_reads, arraysize(data_reads)); |
630 EXPECT_EQ(reads_size, out.totalReceivedBytes); | 629 EXPECT_EQ(reads_size, out.totalReceivedBytes); |
631 } | 630 } |
632 | 631 |
633 // Response with no status line. | 632 // Response with no status line. |
634 TEST_P(HttpNetworkTransactionTest, SimpleGETNoHeaders) { | 633 TEST_P(HttpNetworkTransactionTest, SimpleGETNoHeaders) { |
635 MockRead data_reads[] = { | 634 MockRead data_reads[] = { |
636 MockRead("hello world"), | 635 MockRead("hello world"), MockRead(SYNCHRONOUS, OK), |
637 MockRead(SYNCHRONOUS, OK), | |
638 }; | 636 }; |
639 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 637 SimpleGetHelperResult out = |
640 arraysize(data_reads)); | 638 SimpleGetHelper(data_reads, arraysize(data_reads)); |
641 EXPECT_EQ(OK, out.rv); | 639 EXPECT_EQ(OK, out.rv); |
642 EXPECT_EQ("HTTP/0.9 200 OK", out.status_line); | 640 EXPECT_EQ("HTTP/0.9 200 OK", out.status_line); |
643 EXPECT_EQ("hello world", out.response_data); | 641 EXPECT_EQ("hello world", out.response_data); |
644 int64 reads_size = ReadsSize(data_reads, arraysize(data_reads)); | 642 int64 reads_size = ReadsSize(data_reads, arraysize(data_reads)); |
645 EXPECT_EQ(reads_size, out.totalReceivedBytes); | 643 EXPECT_EQ(reads_size, out.totalReceivedBytes); |
646 } | 644 } |
647 | 645 |
648 // Allow up to 4 bytes of junk to precede status line. | 646 // Allow up to 4 bytes of junk to precede status line. |
649 TEST_P(HttpNetworkTransactionTest, StatusLineJunk3Bytes) { | 647 TEST_P(HttpNetworkTransactionTest, StatusLineJunk3Bytes) { |
650 MockRead data_reads[] = { | 648 MockRead data_reads[] = { |
651 MockRead("xxxHTTP/1.0 404 Not Found\nServer: blah\n\nDATA"), | 649 MockRead("xxxHTTP/1.0 404 Not Found\nServer: blah\n\nDATA"), |
652 MockRead(SYNCHRONOUS, OK), | 650 MockRead(SYNCHRONOUS, OK), |
653 }; | 651 }; |
654 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 652 SimpleGetHelperResult out = |
655 arraysize(data_reads)); | 653 SimpleGetHelper(data_reads, arraysize(data_reads)); |
656 EXPECT_EQ(OK, out.rv); | 654 EXPECT_EQ(OK, out.rv); |
657 EXPECT_EQ("HTTP/1.0 404 Not Found", out.status_line); | 655 EXPECT_EQ("HTTP/1.0 404 Not Found", out.status_line); |
658 EXPECT_EQ("DATA", out.response_data); | 656 EXPECT_EQ("DATA", out.response_data); |
659 int64 reads_size = ReadsSize(data_reads, arraysize(data_reads)); | 657 int64 reads_size = ReadsSize(data_reads, arraysize(data_reads)); |
660 EXPECT_EQ(reads_size, out.totalReceivedBytes); | 658 EXPECT_EQ(reads_size, out.totalReceivedBytes); |
661 } | 659 } |
662 | 660 |
663 // Allow up to 4 bytes of junk to precede status line. | 661 // Allow up to 4 bytes of junk to precede status line. |
664 TEST_P(HttpNetworkTransactionTest, StatusLineJunk4Bytes) { | 662 TEST_P(HttpNetworkTransactionTest, StatusLineJunk4Bytes) { |
665 MockRead data_reads[] = { | 663 MockRead data_reads[] = { |
666 MockRead("\n\nQJHTTP/1.0 404 Not Found\nServer: blah\n\nDATA"), | 664 MockRead("\n\nQJHTTP/1.0 404 Not Found\nServer: blah\n\nDATA"), |
667 MockRead(SYNCHRONOUS, OK), | 665 MockRead(SYNCHRONOUS, OK), |
668 }; | 666 }; |
669 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 667 SimpleGetHelperResult out = |
670 arraysize(data_reads)); | 668 SimpleGetHelper(data_reads, arraysize(data_reads)); |
671 EXPECT_EQ(OK, out.rv); | 669 EXPECT_EQ(OK, out.rv); |
672 EXPECT_EQ("HTTP/1.0 404 Not Found", out.status_line); | 670 EXPECT_EQ("HTTP/1.0 404 Not Found", out.status_line); |
673 EXPECT_EQ("DATA", out.response_data); | 671 EXPECT_EQ("DATA", out.response_data); |
674 int64 reads_size = ReadsSize(data_reads, arraysize(data_reads)); | 672 int64 reads_size = ReadsSize(data_reads, arraysize(data_reads)); |
675 EXPECT_EQ(reads_size, out.totalReceivedBytes); | 673 EXPECT_EQ(reads_size, out.totalReceivedBytes); |
676 } | 674 } |
677 | 675 |
678 // Beyond 4 bytes of slop and it should fail to find a status line. | 676 // Beyond 4 bytes of slop and it should fail to find a status line. |
679 TEST_P(HttpNetworkTransactionTest, StatusLineJunk5Bytes) { | 677 TEST_P(HttpNetworkTransactionTest, StatusLineJunk5Bytes) { |
680 MockRead data_reads[] = { | 678 MockRead data_reads[] = { |
681 MockRead("xxxxxHTTP/1.1 404 Not Found\nServer: blah"), | 679 MockRead("xxxxxHTTP/1.1 404 Not Found\nServer: blah"), |
682 MockRead(SYNCHRONOUS, OK), | 680 MockRead(SYNCHRONOUS, OK), |
683 }; | 681 }; |
684 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 682 SimpleGetHelperResult out = |
685 arraysize(data_reads)); | 683 SimpleGetHelper(data_reads, arraysize(data_reads)); |
686 EXPECT_EQ(OK, out.rv); | 684 EXPECT_EQ(OK, out.rv); |
687 EXPECT_EQ("HTTP/0.9 200 OK", out.status_line); | 685 EXPECT_EQ("HTTP/0.9 200 OK", out.status_line); |
688 EXPECT_EQ("xxxxxHTTP/1.1 404 Not Found\nServer: blah", out.response_data); | 686 EXPECT_EQ("xxxxxHTTP/1.1 404 Not Found\nServer: blah", out.response_data); |
689 int64 reads_size = ReadsSize(data_reads, arraysize(data_reads)); | 687 int64 reads_size = ReadsSize(data_reads, arraysize(data_reads)); |
690 EXPECT_EQ(reads_size, out.totalReceivedBytes); | 688 EXPECT_EQ(reads_size, out.totalReceivedBytes); |
691 } | 689 } |
692 | 690 |
693 // Same as StatusLineJunk4Bytes, except the read chunks are smaller. | 691 // Same as StatusLineJunk4Bytes, except the read chunks are smaller. |
694 TEST_P(HttpNetworkTransactionTest, StatusLineJunk4Bytes_Slow) { | 692 TEST_P(HttpNetworkTransactionTest, StatusLineJunk4Bytes_Slow) { |
695 MockRead data_reads[] = { | 693 MockRead data_reads[] = { |
696 MockRead("\n"), | 694 MockRead("\n"), |
697 MockRead("\n"), | 695 MockRead("\n"), |
698 MockRead("Q"), | 696 MockRead("Q"), |
699 MockRead("J"), | 697 MockRead("J"), |
700 MockRead("HTTP/1.0 404 Not Found\nServer: blah\n\nDATA"), | 698 MockRead("HTTP/1.0 404 Not Found\nServer: blah\n\nDATA"), |
701 MockRead(SYNCHRONOUS, OK), | 699 MockRead(SYNCHRONOUS, OK), |
702 }; | 700 }; |
703 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 701 SimpleGetHelperResult out = |
704 arraysize(data_reads)); | 702 SimpleGetHelper(data_reads, arraysize(data_reads)); |
705 EXPECT_EQ(OK, out.rv); | 703 EXPECT_EQ(OK, out.rv); |
706 EXPECT_EQ("HTTP/1.0 404 Not Found", out.status_line); | 704 EXPECT_EQ("HTTP/1.0 404 Not Found", out.status_line); |
707 EXPECT_EQ("DATA", out.response_data); | 705 EXPECT_EQ("DATA", out.response_data); |
708 int64 reads_size = ReadsSize(data_reads, arraysize(data_reads)); | 706 int64 reads_size = ReadsSize(data_reads, arraysize(data_reads)); |
709 EXPECT_EQ(reads_size, out.totalReceivedBytes); | 707 EXPECT_EQ(reads_size, out.totalReceivedBytes); |
710 } | 708 } |
711 | 709 |
712 // Close the connection before enough bytes to have a status line. | 710 // Close the connection before enough bytes to have a status line. |
713 TEST_P(HttpNetworkTransactionTest, StatusLinePartial) { | 711 TEST_P(HttpNetworkTransactionTest, StatusLinePartial) { |
714 MockRead data_reads[] = { | 712 MockRead data_reads[] = { |
715 MockRead("HTT"), | 713 MockRead("HTT"), MockRead(SYNCHRONOUS, OK), |
716 MockRead(SYNCHRONOUS, OK), | |
717 }; | 714 }; |
718 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 715 SimpleGetHelperResult out = |
719 arraysize(data_reads)); | 716 SimpleGetHelper(data_reads, arraysize(data_reads)); |
720 EXPECT_EQ(OK, out.rv); | 717 EXPECT_EQ(OK, out.rv); |
721 EXPECT_EQ("HTTP/0.9 200 OK", out.status_line); | 718 EXPECT_EQ("HTTP/0.9 200 OK", out.status_line); |
722 EXPECT_EQ("HTT", out.response_data); | 719 EXPECT_EQ("HTT", out.response_data); |
723 int64 reads_size = ReadsSize(data_reads, arraysize(data_reads)); | 720 int64 reads_size = ReadsSize(data_reads, arraysize(data_reads)); |
724 EXPECT_EQ(reads_size, out.totalReceivedBytes); | 721 EXPECT_EQ(reads_size, out.totalReceivedBytes); |
725 } | 722 } |
726 | 723 |
727 // Simulate a 204 response, lacking a Content-Length header, sent over a | 724 // Simulate a 204 response, lacking a Content-Length header, sent over a |
728 // persistent connection. The response should still terminate since a 204 | 725 // persistent connection. The response should still terminate since a 204 |
729 // cannot have a response body. | 726 // cannot have a response body. |
730 TEST_P(HttpNetworkTransactionTest, StopsReading204) { | 727 TEST_P(HttpNetworkTransactionTest, StopsReading204) { |
731 char junk[] = "junk"; | 728 char junk[] = "junk"; |
732 MockRead data_reads[] = { | 729 MockRead data_reads[] = { |
733 MockRead("HTTP/1.1 204 No Content\r\n\r\n"), | 730 MockRead("HTTP/1.1 204 No Content\r\n\r\n"), |
734 MockRead(junk), // Should not be read!! | 731 MockRead(junk), // Should not be read!! |
735 MockRead(SYNCHRONOUS, OK), | 732 MockRead(SYNCHRONOUS, OK), |
736 }; | 733 }; |
737 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 734 SimpleGetHelperResult out = |
738 arraysize(data_reads)); | 735 SimpleGetHelper(data_reads, arraysize(data_reads)); |
739 EXPECT_EQ(OK, out.rv); | 736 EXPECT_EQ(OK, out.rv); |
740 EXPECT_EQ("HTTP/1.1 204 No Content", out.status_line); | 737 EXPECT_EQ("HTTP/1.1 204 No Content", out.status_line); |
741 EXPECT_EQ("", out.response_data); | 738 EXPECT_EQ("", out.response_data); |
742 int64 reads_size = ReadsSize(data_reads, arraysize(data_reads)); | 739 int64 reads_size = ReadsSize(data_reads, arraysize(data_reads)); |
743 int64 response_size = reads_size - strlen(junk); | 740 int64 response_size = reads_size - strlen(junk); |
744 EXPECT_EQ(response_size, out.totalReceivedBytes); | 741 EXPECT_EQ(response_size, out.totalReceivedBytes); |
745 } | 742 } |
746 | 743 |
747 // A simple request using chunked encoding with some extra data after. | 744 // A simple request using chunked encoding with some extra data after. |
748 // (Like might be seen in a pipelined response.) | 745 // (Like might be seen in a pipelined response.) |
749 TEST_P(HttpNetworkTransactionTest, ChunkedEncoding) { | 746 TEST_P(HttpNetworkTransactionTest, ChunkedEncoding) { |
750 std::string final_chunk = "0\r\n\r\n"; | 747 std::string final_chunk = "0\r\n\r\n"; |
751 std::string extra_data = "HTTP/1.1 200 OK\r\n"; | 748 std::string extra_data = "HTTP/1.1 200 OK\r\n"; |
752 std::string last_read = final_chunk + extra_data; | 749 std::string last_read = final_chunk + extra_data; |
753 MockRead data_reads[] = { | 750 MockRead data_reads[] = { |
754 MockRead("HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n"), | 751 MockRead("HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n"), |
755 MockRead("5\r\nHello\r\n"), | 752 MockRead("5\r\nHello\r\n"), |
756 MockRead("1\r\n"), | 753 MockRead("1\r\n"), |
757 MockRead(" \r\n"), | 754 MockRead(" \r\n"), |
758 MockRead("5\r\nworld\r\n"), | 755 MockRead("5\r\nworld\r\n"), |
759 MockRead(last_read.data()), | 756 MockRead(last_read.data()), |
760 MockRead(SYNCHRONOUS, OK), | 757 MockRead(SYNCHRONOUS, OK), |
761 }; | 758 }; |
762 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 759 SimpleGetHelperResult out = |
763 arraysize(data_reads)); | 760 SimpleGetHelper(data_reads, arraysize(data_reads)); |
764 EXPECT_EQ(OK, out.rv); | 761 EXPECT_EQ(OK, out.rv); |
765 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); | 762 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); |
766 EXPECT_EQ("Hello world", out.response_data); | 763 EXPECT_EQ("Hello world", out.response_data); |
767 int64 reads_size = ReadsSize(data_reads, arraysize(data_reads)); | 764 int64 reads_size = ReadsSize(data_reads, arraysize(data_reads)); |
768 int64 response_size = reads_size - extra_data.size(); | 765 int64 response_size = reads_size - extra_data.size(); |
769 EXPECT_EQ(response_size, out.totalReceivedBytes); | 766 EXPECT_EQ(response_size, out.totalReceivedBytes); |
770 } | 767 } |
771 | 768 |
772 // Next tests deal with http://crbug.com/56344. | 769 // Next tests deal with http://crbug.com/56344. |
773 | 770 |
774 TEST_P(HttpNetworkTransactionTest, | 771 TEST_P(HttpNetworkTransactionTest, |
775 MultipleContentLengthHeadersNoTransferEncoding) { | 772 MultipleContentLengthHeadersNoTransferEncoding) { |
776 MockRead data_reads[] = { | 773 MockRead data_reads[] = { |
777 MockRead("HTTP/1.1 200 OK\r\n"), | 774 MockRead("HTTP/1.1 200 OK\r\n"), MockRead("Content-Length: 10\r\n"), |
778 MockRead("Content-Length: 10\r\n"), | 775 MockRead("Content-Length: 5\r\n\r\n"), |
779 MockRead("Content-Length: 5\r\n\r\n"), | |
780 }; | 776 }; |
781 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 777 SimpleGetHelperResult out = |
782 arraysize(data_reads)); | 778 SimpleGetHelper(data_reads, arraysize(data_reads)); |
783 EXPECT_EQ(ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_LENGTH, out.rv); | 779 EXPECT_EQ(ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_LENGTH, out.rv); |
784 } | 780 } |
785 | 781 |
786 TEST_P(HttpNetworkTransactionTest, | 782 TEST_P(HttpNetworkTransactionTest, |
787 DuplicateContentLengthHeadersNoTransferEncoding) { | 783 DuplicateContentLengthHeadersNoTransferEncoding) { |
788 MockRead data_reads[] = { | 784 MockRead data_reads[] = { |
789 MockRead("HTTP/1.1 200 OK\r\n"), | 785 MockRead("HTTP/1.1 200 OK\r\n"), MockRead("Content-Length: 5\r\n"), |
790 MockRead("Content-Length: 5\r\n"), | 786 MockRead("Content-Length: 5\r\n\r\n"), MockRead("Hello"), |
791 MockRead("Content-Length: 5\r\n\r\n"), | |
792 MockRead("Hello"), | |
793 }; | 787 }; |
794 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 788 SimpleGetHelperResult out = |
795 arraysize(data_reads)); | 789 SimpleGetHelper(data_reads, arraysize(data_reads)); |
796 EXPECT_EQ(OK, out.rv); | 790 EXPECT_EQ(OK, out.rv); |
797 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); | 791 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); |
798 EXPECT_EQ("Hello", out.response_data); | 792 EXPECT_EQ("Hello", out.response_data); |
799 } | 793 } |
800 | 794 |
801 TEST_P(HttpNetworkTransactionTest, | 795 TEST_P(HttpNetworkTransactionTest, |
802 ComplexContentLengthHeadersNoTransferEncoding) { | 796 ComplexContentLengthHeadersNoTransferEncoding) { |
803 // More than 2 dupes. | 797 // More than 2 dupes. |
804 { | 798 { |
805 MockRead data_reads[] = { | 799 MockRead data_reads[] = { |
806 MockRead("HTTP/1.1 200 OK\r\n"), | 800 MockRead("HTTP/1.1 200 OK\r\n"), |
807 MockRead("Content-Length: 5\r\n"), | 801 MockRead("Content-Length: 5\r\n"), |
808 MockRead("Content-Length: 5\r\n"), | 802 MockRead("Content-Length: 5\r\n"), |
809 MockRead("Content-Length: 5\r\n\r\n"), | 803 MockRead("Content-Length: 5\r\n\r\n"), |
810 MockRead("Hello"), | 804 MockRead("Hello"), |
811 }; | 805 }; |
812 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 806 SimpleGetHelperResult out = |
813 arraysize(data_reads)); | 807 SimpleGetHelper(data_reads, arraysize(data_reads)); |
814 EXPECT_EQ(OK, out.rv); | 808 EXPECT_EQ(OK, out.rv); |
815 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); | 809 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); |
816 EXPECT_EQ("Hello", out.response_data); | 810 EXPECT_EQ("Hello", out.response_data); |
817 } | 811 } |
818 // HTTP/1.0 | 812 // HTTP/1.0 |
819 { | 813 { |
820 MockRead data_reads[] = { | 814 MockRead data_reads[] = { |
821 MockRead("HTTP/1.0 200 OK\r\n"), | 815 MockRead("HTTP/1.0 200 OK\r\n"), |
822 MockRead("Content-Length: 5\r\n"), | 816 MockRead("Content-Length: 5\r\n"), |
823 MockRead("Content-Length: 5\r\n"), | 817 MockRead("Content-Length: 5\r\n"), |
824 MockRead("Content-Length: 5\r\n\r\n"), | 818 MockRead("Content-Length: 5\r\n\r\n"), |
825 MockRead("Hello"), | 819 MockRead("Hello"), |
826 }; | 820 }; |
827 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 821 SimpleGetHelperResult out = |
828 arraysize(data_reads)); | 822 SimpleGetHelper(data_reads, arraysize(data_reads)); |
829 EXPECT_EQ(OK, out.rv); | 823 EXPECT_EQ(OK, out.rv); |
830 EXPECT_EQ("HTTP/1.0 200 OK", out.status_line); | 824 EXPECT_EQ("HTTP/1.0 200 OK", out.status_line); |
831 EXPECT_EQ("Hello", out.response_data); | 825 EXPECT_EQ("Hello", out.response_data); |
832 } | 826 } |
833 // 2 dupes and one mismatched. | 827 // 2 dupes and one mismatched. |
834 { | 828 { |
835 MockRead data_reads[] = { | 829 MockRead data_reads[] = { |
836 MockRead("HTTP/1.1 200 OK\r\n"), | 830 MockRead("HTTP/1.1 200 OK\r\n"), MockRead("Content-Length: 10\r\n"), |
837 MockRead("Content-Length: 10\r\n"), | 831 MockRead("Content-Length: 10\r\n"), |
838 MockRead("Content-Length: 10\r\n"), | 832 MockRead("Content-Length: 5\r\n\r\n"), |
839 MockRead("Content-Length: 5\r\n\r\n"), | |
840 }; | 833 }; |
841 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 834 SimpleGetHelperResult out = |
842 arraysize(data_reads)); | 835 SimpleGetHelper(data_reads, arraysize(data_reads)); |
843 EXPECT_EQ(ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_LENGTH, out.rv); | 836 EXPECT_EQ(ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_LENGTH, out.rv); |
844 } | 837 } |
845 } | 838 } |
846 | 839 |
847 TEST_P(HttpNetworkTransactionTest, | 840 TEST_P(HttpNetworkTransactionTest, |
848 MultipleContentLengthHeadersTransferEncoding) { | 841 MultipleContentLengthHeadersTransferEncoding) { |
849 MockRead data_reads[] = { | 842 MockRead data_reads[] = { |
850 MockRead("HTTP/1.1 200 OK\r\n"), | 843 MockRead("HTTP/1.1 200 OK\r\n"), |
851 MockRead("Content-Length: 666\r\n"), | 844 MockRead("Content-Length: 666\r\n"), |
852 MockRead("Content-Length: 1337\r\n"), | 845 MockRead("Content-Length: 1337\r\n"), |
853 MockRead("Transfer-Encoding: chunked\r\n\r\n"), | 846 MockRead("Transfer-Encoding: chunked\r\n\r\n"), |
854 MockRead("5\r\nHello\r\n"), | 847 MockRead("5\r\nHello\r\n"), |
855 MockRead("1\r\n"), | 848 MockRead("1\r\n"), |
856 MockRead(" \r\n"), | 849 MockRead(" \r\n"), |
857 MockRead("5\r\nworld\r\n"), | 850 MockRead("5\r\nworld\r\n"), |
858 MockRead("0\r\n\r\nHTTP/1.1 200 OK\r\n"), | 851 MockRead("0\r\n\r\nHTTP/1.1 200 OK\r\n"), |
859 MockRead(SYNCHRONOUS, OK), | 852 MockRead(SYNCHRONOUS, OK), |
860 }; | 853 }; |
861 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 854 SimpleGetHelperResult out = |
862 arraysize(data_reads)); | 855 SimpleGetHelper(data_reads, arraysize(data_reads)); |
863 EXPECT_EQ(OK, out.rv); | 856 EXPECT_EQ(OK, out.rv); |
864 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); | 857 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); |
865 EXPECT_EQ("Hello world", out.response_data); | 858 EXPECT_EQ("Hello world", out.response_data); |
866 } | 859 } |
867 | 860 |
868 // Next tests deal with http://crbug.com/98895. | 861 // Next tests deal with http://crbug.com/98895. |
869 | 862 |
870 // Checks that a single Content-Disposition header results in no error. | 863 // Checks that a single Content-Disposition header results in no error. |
871 TEST_P(HttpNetworkTransactionTest, SingleContentDispositionHeader) { | 864 TEST_P(HttpNetworkTransactionTest, SingleContentDispositionHeader) { |
872 MockRead data_reads[] = { | 865 MockRead data_reads[] = { |
873 MockRead("HTTP/1.1 200 OK\r\n"), | 866 MockRead("HTTP/1.1 200 OK\r\n"), |
874 MockRead("Content-Disposition: attachment;filename=\"salutations.txt\"r\n"), | 867 MockRead( |
875 MockRead("Content-Length: 5\r\n\r\n"), | 868 "Content-Disposition: attachment;filename=\"salutations.txt\"r\n"), |
876 MockRead("Hello"), | 869 MockRead("Content-Length: 5\r\n\r\n"), MockRead("Hello"), |
877 }; | 870 }; |
878 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 871 SimpleGetHelperResult out = |
879 arraysize(data_reads)); | 872 SimpleGetHelper(data_reads, arraysize(data_reads)); |
880 EXPECT_EQ(OK, out.rv); | 873 EXPECT_EQ(OK, out.rv); |
881 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); | 874 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); |
882 EXPECT_EQ("Hello", out.response_data); | 875 EXPECT_EQ("Hello", out.response_data); |
883 } | 876 } |
884 | 877 |
885 // Checks that two identical Content-Disposition headers result in no error. | 878 // Checks that two identical Content-Disposition headers result in no error. |
886 TEST_P(HttpNetworkTransactionTest, | 879 TEST_P(HttpNetworkTransactionTest, TwoIdenticalContentDispositionHeaders) { |
887 TwoIdenticalContentDispositionHeaders) { | |
888 MockRead data_reads[] = { | 880 MockRead data_reads[] = { |
889 MockRead("HTTP/1.1 200 OK\r\n"), | 881 MockRead("HTTP/1.1 200 OK\r\n"), |
890 MockRead("Content-Disposition: attachment;filename=\"greetings.txt\"r\n"), | 882 MockRead("Content-Disposition: attachment;filename=\"greetings.txt\"r\n"), |
891 MockRead("Content-Disposition: attachment;filename=\"greetings.txt\"r\n"), | 883 MockRead("Content-Disposition: attachment;filename=\"greetings.txt\"r\n"), |
892 MockRead("Content-Length: 5\r\n\r\n"), | 884 MockRead("Content-Length: 5\r\n\r\n"), |
893 MockRead("Hello"), | 885 MockRead("Hello"), |
894 }; | 886 }; |
895 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 887 SimpleGetHelperResult out = |
896 arraysize(data_reads)); | 888 SimpleGetHelper(data_reads, arraysize(data_reads)); |
897 EXPECT_EQ(OK, out.rv); | 889 EXPECT_EQ(OK, out.rv); |
898 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); | 890 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); |
899 EXPECT_EQ("Hello", out.response_data); | 891 EXPECT_EQ("Hello", out.response_data); |
900 } | 892 } |
901 | 893 |
902 // Checks that two distinct Content-Disposition headers result in an error. | 894 // Checks that two distinct Content-Disposition headers result in an error. |
903 TEST_P(HttpNetworkTransactionTest, TwoDistinctContentDispositionHeaders) { | 895 TEST_P(HttpNetworkTransactionTest, TwoDistinctContentDispositionHeaders) { |
904 MockRead data_reads[] = { | 896 MockRead data_reads[] = { |
905 MockRead("HTTP/1.1 200 OK\r\n"), | 897 MockRead("HTTP/1.1 200 OK\r\n"), |
906 MockRead("Content-Disposition: attachment;filename=\"greetings.txt\"r\n"), | 898 MockRead("Content-Disposition: attachment;filename=\"greetings.txt\"r\n"), |
907 MockRead("Content-Disposition: attachment;filename=\"hi.txt\"r\n"), | 899 MockRead("Content-Disposition: attachment;filename=\"hi.txt\"r\n"), |
908 MockRead("Content-Length: 5\r\n\r\n"), | 900 MockRead("Content-Length: 5\r\n\r\n"), |
909 MockRead("Hello"), | 901 MockRead("Hello"), |
910 }; | 902 }; |
911 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 903 SimpleGetHelperResult out = |
912 arraysize(data_reads)); | 904 SimpleGetHelper(data_reads, arraysize(data_reads)); |
913 EXPECT_EQ(ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION, out.rv); | 905 EXPECT_EQ(ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION, out.rv); |
914 } | 906 } |
915 | 907 |
916 // Checks that two identical Location headers result in no error. | 908 // Checks that two identical Location headers result in no error. |
917 // Also tests Location header behavior. | 909 // Also tests Location header behavior. |
918 TEST_P(HttpNetworkTransactionTest, TwoIdenticalLocationHeaders) { | 910 TEST_P(HttpNetworkTransactionTest, TwoIdenticalLocationHeaders) { |
919 MockRead data_reads[] = { | 911 MockRead data_reads[] = { |
920 MockRead("HTTP/1.1 302 Redirect\r\n"), | 912 MockRead("HTTP/1.1 302 Redirect\r\n"), |
921 MockRead("Location: http://good.com/\r\n"), | 913 MockRead("Location: http://good.com/\r\n"), |
922 MockRead("Location: http://good.com/\r\n"), | 914 MockRead("Location: http://good.com/\r\n"), |
923 MockRead("Content-Length: 0\r\n\r\n"), | 915 MockRead("Content-Length: 0\r\n\r\n"), |
924 MockRead(SYNCHRONOUS, OK), | 916 MockRead(SYNCHRONOUS, OK), |
925 }; | 917 }; |
926 | 918 |
927 HttpRequestInfo request; | 919 HttpRequestInfo request; |
928 request.method = "GET"; | 920 request.method = "GET"; |
929 request.url = GURL("http://redirect.com/"); | 921 request.url = GURL("http://redirect.com/"); |
930 request.load_flags = 0; | 922 request.load_flags = 0; |
931 | 923 |
932 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 924 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
933 scoped_ptr<HttpTransaction> trans( | 925 scoped_ptr<HttpTransaction> trans( |
934 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 926 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
(...skipping 12 matching lines...) Expand all Loading... |
947 ASSERT_TRUE(response != NULL && response->headers.get() != NULL); | 939 ASSERT_TRUE(response != NULL && response->headers.get() != NULL); |
948 EXPECT_EQ("HTTP/1.1 302 Redirect", response->headers->GetStatusLine()); | 940 EXPECT_EQ("HTTP/1.1 302 Redirect", response->headers->GetStatusLine()); |
949 std::string url; | 941 std::string url; |
950 EXPECT_TRUE(response->headers->IsRedirect(&url)); | 942 EXPECT_TRUE(response->headers->IsRedirect(&url)); |
951 EXPECT_EQ("http://good.com/", url); | 943 EXPECT_EQ("http://good.com/", url); |
952 } | 944 } |
953 | 945 |
954 // Checks that two distinct Location headers result in an error. | 946 // Checks that two distinct Location headers result in an error. |
955 TEST_P(HttpNetworkTransactionTest, TwoDistinctLocationHeaders) { | 947 TEST_P(HttpNetworkTransactionTest, TwoDistinctLocationHeaders) { |
956 MockRead data_reads[] = { | 948 MockRead data_reads[] = { |
957 MockRead("HTTP/1.1 302 Redirect\r\n"), | 949 MockRead("HTTP/1.1 302 Redirect\r\n"), |
958 MockRead("Location: http://good.com/\r\n"), | 950 MockRead("Location: http://good.com/\r\n"), |
959 MockRead("Location: http://evil.com/\r\n"), | 951 MockRead("Location: http://evil.com/\r\n"), |
960 MockRead("Content-Length: 0\r\n\r\n"), | 952 MockRead("Content-Length: 0\r\n\r\n"), |
961 MockRead(SYNCHRONOUS, OK), | 953 MockRead(SYNCHRONOUS, OK), |
962 }; | 954 }; |
963 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 955 SimpleGetHelperResult out = |
964 arraysize(data_reads)); | 956 SimpleGetHelper(data_reads, arraysize(data_reads)); |
965 EXPECT_EQ(ERR_RESPONSE_HEADERS_MULTIPLE_LOCATION, out.rv); | 957 EXPECT_EQ(ERR_RESPONSE_HEADERS_MULTIPLE_LOCATION, out.rv); |
966 } | 958 } |
967 | 959 |
968 // Do a request using the HEAD method. Verify that we don't try to read the | 960 // Do a request using the HEAD method. Verify that we don't try to read the |
969 // message body (since HEAD has none). | 961 // message body (since HEAD has none). |
970 TEST_P(HttpNetworkTransactionTest, Head) { | 962 TEST_P(HttpNetworkTransactionTest, Head) { |
971 HttpRequestInfo request; | 963 HttpRequestInfo request; |
972 request.method = "HEAD"; | 964 request.method = "HEAD"; |
973 request.url = GURL("http://www.google.com/"); | 965 request.url = GURL("http://www.google.com/"); |
974 request.load_flags = 0; | 966 request.load_flags = 0; |
975 | 967 |
976 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 968 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
977 scoped_ptr<HttpTransaction> trans( | 969 scoped_ptr<HttpTransaction> trans( |
978 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 970 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
979 | 971 |
980 MockWrite data_writes1[] = { | 972 MockWrite data_writes1[] = { |
981 MockWrite("HEAD / HTTP/1.1\r\n" | 973 MockWrite( |
982 "Host: www.google.com\r\n" | 974 "HEAD / HTTP/1.1\r\n" |
983 "Connection: keep-alive\r\n" | 975 "Host: www.google.com\r\n" |
984 "Content-Length: 0\r\n\r\n"), | 976 "Connection: keep-alive\r\n" |
| 977 "Content-Length: 0\r\n\r\n"), |
985 }; | 978 }; |
986 MockRead data_reads1[] = { | 979 MockRead data_reads1[] = { |
987 MockRead("HTTP/1.1 404 Not Found\r\n"), | 980 MockRead("HTTP/1.1 404 Not Found\r\n"), MockRead("Server: Blah\r\n"), |
988 MockRead("Server: Blah\r\n"), | 981 MockRead("Content-Length: 1234\r\n\r\n"), |
989 MockRead("Content-Length: 1234\r\n\r\n"), | |
990 | 982 |
991 // No response body because the test stops reading here. | 983 // No response body because the test stops reading here. |
992 MockRead(SYNCHRONOUS, ERR_UNEXPECTED), // Should not be reached. | 984 MockRead(SYNCHRONOUS, ERR_UNEXPECTED), // Should not be reached. |
993 }; | 985 }; |
994 | 986 |
995 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 987 StaticSocketDataProvider data1(data_reads1, |
996 data_writes1, arraysize(data_writes1)); | 988 arraysize(data_reads1), |
| 989 data_writes1, |
| 990 arraysize(data_writes1)); |
997 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 991 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
998 | 992 |
999 TestCompletionCallback callback1; | 993 TestCompletionCallback callback1; |
1000 | 994 |
1001 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); | 995 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); |
1002 EXPECT_EQ(ERR_IO_PENDING, rv); | 996 EXPECT_EQ(ERR_IO_PENDING, rv); |
1003 | 997 |
1004 rv = callback1.WaitForResult(); | 998 rv = callback1.WaitForResult(); |
1005 EXPECT_EQ(OK, rv); | 999 EXPECT_EQ(OK, rv); |
1006 | 1000 |
1007 const HttpResponseInfo* response = trans->GetResponseInfo(); | 1001 const HttpResponseInfo* response = trans->GetResponseInfo(); |
1008 ASSERT_TRUE(response != NULL); | 1002 ASSERT_TRUE(response != NULL); |
1009 | 1003 |
1010 // Check that the headers got parsed. | 1004 // Check that the headers got parsed. |
1011 EXPECT_TRUE(response->headers.get() != NULL); | 1005 EXPECT_TRUE(response->headers.get() != NULL); |
1012 EXPECT_EQ(1234, response->headers->GetContentLength()); | 1006 EXPECT_EQ(1234, response->headers->GetContentLength()); |
1013 EXPECT_EQ("HTTP/1.1 404 Not Found", response->headers->GetStatusLine()); | 1007 EXPECT_EQ("HTTP/1.1 404 Not Found", response->headers->GetStatusLine()); |
1014 | 1008 |
1015 std::string server_header; | 1009 std::string server_header; |
1016 void* iter = NULL; | 1010 void* iter = NULL; |
1017 bool has_server_header = response->headers->EnumerateHeader( | 1011 bool has_server_header = |
1018 &iter, "Server", &server_header); | 1012 response->headers->EnumerateHeader(&iter, "Server", &server_header); |
1019 EXPECT_TRUE(has_server_header); | 1013 EXPECT_TRUE(has_server_header); |
1020 EXPECT_EQ("Blah", server_header); | 1014 EXPECT_EQ("Blah", server_header); |
1021 | 1015 |
1022 // Reading should give EOF right away, since there is no message body | 1016 // Reading should give EOF right away, since there is no message body |
1023 // (despite non-zero content-length). | 1017 // (despite non-zero content-length). |
1024 std::string response_data; | 1018 std::string response_data; |
1025 rv = ReadTransaction(trans.get(), &response_data); | 1019 rv = ReadTransaction(trans.get(), &response_data); |
1026 EXPECT_EQ(OK, rv); | 1020 EXPECT_EQ(OK, rv); |
1027 EXPECT_EQ("", response_data); | 1021 EXPECT_EQ("", response_data); |
1028 } | 1022 } |
1029 | 1023 |
1030 TEST_P(HttpNetworkTransactionTest, ReuseConnection) { | 1024 TEST_P(HttpNetworkTransactionTest, ReuseConnection) { |
1031 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 1025 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
1032 | 1026 |
1033 MockRead data_reads[] = { | 1027 MockRead data_reads[] = { |
1034 MockRead("HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\n"), | 1028 MockRead("HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\n"), |
1035 MockRead("hello"), | 1029 MockRead("hello"), |
1036 MockRead("HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\n"), | 1030 MockRead("HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\n"), |
1037 MockRead("world"), | 1031 MockRead("world"), |
1038 MockRead(SYNCHRONOUS, OK), | 1032 MockRead(SYNCHRONOUS, OK), |
1039 }; | 1033 }; |
1040 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); | 1034 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); |
1041 session_deps_.socket_factory->AddSocketDataProvider(&data); | 1035 session_deps_.socket_factory->AddSocketDataProvider(&data); |
1042 | 1036 |
1043 const char* const kExpectedResponseData[] = { | 1037 const char* const kExpectedResponseData[] = {"hello", "world"}; |
1044 "hello", "world" | |
1045 }; | |
1046 | 1038 |
1047 for (int i = 0; i < 2; ++i) { | 1039 for (int i = 0; i < 2; ++i) { |
1048 HttpRequestInfo request; | 1040 HttpRequestInfo request; |
1049 request.method = "GET"; | 1041 request.method = "GET"; |
1050 request.url = GURL("http://www.google.com/"); | 1042 request.url = GURL("http://www.google.com/"); |
1051 request.load_flags = 0; | 1043 request.load_flags = 0; |
1052 | 1044 |
1053 scoped_ptr<HttpTransaction> trans( | 1045 scoped_ptr<HttpTransaction> trans( |
1054 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 1046 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
1055 | 1047 |
(...skipping 27 matching lines...) Expand all Loading... |
1083 request.method = "POST"; | 1075 request.method = "POST"; |
1084 request.url = GURL("http://www.foo.com/"); | 1076 request.url = GURL("http://www.foo.com/"); |
1085 request.upload_data_stream = &upload_data_stream; | 1077 request.upload_data_stream = &upload_data_stream; |
1086 request.load_flags = 0; | 1078 request.load_flags = 0; |
1087 | 1079 |
1088 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 1080 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
1089 scoped_ptr<HttpTransaction> trans( | 1081 scoped_ptr<HttpTransaction> trans( |
1090 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 1082 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
1091 | 1083 |
1092 MockRead data_reads[] = { | 1084 MockRead data_reads[] = { |
1093 MockRead("HTTP/1.0 100 Continue\r\n\r\n"), | 1085 MockRead("HTTP/1.0 100 Continue\r\n\r\n"), |
1094 MockRead("HTTP/1.0 200 OK\r\n\r\n"), | 1086 MockRead("HTTP/1.0 200 OK\r\n\r\n"), MockRead("hello world"), |
1095 MockRead("hello world"), | 1087 MockRead(SYNCHRONOUS, OK), |
1096 MockRead(SYNCHRONOUS, OK), | |
1097 }; | 1088 }; |
1098 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); | 1089 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); |
1099 session_deps_.socket_factory->AddSocketDataProvider(&data); | 1090 session_deps_.socket_factory->AddSocketDataProvider(&data); |
1100 | 1091 |
1101 TestCompletionCallback callback; | 1092 TestCompletionCallback callback; |
1102 | 1093 |
1103 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 1094 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
1104 EXPECT_EQ(ERR_IO_PENDING, rv); | 1095 EXPECT_EQ(ERR_IO_PENDING, rv); |
1105 | 1096 |
1106 rv = callback.WaitForResult(); | 1097 rv = callback.WaitForResult(); |
(...skipping 18 matching lines...) Expand all Loading... |
1125 HttpRequestInfo request; | 1116 HttpRequestInfo request; |
1126 request.method = "GET"; | 1117 request.method = "GET"; |
1127 request.url = GURL("http://www.foo.com/"); | 1118 request.url = GURL("http://www.foo.com/"); |
1128 request.load_flags = 0; | 1119 request.load_flags = 0; |
1129 | 1120 |
1130 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 1121 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
1131 scoped_ptr<HttpTransaction> trans( | 1122 scoped_ptr<HttpTransaction> trans( |
1132 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 1123 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
1133 | 1124 |
1134 MockRead data_reads[] = { | 1125 MockRead data_reads[] = { |
1135 MockRead("HTTP/1.1 102 Unspecified status code\r\n\r\n" | 1126 MockRead( |
1136 "HTTP/1.1 200 OK\r\n\r\n"), | 1127 "HTTP/1.1 102 Unspecified status code\r\n\r\n" |
1137 MockRead("hello world"), | 1128 "HTTP/1.1 200 OK\r\n\r\n"), |
1138 MockRead(SYNCHRONOUS, OK), | 1129 MockRead("hello world"), MockRead(SYNCHRONOUS, OK), |
1139 }; | 1130 }; |
1140 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); | 1131 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); |
1141 session_deps_.socket_factory->AddSocketDataProvider(&data); | 1132 session_deps_.socket_factory->AddSocketDataProvider(&data); |
1142 | 1133 |
1143 TestCompletionCallback callback; | 1134 TestCompletionCallback callback; |
1144 | 1135 |
1145 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 1136 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
1146 EXPECT_EQ(ERR_IO_PENDING, rv); | 1137 EXPECT_EQ(ERR_IO_PENDING, rv); |
1147 | 1138 |
1148 rv = callback.WaitForResult(); | 1139 rv = callback.WaitForResult(); |
(...skipping 15 matching lines...) Expand all Loading... |
1164 HttpRequestInfo request; | 1155 HttpRequestInfo request; |
1165 request.method = "POST"; | 1156 request.method = "POST"; |
1166 request.url = GURL("http://www.foo.com/"); | 1157 request.url = GURL("http://www.foo.com/"); |
1167 request.load_flags = 0; | 1158 request.load_flags = 0; |
1168 | 1159 |
1169 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 1160 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
1170 scoped_ptr<HttpTransaction> trans( | 1161 scoped_ptr<HttpTransaction> trans( |
1171 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 1162 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
1172 | 1163 |
1173 MockRead data_reads[] = { | 1164 MockRead data_reads[] = { |
1174 MockRead(SYNCHRONOUS, "HTTP/1.0 100 Continue\r\n"), | 1165 MockRead(SYNCHRONOUS, "HTTP/1.0 100 Continue\r\n"), MockRead(ASYNC, 0), |
1175 MockRead(ASYNC, 0), | |
1176 }; | 1166 }; |
1177 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); | 1167 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); |
1178 session_deps_.socket_factory->AddSocketDataProvider(&data); | 1168 session_deps_.socket_factory->AddSocketDataProvider(&data); |
1179 | 1169 |
1180 TestCompletionCallback callback; | 1170 TestCompletionCallback callback; |
1181 | 1171 |
1182 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 1172 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
1183 EXPECT_EQ(ERR_IO_PENDING, rv); | 1173 EXPECT_EQ(ERR_IO_PENDING, rv); |
1184 | 1174 |
1185 rv = callback.WaitForResult(); | 1175 rv = callback.WaitForResult(); |
1186 EXPECT_EQ(OK, rv); | 1176 EXPECT_EQ(OK, rv); |
1187 | 1177 |
1188 std::string response_data; | 1178 std::string response_data; |
1189 rv = ReadTransaction(trans.get(), &response_data); | 1179 rv = ReadTransaction(trans.get(), &response_data); |
1190 EXPECT_EQ(OK, rv); | 1180 EXPECT_EQ(OK, rv); |
1191 EXPECT_EQ("", response_data); | 1181 EXPECT_EQ("", response_data); |
1192 } | 1182 } |
1193 | 1183 |
1194 TEST_P(HttpNetworkTransactionTest, EmptyResponse) { | 1184 TEST_P(HttpNetworkTransactionTest, EmptyResponse) { |
1195 HttpRequestInfo request; | 1185 HttpRequestInfo request; |
1196 request.method = "POST"; | 1186 request.method = "POST"; |
1197 request.url = GURL("http://www.foo.com/"); | 1187 request.url = GURL("http://www.foo.com/"); |
1198 request.load_flags = 0; | 1188 request.load_flags = 0; |
1199 | 1189 |
1200 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 1190 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
1201 scoped_ptr<HttpTransaction> trans( | 1191 scoped_ptr<HttpTransaction> trans( |
1202 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 1192 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
1203 | 1193 |
1204 | |
1205 MockRead data_reads[] = { | 1194 MockRead data_reads[] = { |
1206 MockRead(ASYNC, 0), | 1195 MockRead(ASYNC, 0), |
1207 }; | 1196 }; |
1208 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); | 1197 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); |
1209 session_deps_.socket_factory->AddSocketDataProvider(&data); | 1198 session_deps_.socket_factory->AddSocketDataProvider(&data); |
1210 | 1199 |
1211 TestCompletionCallback callback; | 1200 TestCompletionCallback callback; |
1212 | 1201 |
1213 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 1202 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
1214 EXPECT_EQ(ERR_IO_PENDING, rv); | 1203 EXPECT_EQ(ERR_IO_PENDING, rv); |
1215 | 1204 |
1216 rv = callback.WaitForResult(); | 1205 rv = callback.WaitForResult(); |
1217 EXPECT_EQ(ERR_EMPTY_RESPONSE, rv); | 1206 EXPECT_EQ(ERR_EMPTY_RESPONSE, rv); |
1218 } | 1207 } |
1219 | 1208 |
1220 void HttpNetworkTransactionTest::KeepAliveConnectionResendRequestTest( | 1209 void HttpNetworkTransactionTest::KeepAliveConnectionResendRequestTest( |
1221 const MockWrite* write_failure, | 1210 const MockWrite* write_failure, |
1222 const MockRead* read_failure) { | 1211 const MockRead* read_failure) { |
1223 HttpRequestInfo request; | 1212 HttpRequestInfo request; |
1224 request.method = "GET"; | 1213 request.method = "GET"; |
1225 request.url = GURL("http://www.foo.com/"); | 1214 request.url = GURL("http://www.foo.com/"); |
1226 request.load_flags = 0; | 1215 request.load_flags = 0; |
1227 | 1216 |
1228 CapturingNetLog net_log; | 1217 CapturingNetLog net_log; |
1229 session_deps_.net_log = &net_log; | 1218 session_deps_.net_log = &net_log; |
1230 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 1219 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
1231 | 1220 |
1232 // Written data for successfully sending both requests. | 1221 // Written data for successfully sending both requests. |
1233 MockWrite data1_writes[] = { | 1222 MockWrite data1_writes[] = {MockWrite( |
1234 MockWrite("GET / HTTP/1.1\r\n" | 1223 "GET / HTTP/1.1\r\n" |
1235 "Host: www.foo.com\r\n" | 1224 "Host: www.foo.com\r\n" |
1236 "Connection: keep-alive\r\n\r\n"), | 1225 "Connection: keep-alive\r\n\r\n"), |
1237 MockWrite("GET / HTTP/1.1\r\n" | 1226 MockWrite( |
1238 "Host: www.foo.com\r\n" | 1227 "GET / HTTP/1.1\r\n" |
1239 "Connection: keep-alive\r\n\r\n") | 1228 "Host: www.foo.com\r\n" |
1240 }; | 1229 "Connection: keep-alive\r\n\r\n")}; |
1241 | 1230 |
1242 // Read results for the first request. | 1231 // Read results for the first request. |
1243 MockRead data1_reads[] = { | 1232 MockRead data1_reads[] = { |
1244 MockRead("HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\n"), | 1233 MockRead("HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\n"), |
1245 MockRead("hello"), | 1234 MockRead("hello"), MockRead(ASYNC, OK), |
1246 MockRead(ASYNC, OK), | |
1247 }; | 1235 }; |
1248 | 1236 |
1249 if (write_failure) { | 1237 if (write_failure) { |
1250 ASSERT_FALSE(read_failure); | 1238 ASSERT_FALSE(read_failure); |
1251 data1_writes[1] = *write_failure; | 1239 data1_writes[1] = *write_failure; |
1252 } else { | 1240 } else { |
1253 ASSERT_TRUE(read_failure); | 1241 ASSERT_TRUE(read_failure); |
1254 data1_reads[2] = *read_failure; | 1242 data1_reads[2] = *read_failure; |
1255 } | 1243 } |
1256 | 1244 |
1257 StaticSocketDataProvider data1(data1_reads, arraysize(data1_reads), | 1245 StaticSocketDataProvider data1(data1_reads, |
1258 data1_writes, arraysize(data1_writes)); | 1246 arraysize(data1_reads), |
| 1247 data1_writes, |
| 1248 arraysize(data1_writes)); |
1259 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 1249 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
1260 | 1250 |
1261 MockRead data2_reads[] = { | 1251 MockRead data2_reads[] = { |
1262 MockRead("HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\n"), | 1252 MockRead("HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\n"), |
1263 MockRead("world"), | 1253 MockRead("world"), MockRead(ASYNC, OK), |
1264 MockRead(ASYNC, OK), | |
1265 }; | 1254 }; |
1266 StaticSocketDataProvider data2(data2_reads, arraysize(data2_reads), NULL, 0); | 1255 StaticSocketDataProvider data2(data2_reads, arraysize(data2_reads), NULL, 0); |
1267 session_deps_.socket_factory->AddSocketDataProvider(&data2); | 1256 session_deps_.socket_factory->AddSocketDataProvider(&data2); |
1268 | 1257 |
1269 const char* kExpectedResponseData[] = { | 1258 const char* kExpectedResponseData[] = {"hello", "world"}; |
1270 "hello", "world" | |
1271 }; | |
1272 | 1259 |
1273 uint32 first_socket_log_id = NetLog::Source::kInvalidId; | 1260 uint32 first_socket_log_id = NetLog::Source::kInvalidId; |
1274 for (int i = 0; i < 2; ++i) { | 1261 for (int i = 0; i < 2; ++i) { |
1275 TestCompletionCallback callback; | 1262 TestCompletionCallback callback; |
1276 | 1263 |
1277 scoped_ptr<HttpTransaction> trans( | 1264 scoped_ptr<HttpTransaction> trans( |
1278 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 1265 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
1279 | 1266 |
1280 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 1267 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
1281 EXPECT_EQ(ERR_IO_PENDING, rv); | 1268 EXPECT_EQ(ERR_IO_PENDING, rv); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1330 | 1317 |
1331 // SPDY versions of the request and response. | 1318 // SPDY versions of the request and response. |
1332 scoped_ptr<SpdyFrame> spdy_request(spdy_util_.ConstructSpdyGet( | 1319 scoped_ptr<SpdyFrame> spdy_request(spdy_util_.ConstructSpdyGet( |
1333 request.url.spec().c_str(), false, 1, DEFAULT_PRIORITY)); | 1320 request.url.spec().c_str(), false, 1, DEFAULT_PRIORITY)); |
1334 scoped_ptr<SpdyFrame> spdy_response( | 1321 scoped_ptr<SpdyFrame> spdy_response( |
1335 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 1322 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
1336 scoped_ptr<SpdyFrame> spdy_data( | 1323 scoped_ptr<SpdyFrame> spdy_data( |
1337 spdy_util_.ConstructSpdyBodyFrame(1, "hello", 5, true)); | 1324 spdy_util_.ConstructSpdyBodyFrame(1, "hello", 5, true)); |
1338 | 1325 |
1339 // HTTP/1.1 versions of the request and response. | 1326 // HTTP/1.1 versions of the request and response. |
1340 const char kHttpRequest[] = "GET / HTTP/1.1\r\n" | 1327 const char kHttpRequest[] = |
| 1328 "GET / HTTP/1.1\r\n" |
1341 "Host: www.foo.com\r\n" | 1329 "Host: www.foo.com\r\n" |
1342 "Connection: keep-alive\r\n\r\n"; | 1330 "Connection: keep-alive\r\n\r\n"; |
1343 const char kHttpResponse[] = "HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\n"; | 1331 const char kHttpResponse[] = "HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\n"; |
1344 const char kHttpData[] = "hello"; | 1332 const char kHttpData[] = "hello"; |
1345 | 1333 |
1346 std::vector<MockRead> data1_reads; | 1334 std::vector<MockRead> data1_reads; |
1347 std::vector<MockWrite> data1_writes; | 1335 std::vector<MockWrite> data1_writes; |
1348 if (write_failure) { | 1336 if (write_failure) { |
1349 ASSERT_FALSE(read_failure); | 1337 ASSERT_FALSE(read_failure); |
1350 data1_writes.push_back(*write_failure); | 1338 data1_writes.push_back(*write_failure); |
1351 data1_reads.push_back(MockRead(ASYNC, OK)); | 1339 data1_reads.push_back(MockRead(ASYNC, OK)); |
1352 } else { | 1340 } else { |
1353 ASSERT_TRUE(read_failure); | 1341 ASSERT_TRUE(read_failure); |
1354 if (use_spdy) { | 1342 if (use_spdy) { |
1355 data1_writes.push_back(CreateMockWrite(*spdy_request)); | 1343 data1_writes.push_back(CreateMockWrite(*spdy_request)); |
1356 } else { | 1344 } else { |
1357 data1_writes.push_back(MockWrite(kHttpRequest)); | 1345 data1_writes.push_back(MockWrite(kHttpRequest)); |
1358 } | 1346 } |
1359 data1_reads.push_back(*read_failure); | 1347 data1_reads.push_back(*read_failure); |
1360 } | 1348 } |
1361 | 1349 |
1362 StaticSocketDataProvider data1(&data1_reads[0], data1_reads.size(), | 1350 StaticSocketDataProvider data1(&data1_reads[0], |
1363 &data1_writes[0], data1_writes.size()); | 1351 data1_reads.size(), |
| 1352 &data1_writes[0], |
| 1353 data1_writes.size()); |
1364 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 1354 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
1365 | 1355 |
1366 std::vector<MockRead> data2_reads; | 1356 std::vector<MockRead> data2_reads; |
1367 std::vector<MockWrite> data2_writes; | 1357 std::vector<MockWrite> data2_writes; |
1368 | 1358 |
1369 if (use_spdy) { | 1359 if (use_spdy) { |
1370 data2_writes.push_back(CreateMockWrite(*spdy_request, 0, ASYNC)); | 1360 data2_writes.push_back(CreateMockWrite(*spdy_request, 0, ASYNC)); |
1371 | 1361 |
1372 data2_reads.push_back(CreateMockRead(*spdy_response, 1, ASYNC)); | 1362 data2_reads.push_back(CreateMockRead(*spdy_response, 1, ASYNC)); |
1373 data2_reads.push_back(CreateMockRead(*spdy_data, 2, ASYNC)); | 1363 data2_reads.push_back(CreateMockRead(*spdy_data, 2, ASYNC)); |
1374 data2_reads.push_back(MockRead(ASYNC, OK, 3)); | 1364 data2_reads.push_back(MockRead(ASYNC, OK, 3)); |
1375 } else { | 1365 } else { |
1376 data2_writes.push_back( | 1366 data2_writes.push_back( |
1377 MockWrite(ASYNC, kHttpRequest, strlen(kHttpRequest), 0)); | 1367 MockWrite(ASYNC, kHttpRequest, strlen(kHttpRequest), 0)); |
1378 | 1368 |
1379 data2_reads.push_back( | 1369 data2_reads.push_back( |
1380 MockRead(ASYNC, kHttpResponse, strlen(kHttpResponse), 1)); | 1370 MockRead(ASYNC, kHttpResponse, strlen(kHttpResponse), 1)); |
1381 data2_reads.push_back(MockRead(ASYNC, kHttpData, strlen(kHttpData), 2)); | 1371 data2_reads.push_back(MockRead(ASYNC, kHttpData, strlen(kHttpData), 2)); |
1382 data2_reads.push_back(MockRead(ASYNC, OK, 3)); | 1372 data2_reads.push_back(MockRead(ASYNC, OK, 3)); |
1383 } | 1373 } |
1384 OrderedSocketData data2(&data2_reads[0], data2_reads.size(), | 1374 OrderedSocketData data2(&data2_reads[0], |
1385 &data2_writes[0], data2_writes.size()); | 1375 data2_reads.size(), |
| 1376 &data2_writes[0], |
| 1377 data2_writes.size()); |
1386 session_deps_.socket_factory->AddSocketDataProvider(&data2); | 1378 session_deps_.socket_factory->AddSocketDataProvider(&data2); |
1387 | 1379 |
1388 // Preconnect a socket. | 1380 // Preconnect a socket. |
1389 net::SSLConfig ssl_config; | 1381 net::SSLConfig ssl_config; |
1390 session->ssl_config_service()->GetSSLConfig(&ssl_config); | 1382 session->ssl_config_service()->GetSSLConfig(&ssl_config); |
1391 if (session->http_stream_factory()->has_next_protos()) | 1383 if (session->http_stream_factory()->has_next_protos()) |
1392 ssl_config.next_protos = session->http_stream_factory()->next_protos(); | 1384 ssl_config.next_protos = session->http_stream_factory()->next_protos(); |
1393 session->http_stream_factory()->PreconnectStreams( | 1385 session->http_stream_factory()->PreconnectStreams( |
1394 1, request, DEFAULT_PRIORITY, ssl_config, ssl_config); | 1386 1, request, DEFAULT_PRIORITY, ssl_config, ssl_config); |
1395 // Wait for the preconnect to complete. | 1387 // Wait for the preconnect to complete. |
(...skipping 10 matching lines...) Expand all Loading... |
1406 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 1398 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
1407 EXPECT_EQ(ERR_IO_PENDING, rv); | 1399 EXPECT_EQ(ERR_IO_PENDING, rv); |
1408 | 1400 |
1409 rv = callback.WaitForResult(); | 1401 rv = callback.WaitForResult(); |
1410 EXPECT_EQ(OK, rv); | 1402 EXPECT_EQ(OK, rv); |
1411 | 1403 |
1412 LoadTimingInfo load_timing_info; | 1404 LoadTimingInfo load_timing_info; |
1413 EXPECT_TRUE(trans->GetLoadTimingInfo(&load_timing_info)); | 1405 EXPECT_TRUE(trans->GetLoadTimingInfo(&load_timing_info)); |
1414 TestLoadTimingNotReused( | 1406 TestLoadTimingNotReused( |
1415 load_timing_info, | 1407 load_timing_info, |
1416 CONNECT_TIMING_HAS_DNS_TIMES|CONNECT_TIMING_HAS_SSL_TIMES); | 1408 CONNECT_TIMING_HAS_DNS_TIMES | CONNECT_TIMING_HAS_SSL_TIMES); |
1417 | 1409 |
1418 const HttpResponseInfo* response = trans->GetResponseInfo(); | 1410 const HttpResponseInfo* response = trans->GetResponseInfo(); |
1419 ASSERT_TRUE(response != NULL); | 1411 ASSERT_TRUE(response != NULL); |
1420 | 1412 |
1421 EXPECT_TRUE(response->headers.get() != NULL); | 1413 EXPECT_TRUE(response->headers.get() != NULL); |
1422 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); | 1414 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
1423 | 1415 |
1424 std::string response_data; | 1416 std::string response_data; |
1425 rv = ReadTransaction(trans.get(), &response_data); | 1417 rv = ReadTransaction(trans.get(), &response_data); |
1426 EXPECT_EQ(OK, rv); | 1418 EXPECT_EQ(OK, rv); |
1427 EXPECT_EQ(kHttpData, response_data); | 1419 EXPECT_EQ(kHttpData, response_data); |
1428 } | 1420 } |
1429 | 1421 |
1430 TEST_P(HttpNetworkTransactionTest, | 1422 TEST_P(HttpNetworkTransactionTest, KeepAliveConnectionNotConnectedOnWrite) { |
1431 KeepAliveConnectionNotConnectedOnWrite) { | |
1432 MockWrite write_failure(ASYNC, ERR_SOCKET_NOT_CONNECTED); | 1423 MockWrite write_failure(ASYNC, ERR_SOCKET_NOT_CONNECTED); |
1433 KeepAliveConnectionResendRequestTest(&write_failure, NULL); | 1424 KeepAliveConnectionResendRequestTest(&write_failure, NULL); |
1434 } | 1425 } |
1435 | 1426 |
1436 TEST_P(HttpNetworkTransactionTest, KeepAliveConnectionReset) { | 1427 TEST_P(HttpNetworkTransactionTest, KeepAliveConnectionReset) { |
1437 MockRead read_failure(ASYNC, ERR_CONNECTION_RESET); | 1428 MockRead read_failure(ASYNC, ERR_CONNECTION_RESET); |
1438 KeepAliveConnectionResendRequestTest(NULL, &read_failure); | 1429 KeepAliveConnectionResendRequestTest(NULL, &read_failure); |
1439 } | 1430 } |
1440 | 1431 |
1441 TEST_P(HttpNetworkTransactionTest, KeepAliveConnectionEOF) { | 1432 TEST_P(HttpNetworkTransactionTest, KeepAliveConnectionEOF) { |
1442 MockRead read_failure(SYNCHRONOUS, OK); // EOF | 1433 MockRead read_failure(SYNCHRONOUS, OK); // EOF |
1443 KeepAliveConnectionResendRequestTest(NULL, &read_failure); | 1434 KeepAliveConnectionResendRequestTest(NULL, &read_failure); |
1444 } | 1435 } |
1445 | 1436 |
1446 TEST_P(HttpNetworkTransactionTest, | 1437 TEST_P(HttpNetworkTransactionTest, PreconnectErrorNotConnectedOnWrite) { |
1447 PreconnectErrorNotConnectedOnWrite) { | |
1448 MockWrite write_failure(ASYNC, ERR_SOCKET_NOT_CONNECTED); | 1438 MockWrite write_failure(ASYNC, ERR_SOCKET_NOT_CONNECTED); |
1449 PreconnectErrorResendRequestTest(&write_failure, NULL, false); | 1439 PreconnectErrorResendRequestTest(&write_failure, NULL, false); |
1450 } | 1440 } |
1451 | 1441 |
1452 TEST_P(HttpNetworkTransactionTest, PreconnectErrorReset) { | 1442 TEST_P(HttpNetworkTransactionTest, PreconnectErrorReset) { |
1453 MockRead read_failure(ASYNC, ERR_CONNECTION_RESET); | 1443 MockRead read_failure(ASYNC, ERR_CONNECTION_RESET); |
1454 PreconnectErrorResendRequestTest(NULL, &read_failure, false); | 1444 PreconnectErrorResendRequestTest(NULL, &read_failure, false); |
1455 } | 1445 } |
1456 | 1446 |
1457 TEST_P(HttpNetworkTransactionTest, PreconnectErrorEOF) { | 1447 TEST_P(HttpNetworkTransactionTest, PreconnectErrorEOF) { |
1458 MockRead read_failure(SYNCHRONOUS, OK); // EOF | 1448 MockRead read_failure(SYNCHRONOUS, OK); // EOF |
1459 PreconnectErrorResendRequestTest(NULL, &read_failure, false); | 1449 PreconnectErrorResendRequestTest(NULL, &read_failure, false); |
1460 } | 1450 } |
1461 | 1451 |
1462 TEST_P(HttpNetworkTransactionTest, PreconnectErrorAsyncEOF) { | 1452 TEST_P(HttpNetworkTransactionTest, PreconnectErrorAsyncEOF) { |
1463 MockRead read_failure(ASYNC, OK); // EOF | 1453 MockRead read_failure(ASYNC, OK); // EOF |
1464 PreconnectErrorResendRequestTest(NULL, &read_failure, false); | 1454 PreconnectErrorResendRequestTest(NULL, &read_failure, false); |
1465 } | 1455 } |
1466 | 1456 |
1467 TEST_P(HttpNetworkTransactionTest, | 1457 TEST_P(HttpNetworkTransactionTest, SpdyPreconnectErrorNotConnectedOnWrite) { |
1468 SpdyPreconnectErrorNotConnectedOnWrite) { | |
1469 MockWrite write_failure(ASYNC, ERR_SOCKET_NOT_CONNECTED); | 1458 MockWrite write_failure(ASYNC, ERR_SOCKET_NOT_CONNECTED); |
1470 PreconnectErrorResendRequestTest(&write_failure, NULL, true); | 1459 PreconnectErrorResendRequestTest(&write_failure, NULL, true); |
1471 } | 1460 } |
1472 | 1461 |
1473 TEST_P(HttpNetworkTransactionTest, SpdyPreconnectErrorReset) { | 1462 TEST_P(HttpNetworkTransactionTest, SpdyPreconnectErrorReset) { |
1474 MockRead read_failure(ASYNC, ERR_CONNECTION_RESET); | 1463 MockRead read_failure(ASYNC, ERR_CONNECTION_RESET); |
1475 PreconnectErrorResendRequestTest(NULL, &read_failure, true); | 1464 PreconnectErrorResendRequestTest(NULL, &read_failure, true); |
1476 } | 1465 } |
1477 | 1466 |
1478 TEST_P(HttpNetworkTransactionTest, SpdyPreconnectErrorEOF) { | 1467 TEST_P(HttpNetworkTransactionTest, SpdyPreconnectErrorEOF) { |
(...skipping 10 matching lines...) Expand all Loading... |
1489 HttpRequestInfo request; | 1478 HttpRequestInfo request; |
1490 request.method = "GET"; | 1479 request.method = "GET"; |
1491 request.url = GURL("http://www.google.com/"); | 1480 request.url = GURL("http://www.google.com/"); |
1492 request.load_flags = 0; | 1481 request.load_flags = 0; |
1493 | 1482 |
1494 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 1483 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
1495 scoped_ptr<HttpTransaction> trans( | 1484 scoped_ptr<HttpTransaction> trans( |
1496 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 1485 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
1497 | 1486 |
1498 MockRead data_reads[] = { | 1487 MockRead data_reads[] = { |
1499 MockRead(ASYNC, ERR_CONNECTION_RESET), | 1488 MockRead(ASYNC, ERR_CONNECTION_RESET), |
1500 MockRead("HTTP/1.0 200 OK\r\n\r\n"), // Should not be used | 1489 MockRead("HTTP/1.0 200 OK\r\n\r\n"), // Should not be used |
1501 MockRead("hello world"), | 1490 MockRead("hello world"), MockRead(SYNCHRONOUS, OK), |
1502 MockRead(SYNCHRONOUS, OK), | |
1503 }; | 1491 }; |
1504 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); | 1492 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); |
1505 session_deps_.socket_factory->AddSocketDataProvider(&data); | 1493 session_deps_.socket_factory->AddSocketDataProvider(&data); |
1506 | 1494 |
1507 TestCompletionCallback callback; | 1495 TestCompletionCallback callback; |
1508 | 1496 |
1509 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 1497 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
1510 EXPECT_EQ(ERR_IO_PENDING, rv); | 1498 EXPECT_EQ(ERR_IO_PENDING, rv); |
1511 | 1499 |
1512 rv = callback.WaitForResult(); | 1500 rv = callback.WaitForResult(); |
1513 EXPECT_EQ(ERR_CONNECTION_RESET, rv); | 1501 EXPECT_EQ(ERR_CONNECTION_RESET, rv); |
1514 | 1502 |
1515 const HttpResponseInfo* response = trans->GetResponseInfo(); | 1503 const HttpResponseInfo* response = trans->GetResponseInfo(); |
1516 EXPECT_TRUE(response == NULL); | 1504 EXPECT_TRUE(response == NULL); |
1517 } | 1505 } |
1518 | 1506 |
1519 // What do various browsers do when the server closes a non-keepalive | 1507 // What do various browsers do when the server closes a non-keepalive |
1520 // connection without sending any response header or body? | 1508 // connection without sending any response header or body? |
1521 // | 1509 // |
1522 // IE7: error page | 1510 // IE7: error page |
1523 // Safari 3.1.2 (Windows): error page | 1511 // Safari 3.1.2 (Windows): error page |
1524 // Firefox 3.0.1: blank page | 1512 // Firefox 3.0.1: blank page |
1525 // Opera 9.52: after five attempts, blank page | 1513 // Opera 9.52: after five attempts, blank page |
1526 // Us with WinHTTP: error page (ERR_INVALID_RESPONSE) | 1514 // Us with WinHTTP: error page (ERR_INVALID_RESPONSE) |
1527 // Us: error page (EMPTY_RESPONSE) | 1515 // Us: error page (EMPTY_RESPONSE) |
1528 TEST_P(HttpNetworkTransactionTest, NonKeepAliveConnectionEOF) { | 1516 TEST_P(HttpNetworkTransactionTest, NonKeepAliveConnectionEOF) { |
1529 MockRead data_reads[] = { | 1517 MockRead data_reads[] = { |
1530 MockRead(SYNCHRONOUS, OK), // EOF | 1518 MockRead(SYNCHRONOUS, OK), // EOF |
1531 MockRead("HTTP/1.0 200 OK\r\n\r\n"), // Should not be used | 1519 MockRead("HTTP/1.0 200 OK\r\n\r\n"), // Should not be used |
1532 MockRead("hello world"), | 1520 MockRead("hello world"), MockRead(SYNCHRONOUS, OK), |
1533 MockRead(SYNCHRONOUS, OK), | |
1534 }; | 1521 }; |
1535 SimpleGetHelperResult out = SimpleGetHelper(data_reads, | 1522 SimpleGetHelperResult out = |
1536 arraysize(data_reads)); | 1523 SimpleGetHelper(data_reads, arraysize(data_reads)); |
1537 EXPECT_EQ(ERR_EMPTY_RESPONSE, out.rv); | 1524 EXPECT_EQ(ERR_EMPTY_RESPONSE, out.rv); |
1538 } | 1525 } |
1539 | 1526 |
1540 // Test that network access can be deferred and resumed. | 1527 // Test that network access can be deferred and resumed. |
1541 TEST_P(HttpNetworkTransactionTest, ThrottleBeforeNetworkStart) { | 1528 TEST_P(HttpNetworkTransactionTest, ThrottleBeforeNetworkStart) { |
1542 HttpRequestInfo request; | 1529 HttpRequestInfo request; |
1543 request.method = "GET"; | 1530 request.method = "GET"; |
1544 request.url = GURL("http://www.google.com/"); | 1531 request.url = GURL("http://www.google.com/"); |
1545 request.load_flags = 0; | 1532 request.load_flags = 0; |
1546 | 1533 |
1547 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 1534 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
1548 scoped_ptr<HttpTransaction> trans( | 1535 scoped_ptr<HttpTransaction> trans( |
1549 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 1536 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
1550 | 1537 |
1551 // Defer on OnBeforeNetworkStart. | 1538 // Defer on OnBeforeNetworkStart. |
1552 BeforeNetworkStartHandler net_start_handler(true); // defer | 1539 BeforeNetworkStartHandler net_start_handler(true); // defer |
1553 trans->SetBeforeNetworkStartCallback( | 1540 trans->SetBeforeNetworkStartCallback( |
1554 base::Bind(&BeforeNetworkStartHandler::OnBeforeNetworkStart, | 1541 base::Bind(&BeforeNetworkStartHandler::OnBeforeNetworkStart, |
1555 base::Unretained(&net_start_handler))); | 1542 base::Unretained(&net_start_handler))); |
1556 | 1543 |
1557 MockRead data_reads[] = { | 1544 MockRead data_reads[] = { |
1558 MockRead("HTTP/1.0 200 OK\r\n"), | 1545 MockRead("HTTP/1.0 200 OK\r\n"), MockRead("Content-Length: 5\r\n\r\n"), |
1559 MockRead("Content-Length: 5\r\n\r\n"), | 1546 MockRead("hello"), MockRead(SYNCHRONOUS, 0), |
1560 MockRead("hello"), | |
1561 MockRead(SYNCHRONOUS, 0), | |
1562 }; | 1547 }; |
1563 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); | 1548 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); |
1564 session_deps_.socket_factory->AddSocketDataProvider(&data); | 1549 session_deps_.socket_factory->AddSocketDataProvider(&data); |
1565 | 1550 |
1566 TestCompletionCallback callback; | 1551 TestCompletionCallback callback; |
1567 | 1552 |
1568 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 1553 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
1569 EXPECT_EQ(ERR_IO_PENDING, rv); | 1554 EXPECT_EQ(ERR_IO_PENDING, rv); |
1570 base::MessageLoop::current()->RunUntilIdle(); | 1555 base::MessageLoop::current()->RunUntilIdle(); |
1571 | 1556 |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1624 HttpRequestInfo request; | 1609 HttpRequestInfo request; |
1625 request.method = "GET"; | 1610 request.method = "GET"; |
1626 request.url = GURL("http://www.google.com/"); | 1611 request.url = GURL("http://www.google.com/"); |
1627 request.load_flags = 0; | 1612 request.load_flags = 0; |
1628 | 1613 |
1629 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 1614 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
1630 scoped_ptr<HttpTransaction> trans( | 1615 scoped_ptr<HttpTransaction> trans( |
1631 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 1616 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
1632 | 1617 |
1633 MockRead data_reads[] = { | 1618 MockRead data_reads[] = { |
1634 MockRead("HTTP/1.0 200 OK\r\n"), | 1619 MockRead("HTTP/1.0 200 OK\r\n"), |
1635 MockRead("Connection: keep-alive\r\n"), | 1620 MockRead("Connection: keep-alive\r\n"), |
1636 MockRead("Content-Length: 100\r\n\r\n"), | 1621 MockRead("Content-Length: 100\r\n\r\n"), |
1637 MockRead("hello"), | 1622 MockRead("hello"), |
1638 MockRead(SYNCHRONOUS, 0), | 1623 MockRead(SYNCHRONOUS, 0), |
1639 }; | 1624 }; |
1640 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); | 1625 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); |
1641 session_deps_.socket_factory->AddSocketDataProvider(&data); | 1626 session_deps_.socket_factory->AddSocketDataProvider(&data); |
1642 | 1627 |
1643 TestCompletionCallback callback; | 1628 TestCompletionCallback callback; |
1644 | 1629 |
1645 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 1630 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
1646 EXPECT_EQ(ERR_IO_PENDING, rv); | 1631 EXPECT_EQ(ERR_IO_PENDING, rv); |
1647 | 1632 |
1648 rv = callback.WaitForResult(); | 1633 rv = callback.WaitForResult(); |
(...skipping 16 matching lines...) Expand all Loading... |
1665 HttpRequestInfo request; | 1650 HttpRequestInfo request; |
1666 request.method = "GET"; | 1651 request.method = "GET"; |
1667 request.url = GURL("http://www.google.com/"); | 1652 request.url = GURL("http://www.google.com/"); |
1668 request.load_flags = 0; | 1653 request.load_flags = 0; |
1669 | 1654 |
1670 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 1655 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
1671 scoped_ptr<HttpTransaction> trans( | 1656 scoped_ptr<HttpTransaction> trans( |
1672 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 1657 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
1673 | 1658 |
1674 MockRead data_reads[] = { | 1659 MockRead data_reads[] = { |
1675 MockRead("HTTP/1.0 200 OK\r\n"), | 1660 MockRead("HTTP/1.0 200 OK\r\n"), MockRead("Connection: keep-alive\r\n"), |
1676 MockRead("Connection: keep-alive\r\n"), | 1661 MockRead("Content-Length: 100\r\n\r\n"), MockRead(SYNCHRONOUS, 0), |
1677 MockRead("Content-Length: 100\r\n\r\n"), | |
1678 MockRead(SYNCHRONOUS, 0), | |
1679 }; | 1662 }; |
1680 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); | 1663 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); |
1681 session_deps_.socket_factory->AddSocketDataProvider(&data); | 1664 session_deps_.socket_factory->AddSocketDataProvider(&data); |
1682 | 1665 |
1683 TestCompletionCallback callback; | 1666 TestCompletionCallback callback; |
1684 | 1667 |
1685 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 1668 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
1686 EXPECT_EQ(ERR_IO_PENDING, rv); | 1669 EXPECT_EQ(ERR_IO_PENDING, rv); |
1687 | 1670 |
1688 rv = callback.WaitForResult(); | 1671 rv = callback.WaitForResult(); |
(...skipping 19 matching lines...) Expand all Loading... |
1708 request.load_flags = 0; | 1691 request.load_flags = 0; |
1709 | 1692 |
1710 CapturingNetLog net_log; | 1693 CapturingNetLog net_log; |
1711 session_deps_.net_log = &net_log; | 1694 session_deps_.net_log = &net_log; |
1712 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 1695 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
1713 | 1696 |
1714 // Note that because all these reads happen in the same | 1697 // Note that because all these reads happen in the same |
1715 // StaticSocketDataProvider, it shows that the same socket is being reused for | 1698 // StaticSocketDataProvider, it shows that the same socket is being reused for |
1716 // all transactions. | 1699 // all transactions. |
1717 MockRead data1_reads[] = { | 1700 MockRead data1_reads[] = { |
1718 MockRead("HTTP/1.1 204 No Content\r\n\r\n"), | 1701 MockRead("HTTP/1.1 204 No Content\r\n\r\n"), |
1719 MockRead("HTTP/1.1 205 Reset Content\r\n\r\n"), | 1702 MockRead("HTTP/1.1 205 Reset Content\r\n\r\n"), |
1720 MockRead("HTTP/1.1 304 Not Modified\r\n\r\n"), | 1703 MockRead("HTTP/1.1 304 Not Modified\r\n\r\n"), |
1721 MockRead("HTTP/1.1 302 Found\r\n" | 1704 MockRead( |
1722 "Content-Length: 0\r\n\r\n"), | 1705 "HTTP/1.1 302 Found\r\n" |
1723 MockRead("HTTP/1.1 302 Found\r\n" | 1706 "Content-Length: 0\r\n\r\n"), |
1724 "Content-Length: 5\r\n\r\n" | 1707 MockRead( |
1725 "hello"), | 1708 "HTTP/1.1 302 Found\r\n" |
1726 MockRead("HTTP/1.1 301 Moved Permanently\r\n" | 1709 "Content-Length: 5\r\n\r\n" |
1727 "Content-Length: 0\r\n\r\n"), | 1710 "hello"), |
1728 MockRead("HTTP/1.1 301 Moved Permanently\r\n" | 1711 MockRead( |
1729 "Content-Length: 5\r\n\r\n" | 1712 "HTTP/1.1 301 Moved Permanently\r\n" |
1730 "hello"), | 1713 "Content-Length: 0\r\n\r\n"), |
1731 MockRead("HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\n"), | 1714 MockRead( |
1732 MockRead("hello"), | 1715 "HTTP/1.1 301 Moved Permanently\r\n" |
| 1716 "Content-Length: 5\r\n\r\n" |
| 1717 "hello"), |
| 1718 MockRead("HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\n"), |
| 1719 MockRead("hello"), |
1733 }; | 1720 }; |
1734 StaticSocketDataProvider data1(data1_reads, arraysize(data1_reads), NULL, 0); | 1721 StaticSocketDataProvider data1(data1_reads, arraysize(data1_reads), NULL, 0); |
1735 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 1722 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
1736 | 1723 |
1737 MockRead data2_reads[] = { | 1724 MockRead data2_reads[] = { |
1738 MockRead(SYNCHRONOUS, ERR_UNEXPECTED), // Should not be reached. | 1725 MockRead(SYNCHRONOUS, ERR_UNEXPECTED), // Should not be reached. |
1739 }; | 1726 }; |
1740 StaticSocketDataProvider data2(data2_reads, arraysize(data2_reads), NULL, 0); | 1727 StaticSocketDataProvider data2(data2_reads, arraysize(data2_reads), NULL, 0); |
1741 session_deps_.socket_factory->AddSocketDataProvider(&data2); | 1728 session_deps_.socket_factory->AddSocketDataProvider(&data2); |
1742 | 1729 |
1743 const int kNumUnreadBodies = arraysize(data1_reads) - 2; | 1730 const int kNumUnreadBodies = arraysize(data1_reads) - 2; |
1744 std::string response_lines[kNumUnreadBodies]; | 1731 std::string response_lines[kNumUnreadBodies]; |
1745 | 1732 |
1746 uint32 first_socket_log_id = NetLog::Source::kInvalidId; | 1733 uint32 first_socket_log_id = NetLog::Source::kInvalidId; |
1747 for (size_t i = 0; i < arraysize(data1_reads) - 2; ++i) { | 1734 for (size_t i = 0; i < arraysize(data1_reads) - 2; ++i) { |
1748 TestCompletionCallback callback; | 1735 TestCompletionCallback callback; |
(...skipping 20 matching lines...) Expand all Loading... |
1769 const HttpResponseInfo* response = trans->GetResponseInfo(); | 1756 const HttpResponseInfo* response = trans->GetResponseInfo(); |
1770 ASSERT_TRUE(response != NULL); | 1757 ASSERT_TRUE(response != NULL); |
1771 | 1758 |
1772 ASSERT_TRUE(response->headers.get() != NULL); | 1759 ASSERT_TRUE(response->headers.get() != NULL); |
1773 response_lines[i] = response->headers->GetStatusLine(); | 1760 response_lines[i] = response->headers->GetStatusLine(); |
1774 | 1761 |
1775 // We intentionally don't read the response bodies. | 1762 // We intentionally don't read the response bodies. |
1776 } | 1763 } |
1777 | 1764 |
1778 const char* const kStatusLines[] = { | 1765 const char* const kStatusLines[] = { |
1779 "HTTP/1.1 204 No Content", | 1766 "HTTP/1.1 204 No Content", "HTTP/1.1 205 Reset Content", |
1780 "HTTP/1.1 205 Reset Content", | 1767 "HTTP/1.1 304 Not Modified", "HTTP/1.1 302 Found", |
1781 "HTTP/1.1 304 Not Modified", | 1768 "HTTP/1.1 302 Found", "HTTP/1.1 301 Moved Permanently", |
1782 "HTTP/1.1 302 Found", | 1769 "HTTP/1.1 301 Moved Permanently", |
1783 "HTTP/1.1 302 Found", | |
1784 "HTTP/1.1 301 Moved Permanently", | |
1785 "HTTP/1.1 301 Moved Permanently", | |
1786 }; | 1770 }; |
1787 | 1771 |
1788 COMPILE_ASSERT(kNumUnreadBodies == arraysize(kStatusLines), | 1772 COMPILE_ASSERT(kNumUnreadBodies == arraysize(kStatusLines), |
1789 forgot_to_update_kStatusLines); | 1773 forgot_to_update_kStatusLines); |
1790 | 1774 |
1791 for (int i = 0; i < kNumUnreadBodies; ++i) | 1775 for (int i = 0; i < kNumUnreadBodies; ++i) |
1792 EXPECT_EQ(kStatusLines[i], response_lines[i]); | 1776 EXPECT_EQ(kStatusLines[i], response_lines[i]); |
1793 | 1777 |
1794 TestCompletionCallback callback; | 1778 TestCompletionCallback callback; |
1795 scoped_ptr<HttpTransaction> trans( | 1779 scoped_ptr<HttpTransaction> trans( |
(...skipping 20 matching lines...) Expand all Loading... |
1816 request.url = GURL("http://www.google.com/"); | 1800 request.url = GURL("http://www.google.com/"); |
1817 request.load_flags = 0; | 1801 request.load_flags = 0; |
1818 | 1802 |
1819 CapturingNetLog log; | 1803 CapturingNetLog log; |
1820 session_deps_.net_log = &log; | 1804 session_deps_.net_log = &log; |
1821 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 1805 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
1822 scoped_ptr<HttpTransaction> trans( | 1806 scoped_ptr<HttpTransaction> trans( |
1823 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 1807 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
1824 | 1808 |
1825 MockWrite data_writes1[] = { | 1809 MockWrite data_writes1[] = { |
1826 MockWrite("GET / HTTP/1.1\r\n" | 1810 MockWrite( |
1827 "Host: www.google.com\r\n" | 1811 "GET / HTTP/1.1\r\n" |
1828 "Connection: keep-alive\r\n\r\n"), | 1812 "Host: www.google.com\r\n" |
| 1813 "Connection: keep-alive\r\n\r\n"), |
1829 }; | 1814 }; |
1830 | 1815 |
1831 MockRead data_reads1[] = { | 1816 MockRead data_reads1[] = { |
1832 MockRead("HTTP/1.0 401 Unauthorized\r\n"), | 1817 MockRead("HTTP/1.0 401 Unauthorized\r\n"), |
1833 // Give a couple authenticate options (only the middle one is actually | 1818 // Give a couple authenticate options (only the middle one is actually |
1834 // supported). | 1819 // supported). |
1835 MockRead("WWW-Authenticate: Basic invalid\r\n"), // Malformed. | 1820 MockRead("WWW-Authenticate: Basic invalid\r\n"), // Malformed. |
1836 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | 1821 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
1837 MockRead("WWW-Authenticate: UNSUPPORTED realm=\"FOO\"\r\n"), | 1822 MockRead("WWW-Authenticate: UNSUPPORTED realm=\"FOO\"\r\n"), |
1838 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 1823 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
1839 // Large content-length -- won't matter, as connection will be reset. | 1824 // Large content-length -- won't matter, as connection will be reset. |
1840 MockRead("Content-Length: 10000\r\n\r\n"), | 1825 MockRead("Content-Length: 10000\r\n\r\n"), |
1841 MockRead(SYNCHRONOUS, ERR_FAILED), | 1826 MockRead(SYNCHRONOUS, ERR_FAILED), |
1842 }; | 1827 }; |
1843 | 1828 |
1844 // After calling trans->RestartWithAuth(), this is the request we should | 1829 // After calling trans->RestartWithAuth(), this is the request we should |
1845 // be issuing -- the final header line contains the credentials. | 1830 // be issuing -- the final header line contains the credentials. |
1846 MockWrite data_writes2[] = { | 1831 MockWrite data_writes2[] = { |
1847 MockWrite("GET / HTTP/1.1\r\n" | 1832 MockWrite( |
1848 "Host: www.google.com\r\n" | 1833 "GET / HTTP/1.1\r\n" |
1849 "Connection: keep-alive\r\n" | 1834 "Host: www.google.com\r\n" |
1850 "Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 1835 "Connection: keep-alive\r\n" |
| 1836 "Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
1851 }; | 1837 }; |
1852 | 1838 |
1853 // Lastly, the server responds with the actual content. | 1839 // Lastly, the server responds with the actual content. |
1854 MockRead data_reads2[] = { | 1840 MockRead data_reads2[] = { |
1855 MockRead("HTTP/1.0 200 OK\r\n"), | 1841 MockRead("HTTP/1.0 200 OK\r\n"), |
1856 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 1842 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
1857 MockRead("Content-Length: 100\r\n\r\n"), | 1843 MockRead("Content-Length: 100\r\n\r\n"), MockRead(SYNCHRONOUS, OK), |
1858 MockRead(SYNCHRONOUS, OK), | |
1859 }; | 1844 }; |
1860 | 1845 |
1861 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 1846 StaticSocketDataProvider data1(data_reads1, |
1862 data_writes1, arraysize(data_writes1)); | 1847 arraysize(data_reads1), |
1863 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), | 1848 data_writes1, |
1864 data_writes2, arraysize(data_writes2)); | 1849 arraysize(data_writes1)); |
| 1850 StaticSocketDataProvider data2(data_reads2, |
| 1851 arraysize(data_reads2), |
| 1852 data_writes2, |
| 1853 arraysize(data_writes2)); |
1865 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 1854 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
1866 session_deps_.socket_factory->AddSocketDataProvider(&data2); | 1855 session_deps_.socket_factory->AddSocketDataProvider(&data2); |
1867 | 1856 |
1868 TestCompletionCallback callback1; | 1857 TestCompletionCallback callback1; |
1869 | 1858 |
1870 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); | 1859 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); |
1871 EXPECT_EQ(ERR_IO_PENDING, rv); | 1860 EXPECT_EQ(ERR_IO_PENDING, rv); |
1872 | 1861 |
1873 rv = callback1.WaitForResult(); | 1862 rv = callback1.WaitForResult(); |
1874 EXPECT_EQ(OK, rv); | 1863 EXPECT_EQ(OK, rv); |
1875 | 1864 |
1876 LoadTimingInfo load_timing_info1; | 1865 LoadTimingInfo load_timing_info1; |
1877 EXPECT_TRUE(trans->GetLoadTimingInfo(&load_timing_info1)); | 1866 EXPECT_TRUE(trans->GetLoadTimingInfo(&load_timing_info1)); |
1878 TestLoadTimingNotReused(load_timing_info1, CONNECT_TIMING_HAS_DNS_TIMES); | 1867 TestLoadTimingNotReused(load_timing_info1, CONNECT_TIMING_HAS_DNS_TIMES); |
1879 | 1868 |
1880 int64 reads_size1 = ReadsSize(data_reads1, arraysize(data_reads1)); | 1869 int64 reads_size1 = ReadsSize(data_reads1, arraysize(data_reads1)); |
1881 EXPECT_EQ(reads_size1, trans->GetTotalReceivedBytes()); | 1870 EXPECT_EQ(reads_size1, trans->GetTotalReceivedBytes()); |
1882 | 1871 |
1883 const HttpResponseInfo* response = trans->GetResponseInfo(); | 1872 const HttpResponseInfo* response = trans->GetResponseInfo(); |
1884 ASSERT_TRUE(response != NULL); | 1873 ASSERT_TRUE(response != NULL); |
1885 EXPECT_TRUE(CheckBasicServerAuth(response->auth_challenge.get())); | 1874 EXPECT_TRUE(CheckBasicServerAuth(response->auth_challenge.get())); |
1886 | 1875 |
1887 TestCompletionCallback callback2; | 1876 TestCompletionCallback callback2; |
1888 | 1877 |
1889 rv = trans->RestartWithAuth( | 1878 rv = |
1890 AuthCredentials(kFoo, kBar), callback2.callback()); | 1879 trans->RestartWithAuth(AuthCredentials(kFoo, kBar), callback2.callback()); |
1891 EXPECT_EQ(ERR_IO_PENDING, rv); | 1880 EXPECT_EQ(ERR_IO_PENDING, rv); |
1892 | 1881 |
1893 rv = callback2.WaitForResult(); | 1882 rv = callback2.WaitForResult(); |
1894 EXPECT_EQ(OK, rv); | 1883 EXPECT_EQ(OK, rv); |
1895 | 1884 |
1896 LoadTimingInfo load_timing_info2; | 1885 LoadTimingInfo load_timing_info2; |
1897 EXPECT_TRUE(trans->GetLoadTimingInfo(&load_timing_info2)); | 1886 EXPECT_TRUE(trans->GetLoadTimingInfo(&load_timing_info2)); |
1898 TestLoadTimingNotReused(load_timing_info2, CONNECT_TIMING_HAS_DNS_TIMES); | 1887 TestLoadTimingNotReused(load_timing_info2, CONNECT_TIMING_HAS_DNS_TIMES); |
1899 // The load timing after restart should have a new socket ID, and times after | 1888 // The load timing after restart should have a new socket ID, and times after |
1900 // those of the first load timing. | 1889 // those of the first load timing. |
(...skipping 14 matching lines...) Expand all Loading... |
1915 HttpRequestInfo request; | 1904 HttpRequestInfo request; |
1916 request.method = "GET"; | 1905 request.method = "GET"; |
1917 request.url = GURL("http://www.google.com/"); | 1906 request.url = GURL("http://www.google.com/"); |
1918 request.load_flags = net::LOAD_DO_NOT_SEND_AUTH_DATA; | 1907 request.load_flags = net::LOAD_DO_NOT_SEND_AUTH_DATA; |
1919 | 1908 |
1920 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 1909 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
1921 scoped_ptr<HttpTransaction> trans( | 1910 scoped_ptr<HttpTransaction> trans( |
1922 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 1911 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
1923 | 1912 |
1924 MockWrite data_writes[] = { | 1913 MockWrite data_writes[] = { |
1925 MockWrite("GET / HTTP/1.1\r\n" | 1914 MockWrite( |
1926 "Host: www.google.com\r\n" | 1915 "GET / HTTP/1.1\r\n" |
1927 "Connection: keep-alive\r\n\r\n"), | 1916 "Host: www.google.com\r\n" |
| 1917 "Connection: keep-alive\r\n\r\n"), |
1928 }; | 1918 }; |
1929 | 1919 |
1930 MockRead data_reads[] = { | 1920 MockRead data_reads[] = { |
1931 MockRead("HTTP/1.0 401 Unauthorized\r\n"), | 1921 MockRead("HTTP/1.0 401 Unauthorized\r\n"), |
1932 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | 1922 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
1933 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 1923 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
1934 // Large content-length -- won't matter, as connection will be reset. | 1924 // Large content-length -- won't matter, as connection will be reset. |
1935 MockRead("Content-Length: 10000\r\n\r\n"), | 1925 MockRead("Content-Length: 10000\r\n\r\n"), |
1936 MockRead(SYNCHRONOUS, ERR_FAILED), | 1926 MockRead(SYNCHRONOUS, ERR_FAILED), |
1937 }; | 1927 }; |
1938 | 1928 |
1939 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 1929 StaticSocketDataProvider data( |
1940 data_writes, arraysize(data_writes)); | 1930 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
1941 session_deps_.socket_factory->AddSocketDataProvider(&data); | 1931 session_deps_.socket_factory->AddSocketDataProvider(&data); |
1942 TestCompletionCallback callback; | 1932 TestCompletionCallback callback; |
1943 | 1933 |
1944 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 1934 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
1945 EXPECT_EQ(ERR_IO_PENDING, rv); | 1935 EXPECT_EQ(ERR_IO_PENDING, rv); |
1946 | 1936 |
1947 rv = callback.WaitForResult(); | 1937 rv = callback.WaitForResult(); |
1948 EXPECT_EQ(0, rv); | 1938 EXPECT_EQ(0, rv); |
1949 | 1939 |
1950 int64 reads_size = ReadsSize(data_reads, arraysize(data_reads)); | 1940 int64 reads_size = ReadsSize(data_reads, arraysize(data_reads)); |
(...skipping 10 matching lines...) Expand all Loading... |
1961 HttpRequestInfo request; | 1951 HttpRequestInfo request; |
1962 request.method = "GET"; | 1952 request.method = "GET"; |
1963 request.url = GURL("http://www.google.com/"); | 1953 request.url = GURL("http://www.google.com/"); |
1964 request.load_flags = 0; | 1954 request.load_flags = 0; |
1965 | 1955 |
1966 CapturingNetLog log; | 1956 CapturingNetLog log; |
1967 session_deps_.net_log = &log; | 1957 session_deps_.net_log = &log; |
1968 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 1958 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
1969 | 1959 |
1970 MockWrite data_writes1[] = { | 1960 MockWrite data_writes1[] = { |
1971 MockWrite("GET / HTTP/1.1\r\n" | 1961 MockWrite( |
1972 "Host: www.google.com\r\n" | 1962 "GET / HTTP/1.1\r\n" |
1973 "Connection: keep-alive\r\n\r\n"), | 1963 "Host: www.google.com\r\n" |
| 1964 "Connection: keep-alive\r\n\r\n"), |
1974 | 1965 |
1975 // After calling trans->RestartWithAuth(), this is the request we should | 1966 // After calling trans->RestartWithAuth(), this is the request we should |
1976 // be issuing -- the final header line contains the credentials. | 1967 // be issuing -- the final header line contains the credentials. |
1977 MockWrite("GET / HTTP/1.1\r\n" | 1968 MockWrite( |
1978 "Host: www.google.com\r\n" | 1969 "GET / HTTP/1.1\r\n" |
1979 "Connection: keep-alive\r\n" | 1970 "Host: www.google.com\r\n" |
1980 "Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 1971 "Connection: keep-alive\r\n" |
| 1972 "Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
1981 }; | 1973 }; |
1982 | 1974 |
1983 MockRead data_reads1[] = { | 1975 MockRead data_reads1[] = { |
1984 MockRead("HTTP/1.1 401 Unauthorized\r\n"), | 1976 MockRead("HTTP/1.1 401 Unauthorized\r\n"), |
1985 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | 1977 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
1986 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 1978 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
1987 MockRead("Content-Length: 14\r\n\r\n"), | 1979 MockRead("Content-Length: 14\r\n\r\n"), |
1988 MockRead("Unauthorized\r\n"), | 1980 MockRead("Unauthorized\r\n"), |
1989 | 1981 |
1990 // Lastly, the server responds with the actual content. | 1982 // Lastly, the server responds with the actual content. |
1991 MockRead("HTTP/1.1 200 OK\r\n"), | 1983 MockRead("HTTP/1.1 200 OK\r\n"), |
1992 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 1984 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
1993 MockRead("Content-Length: 5\r\n\r\n"), | 1985 MockRead("Content-Length: 5\r\n\r\n"), |
1994 MockRead("Hello"), | 1986 MockRead("Hello"), |
1995 }; | 1987 }; |
1996 | 1988 |
1997 // If there is a regression where we disconnect a Keep-Alive | 1989 // If there is a regression where we disconnect a Keep-Alive |
1998 // connection during an auth roundtrip, we'll end up reading this. | 1990 // connection during an auth roundtrip, we'll end up reading this. |
1999 MockRead data_reads2[] = { | 1991 MockRead data_reads2[] = { |
2000 MockRead(SYNCHRONOUS, ERR_FAILED), | 1992 MockRead(SYNCHRONOUS, ERR_FAILED), |
2001 }; | 1993 }; |
2002 | 1994 |
2003 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 1995 StaticSocketDataProvider data1(data_reads1, |
2004 data_writes1, arraysize(data_writes1)); | 1996 arraysize(data_reads1), |
2005 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), | 1997 data_writes1, |
2006 NULL, 0); | 1998 arraysize(data_writes1)); |
| 1999 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), NULL, 0); |
2007 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 2000 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
2008 session_deps_.socket_factory->AddSocketDataProvider(&data2); | 2001 session_deps_.socket_factory->AddSocketDataProvider(&data2); |
2009 | 2002 |
2010 TestCompletionCallback callback1; | 2003 TestCompletionCallback callback1; |
2011 | 2004 |
2012 scoped_ptr<HttpTransaction> trans( | 2005 scoped_ptr<HttpTransaction> trans( |
2013 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 2006 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
2014 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); | 2007 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); |
2015 EXPECT_EQ(ERR_IO_PENDING, rv); | 2008 EXPECT_EQ(ERR_IO_PENDING, rv); |
2016 | 2009 |
2017 rv = callback1.WaitForResult(); | 2010 rv = callback1.WaitForResult(); |
2018 EXPECT_EQ(OK, rv); | 2011 EXPECT_EQ(OK, rv); |
2019 | 2012 |
2020 LoadTimingInfo load_timing_info1; | 2013 LoadTimingInfo load_timing_info1; |
2021 EXPECT_TRUE(trans->GetLoadTimingInfo(&load_timing_info1)); | 2014 EXPECT_TRUE(trans->GetLoadTimingInfo(&load_timing_info1)); |
2022 TestLoadTimingNotReused(load_timing_info1, CONNECT_TIMING_HAS_DNS_TIMES); | 2015 TestLoadTimingNotReused(load_timing_info1, CONNECT_TIMING_HAS_DNS_TIMES); |
2023 | 2016 |
2024 const HttpResponseInfo* response = trans->GetResponseInfo(); | 2017 const HttpResponseInfo* response = trans->GetResponseInfo(); |
2025 ASSERT_TRUE(response != NULL); | 2018 ASSERT_TRUE(response != NULL); |
2026 EXPECT_TRUE(CheckBasicServerAuth(response->auth_challenge.get())); | 2019 EXPECT_TRUE(CheckBasicServerAuth(response->auth_challenge.get())); |
2027 | 2020 |
2028 TestCompletionCallback callback2; | 2021 TestCompletionCallback callback2; |
2029 | 2022 |
2030 rv = trans->RestartWithAuth( | 2023 rv = |
2031 AuthCredentials(kFoo, kBar), callback2.callback()); | 2024 trans->RestartWithAuth(AuthCredentials(kFoo, kBar), callback2.callback()); |
2032 EXPECT_EQ(ERR_IO_PENDING, rv); | 2025 EXPECT_EQ(ERR_IO_PENDING, rv); |
2033 | 2026 |
2034 rv = callback2.WaitForResult(); | 2027 rv = callback2.WaitForResult(); |
2035 EXPECT_EQ(OK, rv); | 2028 EXPECT_EQ(OK, rv); |
2036 | 2029 |
2037 LoadTimingInfo load_timing_info2; | 2030 LoadTimingInfo load_timing_info2; |
2038 EXPECT_TRUE(trans->GetLoadTimingInfo(&load_timing_info2)); | 2031 EXPECT_TRUE(trans->GetLoadTimingInfo(&load_timing_info2)); |
2039 TestLoadTimingReused(load_timing_info2); | 2032 TestLoadTimingReused(load_timing_info2); |
2040 // The load timing after restart should have the same socket ID, and times | 2033 // The load timing after restart should have the same socket ID, and times |
2041 // those of the first load timing. | 2034 // those of the first load timing. |
(...skipping 17 matching lines...) Expand all Loading... |
2059 // connection and with no response body to drain. | 2052 // connection and with no response body to drain. |
2060 TEST_P(HttpNetworkTransactionTest, BasicAuthKeepAliveNoBody) { | 2053 TEST_P(HttpNetworkTransactionTest, BasicAuthKeepAliveNoBody) { |
2061 HttpRequestInfo request; | 2054 HttpRequestInfo request; |
2062 request.method = "GET"; | 2055 request.method = "GET"; |
2063 request.url = GURL("http://www.google.com/"); | 2056 request.url = GURL("http://www.google.com/"); |
2064 request.load_flags = 0; | 2057 request.load_flags = 0; |
2065 | 2058 |
2066 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 2059 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
2067 | 2060 |
2068 MockWrite data_writes1[] = { | 2061 MockWrite data_writes1[] = { |
2069 MockWrite("GET / HTTP/1.1\r\n" | 2062 MockWrite( |
2070 "Host: www.google.com\r\n" | 2063 "GET / HTTP/1.1\r\n" |
2071 "Connection: keep-alive\r\n\r\n"), | 2064 "Host: www.google.com\r\n" |
| 2065 "Connection: keep-alive\r\n\r\n"), |
2072 | 2066 |
2073 // After calling trans->RestartWithAuth(), this is the request we should | 2067 // After calling trans->RestartWithAuth(), this is the request we should |
2074 // be issuing -- the final header line contains the credentials. | 2068 // be issuing -- the final header line contains the credentials. |
2075 MockWrite("GET / HTTP/1.1\r\n" | 2069 MockWrite( |
2076 "Host: www.google.com\r\n" | 2070 "GET / HTTP/1.1\r\n" |
2077 "Connection: keep-alive\r\n" | 2071 "Host: www.google.com\r\n" |
2078 "Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 2072 "Connection: keep-alive\r\n" |
| 2073 "Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
2079 }; | 2074 }; |
2080 | 2075 |
2081 MockRead data_reads1[] = { | 2076 MockRead data_reads1[] = { |
2082 MockRead("HTTP/1.1 401 Unauthorized\r\n"), | 2077 MockRead("HTTP/1.1 401 Unauthorized\r\n"), |
2083 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | 2078 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
2084 MockRead("Content-Length: 0\r\n\r\n"), // No response body. | 2079 MockRead("Content-Length: 0\r\n\r\n"), // No response body. |
2085 | 2080 |
2086 // Lastly, the server responds with the actual content. | 2081 // Lastly, the server responds with the actual content. |
2087 MockRead("HTTP/1.1 200 OK\r\n"), | 2082 MockRead("HTTP/1.1 200 OK\r\n"), |
2088 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 2083 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
2089 MockRead("Content-Length: 5\r\n\r\n"), | 2084 MockRead("Content-Length: 5\r\n\r\n"), |
2090 MockRead("hello"), | 2085 MockRead("hello"), |
2091 }; | 2086 }; |
2092 | 2087 |
2093 // An incorrect reconnect would cause this to be read. | 2088 // An incorrect reconnect would cause this to be read. |
2094 MockRead data_reads2[] = { | 2089 MockRead data_reads2[] = { |
2095 MockRead(SYNCHRONOUS, ERR_FAILED), | 2090 MockRead(SYNCHRONOUS, ERR_FAILED), |
2096 }; | 2091 }; |
2097 | 2092 |
2098 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 2093 StaticSocketDataProvider data1(data_reads1, |
2099 data_writes1, arraysize(data_writes1)); | 2094 arraysize(data_reads1), |
2100 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), | 2095 data_writes1, |
2101 NULL, 0); | 2096 arraysize(data_writes1)); |
| 2097 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), NULL, 0); |
2102 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 2098 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
2103 session_deps_.socket_factory->AddSocketDataProvider(&data2); | 2099 session_deps_.socket_factory->AddSocketDataProvider(&data2); |
2104 | 2100 |
2105 TestCompletionCallback callback1; | 2101 TestCompletionCallback callback1; |
2106 | 2102 |
2107 scoped_ptr<HttpTransaction> trans( | 2103 scoped_ptr<HttpTransaction> trans( |
2108 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 2104 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
2109 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); | 2105 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); |
2110 EXPECT_EQ(ERR_IO_PENDING, rv); | 2106 EXPECT_EQ(ERR_IO_PENDING, rv); |
2111 | 2107 |
2112 rv = callback1.WaitForResult(); | 2108 rv = callback1.WaitForResult(); |
2113 EXPECT_EQ(OK, rv); | 2109 EXPECT_EQ(OK, rv); |
2114 | 2110 |
2115 const HttpResponseInfo* response = trans->GetResponseInfo(); | 2111 const HttpResponseInfo* response = trans->GetResponseInfo(); |
2116 ASSERT_TRUE(response != NULL); | 2112 ASSERT_TRUE(response != NULL); |
2117 EXPECT_TRUE(CheckBasicServerAuth(response->auth_challenge.get())); | 2113 EXPECT_TRUE(CheckBasicServerAuth(response->auth_challenge.get())); |
2118 | 2114 |
2119 TestCompletionCallback callback2; | 2115 TestCompletionCallback callback2; |
2120 | 2116 |
2121 rv = trans->RestartWithAuth( | 2117 rv = |
2122 AuthCredentials(kFoo, kBar), callback2.callback()); | 2118 trans->RestartWithAuth(AuthCredentials(kFoo, kBar), callback2.callback()); |
2123 EXPECT_EQ(ERR_IO_PENDING, rv); | 2119 EXPECT_EQ(ERR_IO_PENDING, rv); |
2124 | 2120 |
2125 rv = callback2.WaitForResult(); | 2121 rv = callback2.WaitForResult(); |
2126 EXPECT_EQ(OK, rv); | 2122 EXPECT_EQ(OK, rv); |
2127 | 2123 |
2128 response = trans->GetResponseInfo(); | 2124 response = trans->GetResponseInfo(); |
2129 ASSERT_TRUE(response != NULL); | 2125 ASSERT_TRUE(response != NULL); |
2130 EXPECT_TRUE(response->auth_challenge.get() == NULL); | 2126 EXPECT_TRUE(response->auth_challenge.get() == NULL); |
2131 EXPECT_EQ(5, response->headers->GetContentLength()); | 2127 EXPECT_EQ(5, response->headers->GetContentLength()); |
2132 } | 2128 } |
2133 | 2129 |
2134 // Test the request-challenge-retry sequence for basic auth, over a keep-alive | 2130 // Test the request-challenge-retry sequence for basic auth, over a keep-alive |
2135 // connection and with a large response body to drain. | 2131 // connection and with a large response body to drain. |
2136 TEST_P(HttpNetworkTransactionTest, BasicAuthKeepAliveLargeBody) { | 2132 TEST_P(HttpNetworkTransactionTest, BasicAuthKeepAliveLargeBody) { |
2137 HttpRequestInfo request; | 2133 HttpRequestInfo request; |
2138 request.method = "GET"; | 2134 request.method = "GET"; |
2139 request.url = GURL("http://www.google.com/"); | 2135 request.url = GURL("http://www.google.com/"); |
2140 request.load_flags = 0; | 2136 request.load_flags = 0; |
2141 | 2137 |
2142 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 2138 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
2143 | 2139 |
2144 MockWrite data_writes1[] = { | 2140 MockWrite data_writes1[] = { |
2145 MockWrite("GET / HTTP/1.1\r\n" | 2141 MockWrite( |
2146 "Host: www.google.com\r\n" | 2142 "GET / HTTP/1.1\r\n" |
2147 "Connection: keep-alive\r\n\r\n"), | 2143 "Host: www.google.com\r\n" |
| 2144 "Connection: keep-alive\r\n\r\n"), |
2148 | 2145 |
2149 // After calling trans->RestartWithAuth(), this is the request we should | 2146 // After calling trans->RestartWithAuth(), this is the request we should |
2150 // be issuing -- the final header line contains the credentials. | 2147 // be issuing -- the final header line contains the credentials. |
2151 MockWrite("GET / HTTP/1.1\r\n" | 2148 MockWrite( |
2152 "Host: www.google.com\r\n" | 2149 "GET / HTTP/1.1\r\n" |
2153 "Connection: keep-alive\r\n" | 2150 "Host: www.google.com\r\n" |
2154 "Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 2151 "Connection: keep-alive\r\n" |
| 2152 "Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
2155 }; | 2153 }; |
2156 | 2154 |
2157 // Respond with 5 kb of response body. | 2155 // Respond with 5 kb of response body. |
2158 std::string large_body_string("Unauthorized"); | 2156 std::string large_body_string("Unauthorized"); |
2159 large_body_string.append(5 * 1024, ' '); | 2157 large_body_string.append(5 * 1024, ' '); |
2160 large_body_string.append("\r\n"); | 2158 large_body_string.append("\r\n"); |
2161 | 2159 |
2162 MockRead data_reads1[] = { | 2160 MockRead data_reads1[] = { |
2163 MockRead("HTTP/1.1 401 Unauthorized\r\n"), | 2161 MockRead("HTTP/1.1 401 Unauthorized\r\n"), |
2164 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | 2162 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
2165 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 2163 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
2166 // 5134 = 12 + 5 * 1024 + 2 | 2164 // 5134 = 12 + 5 * 1024 + 2 |
2167 MockRead("Content-Length: 5134\r\n\r\n"), | 2165 MockRead("Content-Length: 5134\r\n\r\n"), |
2168 MockRead(ASYNC, large_body_string.data(), large_body_string.size()), | 2166 MockRead(ASYNC, large_body_string.data(), large_body_string.size()), |
2169 | 2167 |
2170 // Lastly, the server responds with the actual content. | 2168 // Lastly, the server responds with the actual content. |
2171 MockRead("HTTP/1.1 200 OK\r\n"), | 2169 MockRead("HTTP/1.1 200 OK\r\n"), |
2172 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 2170 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
2173 MockRead("Content-Length: 5\r\n\r\n"), | 2171 MockRead("Content-Length: 5\r\n\r\n"), |
2174 MockRead("hello"), | 2172 MockRead("hello"), |
2175 }; | 2173 }; |
2176 | 2174 |
2177 // An incorrect reconnect would cause this to be read. | 2175 // An incorrect reconnect would cause this to be read. |
2178 MockRead data_reads2[] = { | 2176 MockRead data_reads2[] = { |
2179 MockRead(SYNCHRONOUS, ERR_FAILED), | 2177 MockRead(SYNCHRONOUS, ERR_FAILED), |
2180 }; | 2178 }; |
2181 | 2179 |
2182 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 2180 StaticSocketDataProvider data1(data_reads1, |
2183 data_writes1, arraysize(data_writes1)); | 2181 arraysize(data_reads1), |
2184 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), | 2182 data_writes1, |
2185 NULL, 0); | 2183 arraysize(data_writes1)); |
| 2184 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), NULL, 0); |
2186 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 2185 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
2187 session_deps_.socket_factory->AddSocketDataProvider(&data2); | 2186 session_deps_.socket_factory->AddSocketDataProvider(&data2); |
2188 | 2187 |
2189 TestCompletionCallback callback1; | 2188 TestCompletionCallback callback1; |
2190 | 2189 |
2191 scoped_ptr<HttpTransaction> trans( | 2190 scoped_ptr<HttpTransaction> trans( |
2192 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 2191 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
2193 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); | 2192 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); |
2194 EXPECT_EQ(ERR_IO_PENDING, rv); | 2193 EXPECT_EQ(ERR_IO_PENDING, rv); |
2195 | 2194 |
2196 rv = callback1.WaitForResult(); | 2195 rv = callback1.WaitForResult(); |
2197 EXPECT_EQ(OK, rv); | 2196 EXPECT_EQ(OK, rv); |
2198 | 2197 |
2199 const HttpResponseInfo* response = trans->GetResponseInfo(); | 2198 const HttpResponseInfo* response = trans->GetResponseInfo(); |
2200 ASSERT_TRUE(response != NULL); | 2199 ASSERT_TRUE(response != NULL); |
2201 EXPECT_TRUE(CheckBasicServerAuth(response->auth_challenge.get())); | 2200 EXPECT_TRUE(CheckBasicServerAuth(response->auth_challenge.get())); |
2202 | 2201 |
2203 TestCompletionCallback callback2; | 2202 TestCompletionCallback callback2; |
2204 | 2203 |
2205 rv = trans->RestartWithAuth( | 2204 rv = |
2206 AuthCredentials(kFoo, kBar), callback2.callback()); | 2205 trans->RestartWithAuth(AuthCredentials(kFoo, kBar), callback2.callback()); |
2207 EXPECT_EQ(ERR_IO_PENDING, rv); | 2206 EXPECT_EQ(ERR_IO_PENDING, rv); |
2208 | 2207 |
2209 rv = callback2.WaitForResult(); | 2208 rv = callback2.WaitForResult(); |
2210 EXPECT_EQ(OK, rv); | 2209 EXPECT_EQ(OK, rv); |
2211 | 2210 |
2212 response = trans->GetResponseInfo(); | 2211 response = trans->GetResponseInfo(); |
2213 ASSERT_TRUE(response != NULL); | 2212 ASSERT_TRUE(response != NULL); |
2214 EXPECT_TRUE(response->auth_challenge.get() == NULL); | 2213 EXPECT_TRUE(response->auth_challenge.get() == NULL); |
2215 EXPECT_EQ(5, response->headers->GetContentLength()); | 2214 EXPECT_EQ(5, response->headers->GetContentLength()); |
2216 } | 2215 } |
2217 | 2216 |
2218 // Test the request-challenge-retry sequence for basic auth, over a keep-alive | 2217 // Test the request-challenge-retry sequence for basic auth, over a keep-alive |
2219 // connection, but the server gets impatient and closes the connection. | 2218 // connection, but the server gets impatient and closes the connection. |
2220 TEST_P(HttpNetworkTransactionTest, BasicAuthKeepAliveImpatientServer) { | 2219 TEST_P(HttpNetworkTransactionTest, BasicAuthKeepAliveImpatientServer) { |
2221 HttpRequestInfo request; | 2220 HttpRequestInfo request; |
2222 request.method = "GET"; | 2221 request.method = "GET"; |
2223 request.url = GURL("http://www.google.com/"); | 2222 request.url = GURL("http://www.google.com/"); |
2224 request.load_flags = 0; | 2223 request.load_flags = 0; |
2225 | 2224 |
2226 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 2225 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
2227 | 2226 |
2228 MockWrite data_writes1[] = { | 2227 MockWrite data_writes1[] = { |
2229 MockWrite("GET / HTTP/1.1\r\n" | 2228 MockWrite( |
2230 "Host: www.google.com\r\n" | 2229 "GET / HTTP/1.1\r\n" |
2231 "Connection: keep-alive\r\n\r\n"), | 2230 "Host: www.google.com\r\n" |
2232 // This simulates the seemingly successful write to a closed connection | 2231 "Connection: keep-alive\r\n\r\n"), |
2233 // if the bug is not fixed. | 2232 // This simulates the seemingly successful write to a closed connection |
2234 MockWrite("GET / HTTP/1.1\r\n" | 2233 // if the bug is not fixed. |
2235 "Host: www.google.com\r\n" | 2234 MockWrite( |
2236 "Connection: keep-alive\r\n" | 2235 "GET / HTTP/1.1\r\n" |
2237 "Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 2236 "Host: www.google.com\r\n" |
| 2237 "Connection: keep-alive\r\n" |
| 2238 "Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
2238 }; | 2239 }; |
2239 | 2240 |
2240 MockRead data_reads1[] = { | 2241 MockRead data_reads1[] = { |
2241 MockRead("HTTP/1.1 401 Unauthorized\r\n"), | 2242 MockRead("HTTP/1.1 401 Unauthorized\r\n"), |
2242 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | 2243 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
2243 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 2244 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
2244 MockRead("Content-Length: 14\r\n\r\n"), | 2245 MockRead("Content-Length: 14\r\n\r\n"), |
2245 // Tell MockTCPClientSocket to simulate the server closing the connection. | 2246 // Tell MockTCPClientSocket to simulate the server closing the connection. |
2246 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 2247 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
2247 MockRead("Unauthorized\r\n"), | 2248 MockRead("Unauthorized\r\n"), |
2248 MockRead(SYNCHRONOUS, OK), // The server closes the connection. | 2249 MockRead(SYNCHRONOUS, OK), // The server closes the connection. |
2249 }; | 2250 }; |
2250 | 2251 |
2251 // After calling trans->RestartWithAuth(), this is the request we should | 2252 // After calling trans->RestartWithAuth(), this is the request we should |
2252 // be issuing -- the final header line contains the credentials. | 2253 // be issuing -- the final header line contains the credentials. |
2253 MockWrite data_writes2[] = { | 2254 MockWrite data_writes2[] = { |
2254 MockWrite("GET / HTTP/1.1\r\n" | 2255 MockWrite( |
2255 "Host: www.google.com\r\n" | 2256 "GET / HTTP/1.1\r\n" |
2256 "Connection: keep-alive\r\n" | 2257 "Host: www.google.com\r\n" |
2257 "Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 2258 "Connection: keep-alive\r\n" |
| 2259 "Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
2258 }; | 2260 }; |
2259 | 2261 |
2260 // Lastly, the server responds with the actual content. | 2262 // Lastly, the server responds with the actual content. |
2261 MockRead data_reads2[] = { | 2263 MockRead data_reads2[] = { |
2262 MockRead("HTTP/1.1 200 OK\r\n"), | 2264 MockRead("HTTP/1.1 200 OK\r\n"), |
2263 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 2265 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
2264 MockRead("Content-Length: 5\r\n\r\n"), | 2266 MockRead("Content-Length: 5\r\n\r\n"), MockRead("hello"), |
2265 MockRead("hello"), | |
2266 }; | 2267 }; |
2267 | 2268 |
2268 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 2269 StaticSocketDataProvider data1(data_reads1, |
2269 data_writes1, arraysize(data_writes1)); | 2270 arraysize(data_reads1), |
2270 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), | 2271 data_writes1, |
2271 data_writes2, arraysize(data_writes2)); | 2272 arraysize(data_writes1)); |
| 2273 StaticSocketDataProvider data2(data_reads2, |
| 2274 arraysize(data_reads2), |
| 2275 data_writes2, |
| 2276 arraysize(data_writes2)); |
2272 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 2277 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
2273 session_deps_.socket_factory->AddSocketDataProvider(&data2); | 2278 session_deps_.socket_factory->AddSocketDataProvider(&data2); |
2274 | 2279 |
2275 TestCompletionCallback callback1; | 2280 TestCompletionCallback callback1; |
2276 | 2281 |
2277 scoped_ptr<HttpTransaction> trans( | 2282 scoped_ptr<HttpTransaction> trans( |
2278 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 2283 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
2279 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); | 2284 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); |
2280 EXPECT_EQ(ERR_IO_PENDING, rv); | 2285 EXPECT_EQ(ERR_IO_PENDING, rv); |
2281 | 2286 |
2282 rv = callback1.WaitForResult(); | 2287 rv = callback1.WaitForResult(); |
2283 EXPECT_EQ(OK, rv); | 2288 EXPECT_EQ(OK, rv); |
2284 | 2289 |
2285 const HttpResponseInfo* response = trans->GetResponseInfo(); | 2290 const HttpResponseInfo* response = trans->GetResponseInfo(); |
2286 ASSERT_TRUE(response != NULL); | 2291 ASSERT_TRUE(response != NULL); |
2287 EXPECT_TRUE(CheckBasicServerAuth(response->auth_challenge.get())); | 2292 EXPECT_TRUE(CheckBasicServerAuth(response->auth_challenge.get())); |
2288 | 2293 |
2289 TestCompletionCallback callback2; | 2294 TestCompletionCallback callback2; |
2290 | 2295 |
2291 rv = trans->RestartWithAuth( | 2296 rv = |
2292 AuthCredentials(kFoo, kBar), callback2.callback()); | 2297 trans->RestartWithAuth(AuthCredentials(kFoo, kBar), callback2.callback()); |
2293 EXPECT_EQ(ERR_IO_PENDING, rv); | 2298 EXPECT_EQ(ERR_IO_PENDING, rv); |
2294 | 2299 |
2295 rv = callback2.WaitForResult(); | 2300 rv = callback2.WaitForResult(); |
2296 EXPECT_EQ(OK, rv); | 2301 EXPECT_EQ(OK, rv); |
2297 | 2302 |
2298 response = trans->GetResponseInfo(); | 2303 response = trans->GetResponseInfo(); |
2299 ASSERT_TRUE(response != NULL); | 2304 ASSERT_TRUE(response != NULL); |
2300 EXPECT_TRUE(response->auth_challenge.get() == NULL); | 2305 EXPECT_TRUE(response->auth_challenge.get() == NULL); |
2301 EXPECT_EQ(5, response->headers->GetContentLength()); | 2306 EXPECT_EQ(5, response->headers->GetContentLength()); |
2302 } | 2307 } |
2303 | 2308 |
2304 // Test the request-challenge-retry sequence for basic auth, over a connection | 2309 // Test the request-challenge-retry sequence for basic auth, over a connection |
2305 // that requires a restart when setting up an SSL tunnel. | 2310 // that requires a restart when setting up an SSL tunnel. |
2306 TEST_P(HttpNetworkTransactionTest, BasicAuthProxyNoKeepAlive) { | 2311 TEST_P(HttpNetworkTransactionTest, BasicAuthProxyNoKeepAlive) { |
2307 HttpRequestInfo request; | 2312 HttpRequestInfo request; |
2308 request.method = "GET"; | 2313 request.method = "GET"; |
2309 request.url = GURL("https://www.google.com/"); | 2314 request.url = GURL("https://www.google.com/"); |
2310 // when the no authentication data flag is set. | 2315 // when the no authentication data flag is set. |
2311 request.load_flags = net::LOAD_DO_NOT_SEND_AUTH_DATA; | 2316 request.load_flags = net::LOAD_DO_NOT_SEND_AUTH_DATA; |
2312 | 2317 |
2313 // Configure against proxy server "myproxy:70". | 2318 // Configure against proxy server "myproxy:70". |
2314 session_deps_.proxy_service.reset( | 2319 session_deps_.proxy_service.reset( |
2315 ProxyService::CreateFixedFromPacResult("PROXY myproxy:70")); | 2320 ProxyService::CreateFixedFromPacResult("PROXY myproxy:70")); |
2316 CapturingBoundNetLog log; | 2321 CapturingBoundNetLog log; |
2317 session_deps_.net_log = log.bound().net_log(); | 2322 session_deps_.net_log = log.bound().net_log(); |
2318 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 2323 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
2319 | 2324 |
2320 // Since we have proxy, should try to establish tunnel. | 2325 // Since we have proxy, should try to establish tunnel. |
2321 MockWrite data_writes1[] = { | 2326 MockWrite data_writes1[] = { |
2322 MockWrite("CONNECT www.google.com:443 HTTP/1.1\r\n" | 2327 MockWrite( |
2323 "Host: www.google.com\r\n" | 2328 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
2324 "Proxy-Connection: keep-alive\r\n\r\n"), | 2329 "Host: www.google.com\r\n" |
| 2330 "Proxy-Connection: keep-alive\r\n\r\n"), |
2325 | 2331 |
2326 // After calling trans->RestartWithAuth(), this is the request we should | 2332 // After calling trans->RestartWithAuth(), this is the request we should |
2327 // be issuing -- the final header line contains the credentials. | 2333 // be issuing -- the final header line contains the credentials. |
2328 MockWrite("CONNECT www.google.com:443 HTTP/1.1\r\n" | 2334 MockWrite( |
2329 "Host: www.google.com\r\n" | 2335 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
2330 "Proxy-Connection: keep-alive\r\n" | 2336 "Host: www.google.com\r\n" |
2331 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 2337 "Proxy-Connection: keep-alive\r\n" |
2332 | 2338 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
2333 MockWrite("GET / HTTP/1.1\r\n" | 2339 MockWrite( |
2334 "Host: www.google.com\r\n" | 2340 "GET / HTTP/1.1\r\n" |
2335 "Connection: keep-alive\r\n\r\n"), | 2341 "Host: www.google.com\r\n" |
| 2342 "Connection: keep-alive\r\n\r\n"), |
2336 }; | 2343 }; |
2337 | 2344 |
2338 // The proxy responds to the connect with a 407, using a persistent | 2345 // The proxy responds to the connect with a 407, using a persistent |
2339 // connection. | 2346 // connection. |
2340 MockRead data_reads1[] = { | 2347 MockRead data_reads1[] = { |
2341 // No credentials. | 2348 // No credentials. |
2342 MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"), | 2349 MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"), |
2343 MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | 2350 MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
2344 MockRead("Proxy-Connection: close\r\n\r\n"), | 2351 MockRead("Proxy-Connection: close\r\n\r\n"), |
2345 | 2352 MockRead("HTTP/1.1 200 Connection Established\r\n\r\n"), |
2346 MockRead("HTTP/1.1 200 Connection Established\r\n\r\n"), | 2353 MockRead("HTTP/1.1 200 OK\r\n"), |
2347 | 2354 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
2348 MockRead("HTTP/1.1 200 OK\r\n"), | 2355 MockRead("Content-Length: 5\r\n\r\n"), |
2349 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 2356 MockRead(SYNCHRONOUS, "hello"), |
2350 MockRead("Content-Length: 5\r\n\r\n"), | |
2351 MockRead(SYNCHRONOUS, "hello"), | |
2352 }; | 2357 }; |
2353 | 2358 |
2354 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 2359 StaticSocketDataProvider data1(data_reads1, |
2355 data_writes1, arraysize(data_writes1)); | 2360 arraysize(data_reads1), |
| 2361 data_writes1, |
| 2362 arraysize(data_writes1)); |
2356 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 2363 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
2357 SSLSocketDataProvider ssl(ASYNC, OK); | 2364 SSLSocketDataProvider ssl(ASYNC, OK); |
2358 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 2365 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
2359 | 2366 |
2360 TestCompletionCallback callback1; | 2367 TestCompletionCallback callback1; |
2361 | 2368 |
2362 scoped_ptr<HttpTransaction> trans( | 2369 scoped_ptr<HttpTransaction> trans( |
2363 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 2370 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
2364 | 2371 |
2365 int rv = trans->Start(&request, callback1.callback(), log.bound()); | 2372 int rv = trans->Start(&request, callback1.callback(), log.bound()); |
2366 EXPECT_EQ(ERR_IO_PENDING, rv); | 2373 EXPECT_EQ(ERR_IO_PENDING, rv); |
2367 | 2374 |
2368 rv = callback1.WaitForResult(); | 2375 rv = callback1.WaitForResult(); |
2369 EXPECT_EQ(OK, rv); | 2376 EXPECT_EQ(OK, rv); |
2370 net::CapturingNetLog::CapturedEntryList entries; | 2377 net::CapturingNetLog::CapturedEntryList entries; |
2371 log.GetEntries(&entries); | 2378 log.GetEntries(&entries); |
2372 size_t pos = ExpectLogContainsSomewhere( | 2379 size_t pos = ExpectLogContainsSomewhere( |
2373 entries, 0, NetLog::TYPE_HTTP_TRANSACTION_SEND_TUNNEL_HEADERS, | 2380 entries, |
| 2381 0, |
| 2382 NetLog::TYPE_HTTP_TRANSACTION_SEND_TUNNEL_HEADERS, |
2374 NetLog::PHASE_NONE); | 2383 NetLog::PHASE_NONE); |
2375 ExpectLogContainsSomewhere( | 2384 ExpectLogContainsSomewhere( |
2376 entries, pos, | 2385 entries, |
| 2386 pos, |
2377 NetLog::TYPE_HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS, | 2387 NetLog::TYPE_HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS, |
2378 NetLog::PHASE_NONE); | 2388 NetLog::PHASE_NONE); |
2379 | 2389 |
2380 const HttpResponseInfo* response = trans->GetResponseInfo(); | 2390 const HttpResponseInfo* response = trans->GetResponseInfo(); |
2381 ASSERT_TRUE(response != NULL); | 2391 ASSERT_TRUE(response != NULL); |
2382 ASSERT_FALSE(response->headers.get() == NULL); | 2392 ASSERT_FALSE(response->headers.get() == NULL); |
2383 EXPECT_EQ(407, response->headers->response_code()); | 2393 EXPECT_EQ(407, response->headers->response_code()); |
2384 EXPECT_TRUE(HttpVersion(1, 1) == response->headers->GetHttpVersion()); | 2394 EXPECT_TRUE(HttpVersion(1, 1) == response->headers->GetHttpVersion()); |
2385 EXPECT_TRUE(CheckBasicProxyAuth(response->auth_challenge.get())); | 2395 EXPECT_TRUE(CheckBasicProxyAuth(response->auth_challenge.get())); |
2386 | 2396 |
2387 LoadTimingInfo load_timing_info; | 2397 LoadTimingInfo load_timing_info; |
2388 // CONNECT requests and responses are handled at the connect job level, so | 2398 // CONNECT requests and responses are handled at the connect job level, so |
2389 // the transaction does not yet have a connection. | 2399 // the transaction does not yet have a connection. |
2390 EXPECT_FALSE(trans->GetLoadTimingInfo(&load_timing_info)); | 2400 EXPECT_FALSE(trans->GetLoadTimingInfo(&load_timing_info)); |
2391 | 2401 |
2392 TestCompletionCallback callback2; | 2402 TestCompletionCallback callback2; |
2393 | 2403 |
2394 rv = trans->RestartWithAuth( | 2404 rv = |
2395 AuthCredentials(kFoo, kBar), callback2.callback()); | 2405 trans->RestartWithAuth(AuthCredentials(kFoo, kBar), callback2.callback()); |
2396 EXPECT_EQ(ERR_IO_PENDING, rv); | 2406 EXPECT_EQ(ERR_IO_PENDING, rv); |
2397 | 2407 |
2398 rv = callback2.WaitForResult(); | 2408 rv = callback2.WaitForResult(); |
2399 EXPECT_EQ(OK, rv); | 2409 EXPECT_EQ(OK, rv); |
2400 | 2410 |
2401 response = trans->GetResponseInfo(); | 2411 response = trans->GetResponseInfo(); |
2402 ASSERT_TRUE(response != NULL); | 2412 ASSERT_TRUE(response != NULL); |
2403 | 2413 |
2404 EXPECT_TRUE(response->headers->IsKeepAlive()); | 2414 EXPECT_TRUE(response->headers->IsKeepAlive()); |
2405 EXPECT_EQ(200, response->headers->response_code()); | 2415 EXPECT_EQ(200, response->headers->response_code()); |
(...skipping 25 matching lines...) Expand all Loading... |
2431 session_deps_.proxy_service.reset(ProxyService::CreateFixed("myproxy:70")); | 2441 session_deps_.proxy_service.reset(ProxyService::CreateFixed("myproxy:70")); |
2432 CapturingBoundNetLog log; | 2442 CapturingBoundNetLog log; |
2433 session_deps_.net_log = log.bound().net_log(); | 2443 session_deps_.net_log = log.bound().net_log(); |
2434 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 2444 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
2435 | 2445 |
2436 scoped_ptr<HttpTransaction> trans( | 2446 scoped_ptr<HttpTransaction> trans( |
2437 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 2447 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
2438 | 2448 |
2439 // Since we have proxy, should try to establish tunnel. | 2449 // Since we have proxy, should try to establish tunnel. |
2440 MockWrite data_writes1[] = { | 2450 MockWrite data_writes1[] = { |
2441 MockWrite("CONNECT www.google.com:443 HTTP/1.1\r\n" | 2451 MockWrite( |
2442 "Host: www.google.com\r\n" | 2452 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
2443 "Proxy-Connection: keep-alive\r\n\r\n"), | 2453 "Host: www.google.com\r\n" |
| 2454 "Proxy-Connection: keep-alive\r\n\r\n"), |
2444 | 2455 |
2445 // After calling trans->RestartWithAuth(), this is the request we should | 2456 // After calling trans->RestartWithAuth(), this is the request we should |
2446 // be issuing -- the final header line contains the credentials. | 2457 // be issuing -- the final header line contains the credentials. |
2447 MockWrite("CONNECT www.google.com:443 HTTP/1.1\r\n" | 2458 MockWrite( |
2448 "Host: www.google.com\r\n" | 2459 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
2449 "Proxy-Connection: keep-alive\r\n" | 2460 "Host: www.google.com\r\n" |
2450 "Proxy-Authorization: Basic Zm9vOmJheg==\r\n\r\n"), | 2461 "Proxy-Connection: keep-alive\r\n" |
| 2462 "Proxy-Authorization: Basic Zm9vOmJheg==\r\n\r\n"), |
2451 }; | 2463 }; |
2452 | 2464 |
2453 // The proxy responds to the connect with a 407, using a persistent | 2465 // The proxy responds to the connect with a 407, using a persistent |
2454 // connection. | 2466 // connection. |
2455 MockRead data_reads1[] = { | 2467 MockRead data_reads1[] = { |
2456 // No credentials. | 2468 // No credentials. |
2457 MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"), | 2469 MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"), |
2458 MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | 2470 MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
2459 MockRead("Content-Length: 10\r\n\r\n"), | 2471 MockRead("Content-Length: 10\r\n\r\n"), |
2460 MockRead("0123456789"), | 2472 MockRead("0123456789"), |
2461 | 2473 |
2462 // Wrong credentials (wrong password). | 2474 // Wrong credentials (wrong password). |
2463 MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"), | 2475 MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"), |
2464 MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | 2476 MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
2465 MockRead("Content-Length: 10\r\n\r\n"), | 2477 MockRead("Content-Length: 10\r\n\r\n"), |
2466 // No response body because the test stops reading here. | 2478 // No response body because the test stops reading here. |
2467 MockRead(SYNCHRONOUS, ERR_UNEXPECTED), // Should not be reached. | 2479 MockRead(SYNCHRONOUS, ERR_UNEXPECTED), // Should not be reached. |
2468 }; | 2480 }; |
2469 | 2481 |
2470 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 2482 StaticSocketDataProvider data1(data_reads1, |
2471 data_writes1, arraysize(data_writes1)); | 2483 arraysize(data_reads1), |
| 2484 data_writes1, |
| 2485 arraysize(data_writes1)); |
2472 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 2486 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
2473 | 2487 |
2474 TestCompletionCallback callback1; | 2488 TestCompletionCallback callback1; |
2475 | 2489 |
2476 int rv = trans->Start(&request, callback1.callback(), log.bound()); | 2490 int rv = trans->Start(&request, callback1.callback(), log.bound()); |
2477 EXPECT_EQ(ERR_IO_PENDING, rv); | 2491 EXPECT_EQ(ERR_IO_PENDING, rv); |
2478 | 2492 |
2479 rv = callback1.WaitForResult(); | 2493 rv = callback1.WaitForResult(); |
2480 EXPECT_EQ(OK, rv); | 2494 EXPECT_EQ(OK, rv); |
2481 net::CapturingNetLog::CapturedEntryList entries; | 2495 net::CapturingNetLog::CapturedEntryList entries; |
2482 log.GetEntries(&entries); | 2496 log.GetEntries(&entries); |
2483 size_t pos = ExpectLogContainsSomewhere( | 2497 size_t pos = ExpectLogContainsSomewhere( |
2484 entries, 0, NetLog::TYPE_HTTP_TRANSACTION_SEND_TUNNEL_HEADERS, | 2498 entries, |
| 2499 0, |
| 2500 NetLog::TYPE_HTTP_TRANSACTION_SEND_TUNNEL_HEADERS, |
2485 NetLog::PHASE_NONE); | 2501 NetLog::PHASE_NONE); |
2486 ExpectLogContainsSomewhere( | 2502 ExpectLogContainsSomewhere( |
2487 entries, pos, | 2503 entries, |
| 2504 pos, |
2488 NetLog::TYPE_HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS, | 2505 NetLog::TYPE_HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS, |
2489 NetLog::PHASE_NONE); | 2506 NetLog::PHASE_NONE); |
2490 | 2507 |
2491 const HttpResponseInfo* response = trans->GetResponseInfo(); | 2508 const HttpResponseInfo* response = trans->GetResponseInfo(); |
2492 ASSERT_TRUE(response != NULL); | 2509 ASSERT_TRUE(response != NULL); |
2493 ASSERT_FALSE(response->headers.get() == NULL); | 2510 ASSERT_FALSE(response->headers.get() == NULL); |
2494 EXPECT_TRUE(response->headers->IsKeepAlive()); | 2511 EXPECT_TRUE(response->headers->IsKeepAlive()); |
2495 EXPECT_EQ(407, response->headers->response_code()); | 2512 EXPECT_EQ(407, response->headers->response_code()); |
2496 EXPECT_EQ(10, response->headers->GetContentLength()); | 2513 EXPECT_EQ(10, response->headers->GetContentLength()); |
2497 EXPECT_TRUE(HttpVersion(1, 1) == response->headers->GetHttpVersion()); | 2514 EXPECT_TRUE(HttpVersion(1, 1) == response->headers->GetHttpVersion()); |
2498 EXPECT_TRUE(CheckBasicProxyAuth(response->auth_challenge.get())); | 2515 EXPECT_TRUE(CheckBasicProxyAuth(response->auth_challenge.get())); |
2499 | 2516 |
2500 TestCompletionCallback callback2; | 2517 TestCompletionCallback callback2; |
2501 | 2518 |
2502 // Wrong password (should be "bar"). | 2519 // Wrong password (should be "bar"). |
2503 rv = trans->RestartWithAuth( | 2520 rv = |
2504 AuthCredentials(kFoo, kBaz), callback2.callback()); | 2521 trans->RestartWithAuth(AuthCredentials(kFoo, kBaz), callback2.callback()); |
2505 EXPECT_EQ(ERR_IO_PENDING, rv); | 2522 EXPECT_EQ(ERR_IO_PENDING, rv); |
2506 | 2523 |
2507 rv = callback2.WaitForResult(); | 2524 rv = callback2.WaitForResult(); |
2508 EXPECT_EQ(OK, rv); | 2525 EXPECT_EQ(OK, rv); |
2509 | 2526 |
2510 response = trans->GetResponseInfo(); | 2527 response = trans->GetResponseInfo(); |
2511 ASSERT_TRUE(response != NULL); | 2528 ASSERT_TRUE(response != NULL); |
2512 ASSERT_FALSE(response->headers.get() == NULL); | 2529 ASSERT_FALSE(response->headers.get() == NULL); |
2513 EXPECT_TRUE(response->headers->IsKeepAlive()); | 2530 EXPECT_TRUE(response->headers->IsKeepAlive()); |
2514 EXPECT_EQ(407, response->headers->response_code()); | 2531 EXPECT_EQ(407, response->headers->response_code()); |
(...skipping 17 matching lines...) Expand all Loading... |
2532 // Configure against proxy server "myproxy:70". | 2549 // Configure against proxy server "myproxy:70". |
2533 session_deps_.proxy_service.reset(ProxyService::CreateFixed("myproxy:70")); | 2550 session_deps_.proxy_service.reset(ProxyService::CreateFixed("myproxy:70")); |
2534 | 2551 |
2535 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 2552 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
2536 | 2553 |
2537 scoped_ptr<HttpTransaction> trans( | 2554 scoped_ptr<HttpTransaction> trans( |
2538 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 2555 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
2539 | 2556 |
2540 // Since we have proxy, should try to establish tunnel. | 2557 // Since we have proxy, should try to establish tunnel. |
2541 MockWrite data_writes[] = { | 2558 MockWrite data_writes[] = { |
2542 MockWrite("CONNECT www.google.com:443 HTTP/1.1\r\n" | 2559 MockWrite( |
2543 "Host: www.google.com\r\n" | 2560 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
2544 "Proxy-Connection: keep-alive\r\n\r\n"), | 2561 "Host: www.google.com\r\n" |
| 2562 "Proxy-Connection: keep-alive\r\n\r\n"), |
2545 }; | 2563 }; |
2546 | 2564 |
2547 // The proxy responds to the connect with a 407. | 2565 // The proxy responds to the connect with a 407. |
2548 MockRead data_reads[] = { | 2566 MockRead data_reads[] = { |
2549 MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"), | 2567 MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"), |
2550 MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | 2568 MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
2551 MockRead("Content-Length: 10\r\n\r\n"), | 2569 MockRead("Content-Length: 10\r\n\r\n"), |
2552 MockRead(SYNCHRONOUS, ERR_UNEXPECTED), // Should not be reached. | 2570 MockRead(SYNCHRONOUS, ERR_UNEXPECTED), // Should not be reached. |
2553 }; | 2571 }; |
2554 | 2572 |
2555 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 2573 StaticSocketDataProvider data( |
2556 data_writes, arraysize(data_writes)); | 2574 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
2557 session_deps_.socket_factory->AddSocketDataProvider(&data); | 2575 session_deps_.socket_factory->AddSocketDataProvider(&data); |
2558 | 2576 |
2559 TestCompletionCallback callback; | 2577 TestCompletionCallback callback; |
2560 | 2578 |
2561 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 2579 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
2562 EXPECT_EQ(ERR_IO_PENDING, rv); | 2580 EXPECT_EQ(ERR_IO_PENDING, rv); |
2563 | 2581 |
2564 rv = callback.WaitForResult(); | 2582 rv = callback.WaitForResult(); |
2565 EXPECT_EQ(OK, rv); | 2583 EXPECT_EQ(OK, rv); |
2566 | 2584 |
(...skipping 20 matching lines...) Expand all Loading... |
2587 request.method = "GET"; | 2605 request.method = "GET"; |
2588 request.url = GURL("http://www.google.com/"); | 2606 request.url = GURL("http://www.google.com/"); |
2589 request.load_flags = 0; | 2607 request.load_flags = 0; |
2590 | 2608 |
2591 // We are using a DIRECT connection (i.e. no proxy) for this session. | 2609 // We are using a DIRECT connection (i.e. no proxy) for this session. |
2592 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 2610 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
2593 scoped_ptr<HttpTransaction> trans( | 2611 scoped_ptr<HttpTransaction> trans( |
2594 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 2612 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
2595 | 2613 |
2596 MockWrite data_writes1[] = { | 2614 MockWrite data_writes1[] = { |
2597 MockWrite("GET / HTTP/1.1\r\n" | 2615 MockWrite( |
2598 "Host: www.google.com\r\n" | 2616 "GET / HTTP/1.1\r\n" |
2599 "Connection: keep-alive\r\n\r\n"), | 2617 "Host: www.google.com\r\n" |
| 2618 "Connection: keep-alive\r\n\r\n"), |
2600 }; | 2619 }; |
2601 | 2620 |
2602 MockRead data_reads1[] = { | 2621 MockRead data_reads1[] = { |
2603 MockRead("HTTP/1.0 407 Proxy Auth required\r\n"), | 2622 MockRead("HTTP/1.0 407 Proxy Auth required\r\n"), |
2604 MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | 2623 MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
2605 // Large content-length -- won't matter, as connection will be reset. | 2624 // Large content-length -- won't matter, as connection will be reset. |
2606 MockRead("Content-Length: 10000\r\n\r\n"), | 2625 MockRead("Content-Length: 10000\r\n\r\n"), |
2607 MockRead(SYNCHRONOUS, ERR_FAILED), | 2626 MockRead(SYNCHRONOUS, ERR_FAILED), |
2608 }; | 2627 }; |
2609 | 2628 |
2610 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 2629 StaticSocketDataProvider data1(data_reads1, |
2611 data_writes1, arraysize(data_writes1)); | 2630 arraysize(data_reads1), |
| 2631 data_writes1, |
| 2632 arraysize(data_writes1)); |
2612 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 2633 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
2613 | 2634 |
2614 TestCompletionCallback callback; | 2635 TestCompletionCallback callback; |
2615 | 2636 |
2616 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 2637 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
2617 EXPECT_EQ(ERR_IO_PENDING, rv); | 2638 EXPECT_EQ(ERR_IO_PENDING, rv); |
2618 | 2639 |
2619 rv = callback.WaitForResult(); | 2640 rv = callback.WaitForResult(); |
2620 EXPECT_EQ(ERR_UNEXPECTED_PROXY_AUTH, rv); | 2641 EXPECT_EQ(ERR_UNEXPECTED_PROXY_AUTH, rv); |
2621 } | 2642 } |
2622 | 2643 |
2623 // Tests when an HTTPS server (non-proxy) returns a 407 (proxy-authentication) | 2644 // Tests when an HTTPS server (non-proxy) returns a 407 (proxy-authentication) |
2624 // through a non-authenticating proxy. The request should fail with | 2645 // through a non-authenticating proxy. The request should fail with |
2625 // ERR_UNEXPECTED_PROXY_AUTH. | 2646 // ERR_UNEXPECTED_PROXY_AUTH. |
2626 // Note that it is impossible to detect if an HTTP server returns a 407 through | 2647 // Note that it is impossible to detect if an HTTP server returns a 407 through |
2627 // a non-authenticating proxy - there is nothing to indicate whether the | 2648 // a non-authenticating proxy - there is nothing to indicate whether the |
2628 // response came from the proxy or the server, so it is treated as if the proxy | 2649 // response came from the proxy or the server, so it is treated as if the proxy |
2629 // issued the challenge. | 2650 // issued the challenge. |
2630 TEST_P(HttpNetworkTransactionTest, | 2651 TEST_P(HttpNetworkTransactionTest, HttpsServerRequestsProxyAuthThroughProxy) { |
2631 HttpsServerRequestsProxyAuthThroughProxy) { | |
2632 HttpRequestInfo request; | 2652 HttpRequestInfo request; |
2633 request.method = "GET"; | 2653 request.method = "GET"; |
2634 request.url = GURL("https://www.google.com/"); | 2654 request.url = GURL("https://www.google.com/"); |
2635 | 2655 |
2636 session_deps_.proxy_service.reset(ProxyService::CreateFixed("myproxy:70")); | 2656 session_deps_.proxy_service.reset(ProxyService::CreateFixed("myproxy:70")); |
2637 CapturingBoundNetLog log; | 2657 CapturingBoundNetLog log; |
2638 session_deps_.net_log = log.bound().net_log(); | 2658 session_deps_.net_log = log.bound().net_log(); |
2639 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 2659 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
2640 | 2660 |
2641 // Since we have proxy, should try to establish tunnel. | 2661 // Since we have proxy, should try to establish tunnel. |
2642 MockWrite data_writes1[] = { | 2662 MockWrite data_writes1[] = { |
2643 MockWrite("CONNECT www.google.com:443 HTTP/1.1\r\n" | 2663 MockWrite( |
2644 "Host: www.google.com\r\n" | 2664 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
2645 "Proxy-Connection: keep-alive\r\n\r\n"), | 2665 "Host: www.google.com\r\n" |
2646 | 2666 "Proxy-Connection: keep-alive\r\n\r\n"), |
2647 MockWrite("GET / HTTP/1.1\r\n" | 2667 MockWrite( |
2648 "Host: www.google.com\r\n" | 2668 "GET / HTTP/1.1\r\n" |
2649 "Connection: keep-alive\r\n\r\n"), | 2669 "Host: www.google.com\r\n" |
| 2670 "Connection: keep-alive\r\n\r\n"), |
2650 }; | 2671 }; |
2651 | 2672 |
2652 MockRead data_reads1[] = { | 2673 MockRead data_reads1[] = { |
2653 MockRead("HTTP/1.1 200 Connection Established\r\n\r\n"), | 2674 MockRead("HTTP/1.1 200 Connection Established\r\n\r\n"), |
2654 | 2675 MockRead("HTTP/1.1 407 Unauthorized\r\n"), |
2655 MockRead("HTTP/1.1 407 Unauthorized\r\n"), | 2676 MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
2656 MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | 2677 MockRead("\r\n"), |
2657 MockRead("\r\n"), | 2678 MockRead(SYNCHRONOUS, OK), |
2658 MockRead(SYNCHRONOUS, OK), | |
2659 }; | 2679 }; |
2660 | 2680 |
2661 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 2681 StaticSocketDataProvider data1(data_reads1, |
2662 data_writes1, arraysize(data_writes1)); | 2682 arraysize(data_reads1), |
| 2683 data_writes1, |
| 2684 arraysize(data_writes1)); |
2663 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 2685 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
2664 SSLSocketDataProvider ssl(ASYNC, OK); | 2686 SSLSocketDataProvider ssl(ASYNC, OK); |
2665 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 2687 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
2666 | 2688 |
2667 TestCompletionCallback callback1; | 2689 TestCompletionCallback callback1; |
2668 | 2690 |
2669 scoped_ptr<HttpTransaction> trans( | 2691 scoped_ptr<HttpTransaction> trans( |
2670 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 2692 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
2671 | 2693 |
2672 int rv = trans->Start(&request, callback1.callback(), log.bound()); | 2694 int rv = trans->Start(&request, callback1.callback(), log.bound()); |
2673 EXPECT_EQ(ERR_IO_PENDING, rv); | 2695 EXPECT_EQ(ERR_IO_PENDING, rv); |
2674 | 2696 |
2675 rv = callback1.WaitForResult(); | 2697 rv = callback1.WaitForResult(); |
2676 EXPECT_EQ(ERR_UNEXPECTED_PROXY_AUTH, rv); | 2698 EXPECT_EQ(ERR_UNEXPECTED_PROXY_AUTH, rv); |
2677 net::CapturingNetLog::CapturedEntryList entries; | 2699 net::CapturingNetLog::CapturedEntryList entries; |
2678 log.GetEntries(&entries); | 2700 log.GetEntries(&entries); |
2679 size_t pos = ExpectLogContainsSomewhere( | 2701 size_t pos = ExpectLogContainsSomewhere( |
2680 entries, 0, NetLog::TYPE_HTTP_TRANSACTION_SEND_TUNNEL_HEADERS, | 2702 entries, |
| 2703 0, |
| 2704 NetLog::TYPE_HTTP_TRANSACTION_SEND_TUNNEL_HEADERS, |
2681 NetLog::PHASE_NONE); | 2705 NetLog::PHASE_NONE); |
2682 ExpectLogContainsSomewhere( | 2706 ExpectLogContainsSomewhere( |
2683 entries, pos, | 2707 entries, |
| 2708 pos, |
2684 NetLog::TYPE_HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS, | 2709 NetLog::TYPE_HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS, |
2685 NetLog::PHASE_NONE); | 2710 NetLog::PHASE_NONE); |
2686 } | 2711 } |
2687 | 2712 |
2688 // Test the load timing for HTTPS requests with an HTTP proxy. | 2713 // Test the load timing for HTTPS requests with an HTTP proxy. |
2689 TEST_P(HttpNetworkTransactionTest, HttpProxyLoadTimingNoPacTwoRequests) { | 2714 TEST_P(HttpNetworkTransactionTest, HttpProxyLoadTimingNoPacTwoRequests) { |
2690 HttpRequestInfo request1; | 2715 HttpRequestInfo request1; |
2691 request1.method = "GET"; | 2716 request1.method = "GET"; |
2692 request1.url = GURL("https://www.google.com/1"); | 2717 request1.url = GURL("https://www.google.com/1"); |
2693 | 2718 |
2694 HttpRequestInfo request2; | 2719 HttpRequestInfo request2; |
2695 request2.method = "GET"; | 2720 request2.method = "GET"; |
2696 request2.url = GURL("https://www.google.com/2"); | 2721 request2.url = GURL("https://www.google.com/2"); |
2697 | 2722 |
2698 // Configure against proxy server "myproxy:70". | 2723 // Configure against proxy server "myproxy:70". |
2699 session_deps_.proxy_service.reset( | 2724 session_deps_.proxy_service.reset( |
2700 ProxyService::CreateFixed("PROXY myproxy:70")); | 2725 ProxyService::CreateFixed("PROXY myproxy:70")); |
2701 CapturingBoundNetLog log; | 2726 CapturingBoundNetLog log; |
2702 session_deps_.net_log = log.bound().net_log(); | 2727 session_deps_.net_log = log.bound().net_log(); |
2703 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 2728 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
2704 | 2729 |
2705 // Since we have proxy, should try to establish tunnel. | 2730 // Since we have proxy, should try to establish tunnel. |
2706 MockWrite data_writes1[] = { | 2731 MockWrite data_writes1[] = { |
2707 MockWrite("CONNECT www.google.com:443 HTTP/1.1\r\n" | 2732 MockWrite( |
2708 "Host: www.google.com\r\n" | 2733 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
2709 "Proxy-Connection: keep-alive\r\n\r\n"), | 2734 "Host: www.google.com\r\n" |
2710 | 2735 "Proxy-Connection: keep-alive\r\n\r\n"), |
2711 MockWrite("GET /1 HTTP/1.1\r\n" | 2736 MockWrite( |
2712 "Host: www.google.com\r\n" | 2737 "GET /1 HTTP/1.1\r\n" |
2713 "Connection: keep-alive\r\n\r\n"), | 2738 "Host: www.google.com\r\n" |
2714 | 2739 "Connection: keep-alive\r\n\r\n"), |
2715 MockWrite("GET /2 HTTP/1.1\r\n" | 2740 MockWrite( |
2716 "Host: www.google.com\r\n" | 2741 "GET /2 HTTP/1.1\r\n" |
2717 "Connection: keep-alive\r\n\r\n"), | 2742 "Host: www.google.com\r\n" |
| 2743 "Connection: keep-alive\r\n\r\n"), |
2718 }; | 2744 }; |
2719 | 2745 |
2720 // The proxy responds to the connect with a 407, using a persistent | 2746 // The proxy responds to the connect with a 407, using a persistent |
2721 // connection. | 2747 // connection. |
2722 MockRead data_reads1[] = { | 2748 MockRead data_reads1[] = { |
2723 MockRead("HTTP/1.1 200 Connection Established\r\n\r\n"), | 2749 MockRead("HTTP/1.1 200 Connection Established\r\n\r\n"), |
2724 | 2750 MockRead("HTTP/1.1 200 OK\r\n"), |
2725 MockRead("HTTP/1.1 200 OK\r\n"), | 2751 MockRead("Content-Length: 1\r\n\r\n"), |
2726 MockRead("Content-Length: 1\r\n\r\n"), | 2752 MockRead(SYNCHRONOUS, "1"), |
2727 MockRead(SYNCHRONOUS, "1"), | 2753 MockRead("HTTP/1.1 200 OK\r\n"), |
2728 | 2754 MockRead("Content-Length: 2\r\n\r\n"), |
2729 MockRead("HTTP/1.1 200 OK\r\n"), | 2755 MockRead(SYNCHRONOUS, "22"), |
2730 MockRead("Content-Length: 2\r\n\r\n"), | |
2731 MockRead(SYNCHRONOUS, "22"), | |
2732 }; | 2756 }; |
2733 | 2757 |
2734 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 2758 StaticSocketDataProvider data1(data_reads1, |
2735 data_writes1, arraysize(data_writes1)); | 2759 arraysize(data_reads1), |
| 2760 data_writes1, |
| 2761 arraysize(data_writes1)); |
2736 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 2762 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
2737 SSLSocketDataProvider ssl(ASYNC, OK); | 2763 SSLSocketDataProvider ssl(ASYNC, OK); |
2738 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 2764 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
2739 | 2765 |
2740 TestCompletionCallback callback1; | 2766 TestCompletionCallback callback1; |
2741 scoped_ptr<HttpTransaction> trans1( | 2767 scoped_ptr<HttpTransaction> trans1( |
2742 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 2768 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
2743 | 2769 |
2744 int rv = trans1->Start(&request1, callback1.callback(), log.bound()); | 2770 int rv = trans1->Start(&request1, callback1.callback(), log.bound()); |
2745 EXPECT_EQ(ERR_IO_PENDING, rv); | 2771 EXPECT_EQ(ERR_IO_PENDING, rv); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2795 | 2821 |
2796 // Configure against proxy server "myproxy:70". | 2822 // Configure against proxy server "myproxy:70". |
2797 session_deps_.proxy_service.reset( | 2823 session_deps_.proxy_service.reset( |
2798 ProxyService::CreateFixedFromPacResult("PROXY myproxy:70")); | 2824 ProxyService::CreateFixedFromPacResult("PROXY myproxy:70")); |
2799 CapturingBoundNetLog log; | 2825 CapturingBoundNetLog log; |
2800 session_deps_.net_log = log.bound().net_log(); | 2826 session_deps_.net_log = log.bound().net_log(); |
2801 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 2827 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
2802 | 2828 |
2803 // Since we have proxy, should try to establish tunnel. | 2829 // Since we have proxy, should try to establish tunnel. |
2804 MockWrite data_writes1[] = { | 2830 MockWrite data_writes1[] = { |
2805 MockWrite("CONNECT www.google.com:443 HTTP/1.1\r\n" | 2831 MockWrite( |
2806 "Host: www.google.com\r\n" | 2832 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
2807 "Proxy-Connection: keep-alive\r\n\r\n"), | 2833 "Host: www.google.com\r\n" |
2808 | 2834 "Proxy-Connection: keep-alive\r\n\r\n"), |
2809 MockWrite("GET /1 HTTP/1.1\r\n" | 2835 MockWrite( |
2810 "Host: www.google.com\r\n" | 2836 "GET /1 HTTP/1.1\r\n" |
2811 "Connection: keep-alive\r\n\r\n"), | 2837 "Host: www.google.com\r\n" |
2812 | 2838 "Connection: keep-alive\r\n\r\n"), |
2813 MockWrite("GET /2 HTTP/1.1\r\n" | 2839 MockWrite( |
2814 "Host: www.google.com\r\n" | 2840 "GET /2 HTTP/1.1\r\n" |
2815 "Connection: keep-alive\r\n\r\n"), | 2841 "Host: www.google.com\r\n" |
| 2842 "Connection: keep-alive\r\n\r\n"), |
2816 }; | 2843 }; |
2817 | 2844 |
2818 // The proxy responds to the connect with a 407, using a persistent | 2845 // The proxy responds to the connect with a 407, using a persistent |
2819 // connection. | 2846 // connection. |
2820 MockRead data_reads1[] = { | 2847 MockRead data_reads1[] = { |
2821 MockRead("HTTP/1.1 200 Connection Established\r\n\r\n"), | 2848 MockRead("HTTP/1.1 200 Connection Established\r\n\r\n"), |
2822 | 2849 MockRead("HTTP/1.1 200 OK\r\n"), |
2823 MockRead("HTTP/1.1 200 OK\r\n"), | 2850 MockRead("Content-Length: 1\r\n\r\n"), |
2824 MockRead("Content-Length: 1\r\n\r\n"), | 2851 MockRead(SYNCHRONOUS, "1"), |
2825 MockRead(SYNCHRONOUS, "1"), | 2852 MockRead("HTTP/1.1 200 OK\r\n"), |
2826 | 2853 MockRead("Content-Length: 2\r\n\r\n"), |
2827 MockRead("HTTP/1.1 200 OK\r\n"), | 2854 MockRead(SYNCHRONOUS, "22"), |
2828 MockRead("Content-Length: 2\r\n\r\n"), | |
2829 MockRead(SYNCHRONOUS, "22"), | |
2830 }; | 2855 }; |
2831 | 2856 |
2832 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 2857 StaticSocketDataProvider data1(data_reads1, |
2833 data_writes1, arraysize(data_writes1)); | 2858 arraysize(data_reads1), |
| 2859 data_writes1, |
| 2860 arraysize(data_writes1)); |
2834 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 2861 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
2835 SSLSocketDataProvider ssl(ASYNC, OK); | 2862 SSLSocketDataProvider ssl(ASYNC, OK); |
2836 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 2863 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
2837 | 2864 |
2838 TestCompletionCallback callback1; | 2865 TestCompletionCallback callback1; |
2839 scoped_ptr<HttpTransaction> trans1( | 2866 scoped_ptr<HttpTransaction> trans1( |
2840 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 2867 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
2841 | 2868 |
2842 int rv = trans1->Start(&request1, callback1.callback(), log.bound()); | 2869 int rv = trans1->Start(&request1, callback1.callback(), log.bound()); |
2843 EXPECT_EQ(ERR_IO_PENDING, rv); | 2870 EXPECT_EQ(ERR_IO_PENDING, rv); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2882 session->CloseAllConnections(); | 2909 session->CloseAllConnections(); |
2883 } | 2910 } |
2884 | 2911 |
2885 // Test a simple get through an HTTPS Proxy. | 2912 // Test a simple get through an HTTPS Proxy. |
2886 TEST_P(HttpNetworkTransactionTest, HttpsProxyGet) { | 2913 TEST_P(HttpNetworkTransactionTest, HttpsProxyGet) { |
2887 HttpRequestInfo request; | 2914 HttpRequestInfo request; |
2888 request.method = "GET"; | 2915 request.method = "GET"; |
2889 request.url = GURL("http://www.google.com/"); | 2916 request.url = GURL("http://www.google.com/"); |
2890 | 2917 |
2891 // Configure against https proxy server "proxy:70". | 2918 // Configure against https proxy server "proxy:70". |
2892 session_deps_.proxy_service.reset(ProxyService::CreateFixed( | 2919 session_deps_.proxy_service.reset( |
2893 "https://proxy:70")); | 2920 ProxyService::CreateFixed("https://proxy:70")); |
2894 CapturingBoundNetLog log; | 2921 CapturingBoundNetLog log; |
2895 session_deps_.net_log = log.bound().net_log(); | 2922 session_deps_.net_log = log.bound().net_log(); |
2896 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 2923 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
2897 | 2924 |
2898 // Since we have proxy, should use full url | 2925 // Since we have proxy, should use full url |
2899 MockWrite data_writes1[] = { | 2926 MockWrite data_writes1[] = { |
2900 MockWrite("GET http://www.google.com/ HTTP/1.1\r\n" | 2927 MockWrite( |
2901 "Host: www.google.com\r\n" | 2928 "GET http://www.google.com/ HTTP/1.1\r\n" |
2902 "Proxy-Connection: keep-alive\r\n\r\n"), | 2929 "Host: www.google.com\r\n" |
| 2930 "Proxy-Connection: keep-alive\r\n\r\n"), |
2903 }; | 2931 }; |
2904 | 2932 |
2905 MockRead data_reads1[] = { | 2933 MockRead data_reads1[] = { |
2906 MockRead("HTTP/1.1 200 OK\r\n"), | 2934 MockRead("HTTP/1.1 200 OK\r\n"), |
2907 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 2935 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
2908 MockRead("Content-Length: 100\r\n\r\n"), | 2936 MockRead("Content-Length: 100\r\n\r\n"), MockRead(SYNCHRONOUS, OK), |
2909 MockRead(SYNCHRONOUS, OK), | |
2910 }; | 2937 }; |
2911 | 2938 |
2912 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 2939 StaticSocketDataProvider data1(data_reads1, |
2913 data_writes1, arraysize(data_writes1)); | 2940 arraysize(data_reads1), |
| 2941 data_writes1, |
| 2942 arraysize(data_writes1)); |
2914 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 2943 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
2915 SSLSocketDataProvider ssl(ASYNC, OK); | 2944 SSLSocketDataProvider ssl(ASYNC, OK); |
2916 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 2945 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
2917 | 2946 |
2918 TestCompletionCallback callback1; | 2947 TestCompletionCallback callback1; |
2919 | 2948 |
2920 scoped_ptr<HttpTransaction> trans( | 2949 scoped_ptr<HttpTransaction> trans( |
2921 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 2950 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
2922 | 2951 |
2923 int rv = trans->Start(&request, callback1.callback(), log.bound()); | 2952 int rv = trans->Start(&request, callback1.callback(), log.bound()); |
(...skipping 20 matching lines...) Expand all Loading... |
2944 } | 2973 } |
2945 | 2974 |
2946 // Test a SPDY get through an HTTPS Proxy. | 2975 // Test a SPDY get through an HTTPS Proxy. |
2947 TEST_P(HttpNetworkTransactionTest, HttpsProxySpdyGet) { | 2976 TEST_P(HttpNetworkTransactionTest, HttpsProxySpdyGet) { |
2948 HttpRequestInfo request; | 2977 HttpRequestInfo request; |
2949 request.method = "GET"; | 2978 request.method = "GET"; |
2950 request.url = GURL("http://www.google.com/"); | 2979 request.url = GURL("http://www.google.com/"); |
2951 request.load_flags = 0; | 2980 request.load_flags = 0; |
2952 | 2981 |
2953 // Configure against https proxy server "proxy:70". | 2982 // Configure against https proxy server "proxy:70". |
2954 session_deps_.proxy_service.reset(ProxyService::CreateFixed( | 2983 session_deps_.proxy_service.reset( |
2955 "https://proxy:70")); | 2984 ProxyService::CreateFixed("https://proxy:70")); |
2956 CapturingBoundNetLog log; | 2985 CapturingBoundNetLog log; |
2957 session_deps_.net_log = log.bound().net_log(); | 2986 session_deps_.net_log = log.bound().net_log(); |
2958 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 2987 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
2959 | 2988 |
2960 // fetch http://www.google.com/ via SPDY | 2989 // fetch http://www.google.com/ via SPDY |
2961 scoped_ptr<SpdyFrame> req( | 2990 scoped_ptr<SpdyFrame> req( |
2962 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, false)); | 2991 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, false)); |
2963 MockWrite spdy_writes[] = { CreateMockWrite(*req) }; | 2992 MockWrite spdy_writes[] = {CreateMockWrite(*req)}; |
2964 | 2993 |
2965 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 2994 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
2966 scoped_ptr<SpdyFrame> data(spdy_util_.ConstructSpdyBodyFrame(1, true)); | 2995 scoped_ptr<SpdyFrame> data(spdy_util_.ConstructSpdyBodyFrame(1, true)); |
2967 MockRead spdy_reads[] = { | 2996 MockRead spdy_reads[] = { |
2968 CreateMockRead(*resp), | 2997 CreateMockRead(*resp), CreateMockRead(*data), MockRead(ASYNC, 0, 0), |
2969 CreateMockRead(*data), | |
2970 MockRead(ASYNC, 0, 0), | |
2971 }; | 2998 }; |
2972 | 2999 |
2973 DelayedSocketData spdy_data( | 3000 DelayedSocketData spdy_data( |
2974 1, // wait for one write to finish before reading. | 3001 1, // wait for one write to finish before reading. |
2975 spdy_reads, arraysize(spdy_reads), | 3002 spdy_reads, |
2976 spdy_writes, arraysize(spdy_writes)); | 3003 arraysize(spdy_reads), |
| 3004 spdy_writes, |
| 3005 arraysize(spdy_writes)); |
2977 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); | 3006 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); |
2978 | 3007 |
2979 SSLSocketDataProvider ssl(ASYNC, OK); | 3008 SSLSocketDataProvider ssl(ASYNC, OK); |
2980 ssl.SetNextProto(GetParam()); | 3009 ssl.SetNextProto(GetParam()); |
2981 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 3010 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
2982 | 3011 |
2983 TestCompletionCallback callback1; | 3012 TestCompletionCallback callback1; |
2984 | 3013 |
2985 scoped_ptr<HttpTransaction> trans( | 3014 scoped_ptr<HttpTransaction> trans( |
2986 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 3015 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
(...skipping 30 matching lines...) Expand all Loading... |
3017 session_deps_.proxy_service.reset( | 3046 session_deps_.proxy_service.reset( |
3018 ProxyService::CreateFixed("https://myproxy:70")); | 3047 ProxyService::CreateFixed("https://myproxy:70")); |
3019 CapturingBoundNetLog log; | 3048 CapturingBoundNetLog log; |
3020 session_deps_.net_log = log.bound().net_log(); | 3049 session_deps_.net_log = log.bound().net_log(); |
3021 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 3050 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
3022 | 3051 |
3023 // The first request will be a bare GET, the second request will be a | 3052 // The first request will be a bare GET, the second request will be a |
3024 // GET with a Proxy-Authorization header. | 3053 // GET with a Proxy-Authorization header. |
3025 scoped_ptr<SpdyFrame> req_get( | 3054 scoped_ptr<SpdyFrame> req_get( |
3026 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, false)); | 3055 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, false)); |
3027 const char* const kExtraAuthorizationHeaders[] = { | 3056 const char* const kExtraAuthorizationHeaders[] = {"proxy-authorization", |
3028 "proxy-authorization", "Basic Zm9vOmJhcg==" | 3057 "Basic Zm9vOmJhcg=="}; |
3029 }; | |
3030 scoped_ptr<SpdyFrame> req_get_authorization( | 3058 scoped_ptr<SpdyFrame> req_get_authorization( |
3031 spdy_util_.ConstructSpdyGet(kExtraAuthorizationHeaders, | 3059 spdy_util_.ConstructSpdyGet(kExtraAuthorizationHeaders, |
3032 arraysize(kExtraAuthorizationHeaders) / 2, | 3060 arraysize(kExtraAuthorizationHeaders) / 2, |
3033 false, | 3061 false, |
3034 3, | 3062 3, |
3035 LOWEST, | 3063 LOWEST, |
3036 false)); | 3064 false)); |
3037 MockWrite spdy_writes[] = { | 3065 MockWrite spdy_writes[] = { |
3038 CreateMockWrite(*req_get, 1), | 3066 CreateMockWrite(*req_get, 1), CreateMockWrite(*req_get_authorization, 4), |
3039 CreateMockWrite(*req_get_authorization, 4), | |
3040 }; | 3067 }; |
3041 | 3068 |
3042 // The first response is a 407 proxy authentication challenge, and the second | 3069 // The first response is a 407 proxy authentication challenge, and the second |
3043 // response will be a 200 response since the second request includes a valid | 3070 // response will be a 200 response since the second request includes a valid |
3044 // Authorization header. | 3071 // Authorization header. |
3045 const char* const kExtraAuthenticationHeaders[] = { | 3072 const char* const kExtraAuthenticationHeaders[] = { |
3046 "proxy-authenticate", "Basic realm=\"MyRealm1\"" | 3073 "proxy-authenticate", "Basic realm=\"MyRealm1\""}; |
3047 }; | |
3048 scoped_ptr<SpdyFrame> resp_authentication( | 3074 scoped_ptr<SpdyFrame> resp_authentication( |
3049 spdy_util_.ConstructSpdySynReplyError( | 3075 spdy_util_.ConstructSpdySynReplyError( |
3050 "407 Proxy Authentication Required", | 3076 "407 Proxy Authentication Required", |
3051 kExtraAuthenticationHeaders, arraysize(kExtraAuthenticationHeaders)/2, | 3077 kExtraAuthenticationHeaders, |
| 3078 arraysize(kExtraAuthenticationHeaders) / 2, |
3052 1)); | 3079 1)); |
3053 scoped_ptr<SpdyFrame> body_authentication( | 3080 scoped_ptr<SpdyFrame> body_authentication( |
3054 spdy_util_.ConstructSpdyBodyFrame(1, true)); | 3081 spdy_util_.ConstructSpdyBodyFrame(1, true)); |
3055 scoped_ptr<SpdyFrame> resp_data( | 3082 scoped_ptr<SpdyFrame> resp_data( |
3056 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); | 3083 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); |
3057 scoped_ptr<SpdyFrame> body_data(spdy_util_.ConstructSpdyBodyFrame(3, true)); | 3084 scoped_ptr<SpdyFrame> body_data(spdy_util_.ConstructSpdyBodyFrame(3, true)); |
3058 MockRead spdy_reads[] = { | 3085 MockRead spdy_reads[] = { |
3059 CreateMockRead(*resp_authentication, 2), | 3086 CreateMockRead(*resp_authentication, 2), |
3060 CreateMockRead(*body_authentication, 3), | 3087 CreateMockRead(*body_authentication, 3), |
3061 CreateMockRead(*resp_data, 5), | 3088 CreateMockRead(*resp_data, 5), |
3062 CreateMockRead(*body_data, 6), | 3089 CreateMockRead(*body_data, 6), |
3063 MockRead(ASYNC, 0, 7), | 3090 MockRead(ASYNC, 0, 7), |
3064 }; | 3091 }; |
3065 | 3092 |
3066 OrderedSocketData data( | 3093 OrderedSocketData data( |
3067 spdy_reads, arraysize(spdy_reads), | 3094 spdy_reads, arraysize(spdy_reads), spdy_writes, arraysize(spdy_writes)); |
3068 spdy_writes, arraysize(spdy_writes)); | |
3069 session_deps_.socket_factory->AddSocketDataProvider(&data); | 3095 session_deps_.socket_factory->AddSocketDataProvider(&data); |
3070 | 3096 |
3071 SSLSocketDataProvider ssl(ASYNC, OK); | 3097 SSLSocketDataProvider ssl(ASYNC, OK); |
3072 ssl.SetNextProto(GetParam()); | 3098 ssl.SetNextProto(GetParam()); |
3073 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 3099 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
3074 | 3100 |
3075 TestCompletionCallback callback1; | 3101 TestCompletionCallback callback1; |
3076 | 3102 |
3077 scoped_ptr<HttpTransaction> trans( | 3103 scoped_ptr<HttpTransaction> trans( |
3078 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 3104 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
3079 | 3105 |
3080 int rv = trans->Start(&request, callback1.callback(), log.bound()); | 3106 int rv = trans->Start(&request, callback1.callback(), log.bound()); |
3081 EXPECT_EQ(ERR_IO_PENDING, rv); | 3107 EXPECT_EQ(ERR_IO_PENDING, rv); |
3082 | 3108 |
3083 rv = callback1.WaitForResult(); | 3109 rv = callback1.WaitForResult(); |
3084 EXPECT_EQ(OK, rv); | 3110 EXPECT_EQ(OK, rv); |
3085 | 3111 |
3086 const HttpResponseInfo* const response = trans->GetResponseInfo(); | 3112 const HttpResponseInfo* const response = trans->GetResponseInfo(); |
3087 | 3113 |
3088 ASSERT_TRUE(response != NULL); | 3114 ASSERT_TRUE(response != NULL); |
3089 ASSERT_TRUE(response->headers.get() != NULL); | 3115 ASSERT_TRUE(response->headers.get() != NULL); |
3090 EXPECT_EQ(407, response->headers->response_code()); | 3116 EXPECT_EQ(407, response->headers->response_code()); |
3091 EXPECT_TRUE(response->was_fetched_via_spdy); | 3117 EXPECT_TRUE(response->was_fetched_via_spdy); |
3092 EXPECT_TRUE(CheckBasicProxyAuth(response->auth_challenge.get())); | 3118 EXPECT_TRUE(CheckBasicProxyAuth(response->auth_challenge.get())); |
3093 | 3119 |
3094 TestCompletionCallback callback2; | 3120 TestCompletionCallback callback2; |
3095 | 3121 |
3096 rv = trans->RestartWithAuth( | 3122 rv = |
3097 AuthCredentials(kFoo, kBar), callback2.callback()); | 3123 trans->RestartWithAuth(AuthCredentials(kFoo, kBar), callback2.callback()); |
3098 EXPECT_EQ(ERR_IO_PENDING, rv); | 3124 EXPECT_EQ(ERR_IO_PENDING, rv); |
3099 | 3125 |
3100 rv = callback2.WaitForResult(); | 3126 rv = callback2.WaitForResult(); |
3101 EXPECT_EQ(OK, rv); | 3127 EXPECT_EQ(OK, rv); |
3102 | 3128 |
3103 const HttpResponseInfo* const response_restart = trans->GetResponseInfo(); | 3129 const HttpResponseInfo* const response_restart = trans->GetResponseInfo(); |
3104 | 3130 |
3105 ASSERT_TRUE(response_restart != NULL); | 3131 ASSERT_TRUE(response_restart != NULL); |
3106 ASSERT_TRUE(response_restart->headers.get() != NULL); | 3132 ASSERT_TRUE(response_restart->headers.get() != NULL); |
3107 EXPECT_EQ(200, response_restart->headers->response_code()); | 3133 EXPECT_EQ(200, response_restart->headers->response_code()); |
3108 // The password prompt info should not be set. | 3134 // The password prompt info should not be set. |
3109 EXPECT_TRUE(response_restart->auth_challenge.get() == NULL); | 3135 EXPECT_TRUE(response_restart->auth_challenge.get() == NULL); |
3110 } | 3136 } |
3111 | 3137 |
3112 // Test a SPDY CONNECT through an HTTPS Proxy to an HTTPS (non-SPDY) Server. | 3138 // Test a SPDY CONNECT through an HTTPS Proxy to an HTTPS (non-SPDY) Server. |
3113 TEST_P(HttpNetworkTransactionTest, HttpsProxySpdyConnectHttps) { | 3139 TEST_P(HttpNetworkTransactionTest, HttpsProxySpdyConnectHttps) { |
3114 HttpRequestInfo request; | 3140 HttpRequestInfo request; |
3115 request.method = "GET"; | 3141 request.method = "GET"; |
3116 request.url = GURL("https://www.google.com/"); | 3142 request.url = GURL("https://www.google.com/"); |
3117 request.load_flags = 0; | 3143 request.load_flags = 0; |
3118 | 3144 |
3119 // Configure against https proxy server "proxy:70". | 3145 // Configure against https proxy server "proxy:70". |
3120 session_deps_.proxy_service.reset(ProxyService::CreateFixed( | 3146 session_deps_.proxy_service.reset( |
3121 "https://proxy:70")); | 3147 ProxyService::CreateFixed("https://proxy:70")); |
3122 CapturingBoundNetLog log; | 3148 CapturingBoundNetLog log; |
3123 session_deps_.net_log = log.bound().net_log(); | 3149 session_deps_.net_log = log.bound().net_log(); |
3124 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 3150 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
3125 | 3151 |
3126 scoped_ptr<HttpTransaction> trans( | 3152 scoped_ptr<HttpTransaction> trans( |
3127 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 3153 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
3128 | 3154 |
3129 // CONNECT to www.google.com:443 via SPDY | 3155 // CONNECT to www.google.com:443 via SPDY |
3130 scoped_ptr<SpdyFrame> connect(spdy_util_.ConstructSpdyConnect(NULL, 0, 1, | 3156 scoped_ptr<SpdyFrame> connect( |
3131 LOWEST)); | 3157 spdy_util_.ConstructSpdyConnect(NULL, 0, 1, LOWEST)); |
3132 // fetch https://www.google.com/ via HTTP | 3158 // fetch https://www.google.com/ via HTTP |
3133 | 3159 |
3134 const char get[] = "GET / HTTP/1.1\r\n" | 3160 const char get[] = |
3135 "Host: www.google.com\r\n" | 3161 "GET / HTTP/1.1\r\n" |
3136 "Connection: keep-alive\r\n\r\n"; | 3162 "Host: www.google.com\r\n" |
| 3163 "Connection: keep-alive\r\n\r\n"; |
3137 scoped_ptr<SpdyFrame> wrapped_get( | 3164 scoped_ptr<SpdyFrame> wrapped_get( |
3138 spdy_util_.ConstructSpdyBodyFrame(1, get, strlen(get), false)); | 3165 spdy_util_.ConstructSpdyBodyFrame(1, get, strlen(get), false)); |
3139 scoped_ptr<SpdyFrame> conn_resp( | 3166 scoped_ptr<SpdyFrame> conn_resp( |
3140 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 3167 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
3141 const char resp[] = "HTTP/1.1 200 OK\r\n" | 3168 const char resp[] = |
| 3169 "HTTP/1.1 200 OK\r\n" |
3142 "Content-Length: 10\r\n\r\n"; | 3170 "Content-Length: 10\r\n\r\n"; |
3143 scoped_ptr<SpdyFrame> wrapped_get_resp( | 3171 scoped_ptr<SpdyFrame> wrapped_get_resp( |
3144 spdy_util_.ConstructSpdyBodyFrame(1, resp, strlen(resp), false)); | 3172 spdy_util_.ConstructSpdyBodyFrame(1, resp, strlen(resp), false)); |
3145 scoped_ptr<SpdyFrame> wrapped_body( | 3173 scoped_ptr<SpdyFrame> wrapped_body( |
3146 spdy_util_.ConstructSpdyBodyFrame(1, "1234567890", 10, false)); | 3174 spdy_util_.ConstructSpdyBodyFrame(1, "1234567890", 10, false)); |
3147 scoped_ptr<SpdyFrame> window_update( | 3175 scoped_ptr<SpdyFrame> window_update( |
3148 spdy_util_.ConstructSpdyWindowUpdate(1, wrapped_get_resp->size())); | 3176 spdy_util_.ConstructSpdyWindowUpdate(1, wrapped_get_resp->size())); |
3149 | 3177 |
3150 MockWrite spdy_writes[] = { | 3178 MockWrite spdy_writes[] = { |
3151 CreateMockWrite(*connect, 1), | 3179 CreateMockWrite(*connect, 1), CreateMockWrite(*wrapped_get, 3), |
3152 CreateMockWrite(*wrapped_get, 3), | |
3153 CreateMockWrite(*window_update, 5), | 3180 CreateMockWrite(*window_update, 5), |
3154 }; | 3181 }; |
3155 | 3182 |
3156 MockRead spdy_reads[] = { | 3183 MockRead spdy_reads[] = { |
3157 CreateMockRead(*conn_resp, 2, ASYNC), | 3184 CreateMockRead(*conn_resp, 2, ASYNC), |
3158 CreateMockRead(*wrapped_get_resp, 4, ASYNC), | 3185 CreateMockRead(*wrapped_get_resp, 4, ASYNC), |
3159 CreateMockRead(*wrapped_body, 6, ASYNC), | 3186 CreateMockRead(*wrapped_body, 6, ASYNC), |
3160 CreateMockRead(*wrapped_body, 7, ASYNC), | 3187 CreateMockRead(*wrapped_body, 7, ASYNC), |
3161 MockRead(ASYNC, 0, 8), | 3188 MockRead(ASYNC, 0, 8), |
3162 }; | 3189 }; |
3163 | 3190 |
3164 OrderedSocketData spdy_data( | 3191 OrderedSocketData spdy_data( |
3165 spdy_reads, arraysize(spdy_reads), | 3192 spdy_reads, arraysize(spdy_reads), spdy_writes, arraysize(spdy_writes)); |
3166 spdy_writes, arraysize(spdy_writes)); | |
3167 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); | 3193 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); |
3168 | 3194 |
3169 SSLSocketDataProvider ssl(ASYNC, OK); | 3195 SSLSocketDataProvider ssl(ASYNC, OK); |
3170 ssl.SetNextProto(GetParam()); | 3196 ssl.SetNextProto(GetParam()); |
3171 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 3197 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
3172 SSLSocketDataProvider ssl2(ASYNC, OK); | 3198 SSLSocketDataProvider ssl2(ASYNC, OK); |
3173 ssl2.was_npn_negotiated = false; | 3199 ssl2.was_npn_negotiated = false; |
3174 ssl2.protocol_negotiated = kProtoUnknown; | 3200 ssl2.protocol_negotiated = kProtoUnknown; |
3175 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl2); | 3201 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl2); |
3176 | 3202 |
(...skipping 20 matching lines...) Expand all Loading... |
3197 } | 3223 } |
3198 | 3224 |
3199 // Test a SPDY CONNECT through an HTTPS Proxy to a SPDY server. | 3225 // Test a SPDY CONNECT through an HTTPS Proxy to a SPDY server. |
3200 TEST_P(HttpNetworkTransactionTest, HttpsProxySpdyConnectSpdy) { | 3226 TEST_P(HttpNetworkTransactionTest, HttpsProxySpdyConnectSpdy) { |
3201 HttpRequestInfo request; | 3227 HttpRequestInfo request; |
3202 request.method = "GET"; | 3228 request.method = "GET"; |
3203 request.url = GURL("https://www.google.com/"); | 3229 request.url = GURL("https://www.google.com/"); |
3204 request.load_flags = 0; | 3230 request.load_flags = 0; |
3205 | 3231 |
3206 // Configure against https proxy server "proxy:70". | 3232 // Configure against https proxy server "proxy:70". |
3207 session_deps_.proxy_service.reset(ProxyService::CreateFixed( | 3233 session_deps_.proxy_service.reset( |
3208 "https://proxy:70")); | 3234 ProxyService::CreateFixed("https://proxy:70")); |
3209 CapturingBoundNetLog log; | 3235 CapturingBoundNetLog log; |
3210 session_deps_.net_log = log.bound().net_log(); | 3236 session_deps_.net_log = log.bound().net_log(); |
3211 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 3237 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
3212 | 3238 |
3213 scoped_ptr<HttpTransaction> trans( | 3239 scoped_ptr<HttpTransaction> trans( |
3214 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 3240 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
3215 | 3241 |
3216 // CONNECT to www.google.com:443 via SPDY | 3242 // CONNECT to www.google.com:443 via SPDY |
3217 scoped_ptr<SpdyFrame> connect(spdy_util_.ConstructSpdyConnect(NULL, 0, 1, | 3243 scoped_ptr<SpdyFrame> connect( |
3218 LOWEST)); | 3244 spdy_util_.ConstructSpdyConnect(NULL, 0, 1, LOWEST)); |
3219 // fetch https://www.google.com/ via SPDY | 3245 // fetch https://www.google.com/ via SPDY |
3220 const char* const kMyUrl = "https://www.google.com/"; | 3246 const char* const kMyUrl = "https://www.google.com/"; |
3221 scoped_ptr<SpdyFrame> get( | 3247 scoped_ptr<SpdyFrame> get( |
3222 spdy_util_.ConstructSpdyGet(kMyUrl, false, 1, LOWEST)); | 3248 spdy_util_.ConstructSpdyGet(kMyUrl, false, 1, LOWEST)); |
3223 scoped_ptr<SpdyFrame> wrapped_get( | 3249 scoped_ptr<SpdyFrame> wrapped_get( |
3224 spdy_util_.ConstructWrappedSpdyFrame(get, 1)); | 3250 spdy_util_.ConstructWrappedSpdyFrame(get, 1)); |
3225 scoped_ptr<SpdyFrame> conn_resp( | 3251 scoped_ptr<SpdyFrame> conn_resp( |
3226 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 3252 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
3227 scoped_ptr<SpdyFrame> get_resp( | 3253 scoped_ptr<SpdyFrame> get_resp( |
3228 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 3254 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
3229 scoped_ptr<SpdyFrame> wrapped_get_resp( | 3255 scoped_ptr<SpdyFrame> wrapped_get_resp( |
3230 spdy_util_.ConstructWrappedSpdyFrame(get_resp, 1)); | 3256 spdy_util_.ConstructWrappedSpdyFrame(get_resp, 1)); |
3231 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); | 3257 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); |
3232 scoped_ptr<SpdyFrame> wrapped_body( | 3258 scoped_ptr<SpdyFrame> wrapped_body( |
3233 spdy_util_.ConstructWrappedSpdyFrame(body, 1)); | 3259 spdy_util_.ConstructWrappedSpdyFrame(body, 1)); |
3234 scoped_ptr<SpdyFrame> window_update_get_resp( | 3260 scoped_ptr<SpdyFrame> window_update_get_resp( |
3235 spdy_util_.ConstructSpdyWindowUpdate(1, wrapped_get_resp->size())); | 3261 spdy_util_.ConstructSpdyWindowUpdate(1, wrapped_get_resp->size())); |
3236 scoped_ptr<SpdyFrame> window_update_body( | 3262 scoped_ptr<SpdyFrame> window_update_body( |
3237 spdy_util_.ConstructSpdyWindowUpdate(1, wrapped_body->size())); | 3263 spdy_util_.ConstructSpdyWindowUpdate(1, wrapped_body->size())); |
3238 | 3264 |
3239 MockWrite spdy_writes[] = { | 3265 MockWrite spdy_writes[] = { |
3240 CreateMockWrite(*connect, 1), | 3266 CreateMockWrite(*connect, 1), CreateMockWrite(*wrapped_get, 3), |
3241 CreateMockWrite(*wrapped_get, 3), | |
3242 CreateMockWrite(*window_update_get_resp, 5), | 3267 CreateMockWrite(*window_update_get_resp, 5), |
3243 CreateMockWrite(*window_update_body, 7), | 3268 CreateMockWrite(*window_update_body, 7), |
3244 }; | 3269 }; |
3245 | 3270 |
3246 MockRead spdy_reads[] = { | 3271 MockRead spdy_reads[] = { |
3247 CreateMockRead(*conn_resp, 2, ASYNC), | 3272 CreateMockRead(*conn_resp, 2, ASYNC), |
3248 CreateMockRead(*wrapped_get_resp, 4, ASYNC), | 3273 CreateMockRead(*wrapped_get_resp, 4, ASYNC), |
3249 CreateMockRead(*wrapped_body, 6, ASYNC), | 3274 CreateMockRead(*wrapped_body, 6, ASYNC), MockRead(ASYNC, 0, 8), |
3250 MockRead(ASYNC, 0, 8), | |
3251 }; | 3275 }; |
3252 | 3276 |
3253 OrderedSocketData spdy_data( | 3277 OrderedSocketData spdy_data( |
3254 spdy_reads, arraysize(spdy_reads), | 3278 spdy_reads, arraysize(spdy_reads), spdy_writes, arraysize(spdy_writes)); |
3255 spdy_writes, arraysize(spdy_writes)); | |
3256 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); | 3279 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); |
3257 | 3280 |
3258 SSLSocketDataProvider ssl(ASYNC, OK); | 3281 SSLSocketDataProvider ssl(ASYNC, OK); |
3259 ssl.SetNextProto(GetParam()); | 3282 ssl.SetNextProto(GetParam()); |
3260 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 3283 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
3261 SSLSocketDataProvider ssl2(ASYNC, OK); | 3284 SSLSocketDataProvider ssl2(ASYNC, OK); |
3262 ssl2.SetNextProto(GetParam()); | 3285 ssl2.SetNextProto(GetParam()); |
3263 ssl2.protocol_negotiated = GetParam(); | 3286 ssl2.protocol_negotiated = GetParam(); |
3264 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl2); | 3287 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl2); |
3265 | 3288 |
(...skipping 20 matching lines...) Expand all Loading... |
3286 } | 3309 } |
3287 | 3310 |
3288 // Test a SPDY CONNECT failure through an HTTPS Proxy. | 3311 // Test a SPDY CONNECT failure through an HTTPS Proxy. |
3289 TEST_P(HttpNetworkTransactionTest, HttpsProxySpdyConnectFailure) { | 3312 TEST_P(HttpNetworkTransactionTest, HttpsProxySpdyConnectFailure) { |
3290 HttpRequestInfo request; | 3313 HttpRequestInfo request; |
3291 request.method = "GET"; | 3314 request.method = "GET"; |
3292 request.url = GURL("https://www.google.com/"); | 3315 request.url = GURL("https://www.google.com/"); |
3293 request.load_flags = 0; | 3316 request.load_flags = 0; |
3294 | 3317 |
3295 // Configure against https proxy server "proxy:70". | 3318 // Configure against https proxy server "proxy:70". |
3296 session_deps_.proxy_service.reset(ProxyService::CreateFixed( | 3319 session_deps_.proxy_service.reset( |
3297 "https://proxy:70")); | 3320 ProxyService::CreateFixed("https://proxy:70")); |
3298 CapturingBoundNetLog log; | 3321 CapturingBoundNetLog log; |
3299 session_deps_.net_log = log.bound().net_log(); | 3322 session_deps_.net_log = log.bound().net_log(); |
3300 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 3323 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
3301 | 3324 |
3302 scoped_ptr<HttpTransaction> trans( | 3325 scoped_ptr<HttpTransaction> trans( |
3303 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 3326 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
3304 | 3327 |
3305 // CONNECT to www.google.com:443 via SPDY | 3328 // CONNECT to www.google.com:443 via SPDY |
3306 scoped_ptr<SpdyFrame> connect(spdy_util_.ConstructSpdyConnect(NULL, 0, 1, | 3329 scoped_ptr<SpdyFrame> connect( |
3307 LOWEST)); | 3330 spdy_util_.ConstructSpdyConnect(NULL, 0, 1, LOWEST)); |
3308 scoped_ptr<SpdyFrame> get( | 3331 scoped_ptr<SpdyFrame> get( |
3309 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 3332 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
3310 | 3333 |
3311 MockWrite spdy_writes[] = { | 3334 MockWrite spdy_writes[] = { |
3312 CreateMockWrite(*connect, 1), | 3335 CreateMockWrite(*connect, 1), CreateMockWrite(*get, 3), |
3313 CreateMockWrite(*get, 3), | |
3314 }; | 3336 }; |
3315 | 3337 |
3316 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdySynReplyError(1)); | 3338 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdySynReplyError(1)); |
3317 scoped_ptr<SpdyFrame> data(spdy_util_.ConstructSpdyBodyFrame(1, true)); | 3339 scoped_ptr<SpdyFrame> data(spdy_util_.ConstructSpdyBodyFrame(1, true)); |
3318 MockRead spdy_reads[] = { | 3340 MockRead spdy_reads[] = { |
3319 CreateMockRead(*resp, 2, ASYNC), | 3341 CreateMockRead(*resp, 2, ASYNC), MockRead(ASYNC, 0, 4), |
3320 MockRead(ASYNC, 0, 4), | |
3321 }; | 3342 }; |
3322 | 3343 |
3323 OrderedSocketData spdy_data( | 3344 OrderedSocketData spdy_data( |
3324 spdy_reads, arraysize(spdy_reads), | 3345 spdy_reads, arraysize(spdy_reads), spdy_writes, arraysize(spdy_writes)); |
3325 spdy_writes, arraysize(spdy_writes)); | |
3326 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); | 3346 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); |
3327 | 3347 |
3328 SSLSocketDataProvider ssl(ASYNC, OK); | 3348 SSLSocketDataProvider ssl(ASYNC, OK); |
3329 ssl.SetNextProto(GetParam()); | 3349 ssl.SetNextProto(GetParam()); |
3330 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 3350 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
3331 SSLSocketDataProvider ssl2(ASYNC, OK); | 3351 SSLSocketDataProvider ssl2(ASYNC, OK); |
3332 ssl2.SetNextProto(GetParam()); | 3352 ssl2.SetNextProto(GetParam()); |
3333 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl2); | 3353 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl2); |
3334 | 3354 |
3335 TestCompletionCallback callback1; | 3355 TestCompletionCallback callback1; |
3336 | 3356 |
3337 int rv = trans->Start(&request, callback1.callback(), log.bound()); | 3357 int rv = trans->Start(&request, callback1.callback(), log.bound()); |
3338 EXPECT_EQ(ERR_IO_PENDING, rv); | 3358 EXPECT_EQ(ERR_IO_PENDING, rv); |
3339 | 3359 |
3340 rv = callback1.WaitForResult(); | 3360 rv = callback1.WaitForResult(); |
3341 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, rv); | 3361 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, rv); |
3342 | 3362 |
3343 // TODO(ttuttle): Anything else to check here? | 3363 // TODO(ttuttle): Anything else to check here? |
3344 } | 3364 } |
3345 | 3365 |
3346 // Test load timing in the case of two HTTPS (non-SPDY) requests through a SPDY | 3366 // Test load timing in the case of two HTTPS (non-SPDY) requests through a SPDY |
3347 // HTTPS Proxy to different servers. | 3367 // HTTPS Proxy to different servers. |
3348 TEST_P(HttpNetworkTransactionTest, | 3368 TEST_P(HttpNetworkTransactionTest, |
3349 HttpsProxySpdyConnectHttpsLoadTimingTwoRequestsTwoServers) { | 3369 HttpsProxySpdyConnectHttpsLoadTimingTwoRequestsTwoServers) { |
3350 // Configure against https proxy server "proxy:70". | 3370 // Configure against https proxy server "proxy:70". |
3351 session_deps_.proxy_service.reset(ProxyService::CreateFixed( | 3371 session_deps_.proxy_service.reset( |
3352 "https://proxy:70")); | 3372 ProxyService::CreateFixed("https://proxy:70")); |
3353 CapturingBoundNetLog log; | 3373 CapturingBoundNetLog log; |
3354 session_deps_.net_log = log.bound().net_log(); | 3374 session_deps_.net_log = log.bound().net_log(); |
3355 scoped_refptr<HttpNetworkSession> session( | 3375 scoped_refptr<HttpNetworkSession> session( |
3356 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_)); | 3376 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_)); |
3357 | 3377 |
3358 HttpRequestInfo request1; | 3378 HttpRequestInfo request1; |
3359 request1.method = "GET"; | 3379 request1.method = "GET"; |
3360 request1.url = GURL("https://www.google.com/"); | 3380 request1.url = GURL("https://www.google.com/"); |
3361 request1.load_flags = 0; | 3381 request1.load_flags = 0; |
3362 | 3382 |
3363 HttpRequestInfo request2; | 3383 HttpRequestInfo request2; |
3364 request2.method = "GET"; | 3384 request2.method = "GET"; |
3365 request2.url = GURL("https://news.google.com/"); | 3385 request2.url = GURL("https://news.google.com/"); |
3366 request2.load_flags = 0; | 3386 request2.load_flags = 0; |
3367 | 3387 |
3368 // CONNECT to www.google.com:443 via SPDY. | 3388 // CONNECT to www.google.com:443 via SPDY. |
3369 scoped_ptr<SpdyFrame> connect1(spdy_util_.ConstructSpdyConnect(NULL, 0, 1, | 3389 scoped_ptr<SpdyFrame> connect1( |
3370 LOWEST)); | 3390 spdy_util_.ConstructSpdyConnect(NULL, 0, 1, LOWEST)); |
3371 scoped_ptr<SpdyFrame> conn_resp1( | 3391 scoped_ptr<SpdyFrame> conn_resp1( |
3372 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 3392 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
3373 | 3393 |
3374 // Fetch https://www.google.com/ via HTTP. | 3394 // Fetch https://www.google.com/ via HTTP. |
3375 const char get1[] = "GET / HTTP/1.1\r\n" | 3395 const char get1[] = |
| 3396 "GET / HTTP/1.1\r\n" |
3376 "Host: www.google.com\r\n" | 3397 "Host: www.google.com\r\n" |
3377 "Connection: keep-alive\r\n\r\n"; | 3398 "Connection: keep-alive\r\n\r\n"; |
3378 scoped_ptr<SpdyFrame> wrapped_get1( | 3399 scoped_ptr<SpdyFrame> wrapped_get1( |
3379 spdy_util_.ConstructSpdyBodyFrame(1, get1, strlen(get1), false)); | 3400 spdy_util_.ConstructSpdyBodyFrame(1, get1, strlen(get1), false)); |
3380 const char resp1[] = "HTTP/1.1 200 OK\r\n" | 3401 const char resp1[] = |
| 3402 "HTTP/1.1 200 OK\r\n" |
3381 "Content-Length: 1\r\n\r\n"; | 3403 "Content-Length: 1\r\n\r\n"; |
3382 scoped_ptr<SpdyFrame> wrapped_get_resp1( | 3404 scoped_ptr<SpdyFrame> wrapped_get_resp1( |
3383 spdy_util_.ConstructSpdyBodyFrame(1, resp1, strlen(resp1), false)); | 3405 spdy_util_.ConstructSpdyBodyFrame(1, resp1, strlen(resp1), false)); |
3384 scoped_ptr<SpdyFrame> wrapped_body1( | 3406 scoped_ptr<SpdyFrame> wrapped_body1( |
3385 spdy_util_.ConstructSpdyBodyFrame(1, "1", 1, false)); | 3407 spdy_util_.ConstructSpdyBodyFrame(1, "1", 1, false)); |
3386 scoped_ptr<SpdyFrame> window_update( | 3408 scoped_ptr<SpdyFrame> window_update( |
3387 spdy_util_.ConstructSpdyWindowUpdate(1, wrapped_get_resp1->size())); | 3409 spdy_util_.ConstructSpdyWindowUpdate(1, wrapped_get_resp1->size())); |
3388 | 3410 |
3389 // CONNECT to news.google.com:443 via SPDY. | 3411 // CONNECT to news.google.com:443 via SPDY. |
3390 SpdySynStreamIR connect2_ir(3); | 3412 SpdySynStreamIR connect2_ir(3); |
3391 spdy_util_.SetPriority(LOWEST, &connect2_ir); | 3413 spdy_util_.SetPriority(LOWEST, &connect2_ir); |
3392 connect2_ir.SetHeader(spdy_util_.GetMethodKey(), "CONNECT"); | 3414 connect2_ir.SetHeader(spdy_util_.GetMethodKey(), "CONNECT"); |
3393 connect2_ir.SetHeader(spdy_util_.GetPathKey(), "news.google.com:443"); | 3415 connect2_ir.SetHeader(spdy_util_.GetPathKey(), "news.google.com:443"); |
3394 connect2_ir.SetHeader(spdy_util_.GetHostKey(), "news.google.com"); | 3416 connect2_ir.SetHeader(spdy_util_.GetHostKey(), "news.google.com"); |
3395 spdy_util_.MaybeAddVersionHeader(&connect2_ir); | 3417 spdy_util_.MaybeAddVersionHeader(&connect2_ir); |
3396 scoped_ptr<SpdyFrame> connect2( | 3418 scoped_ptr<SpdyFrame> connect2( |
3397 spdy_util_.CreateFramer(false)->SerializeFrame(connect2_ir)); | 3419 spdy_util_.CreateFramer(false)->SerializeFrame(connect2_ir)); |
3398 | 3420 |
3399 scoped_ptr<SpdyFrame> conn_resp2( | 3421 scoped_ptr<SpdyFrame> conn_resp2( |
3400 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); | 3422 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); |
3401 | 3423 |
3402 // Fetch https://news.google.com/ via HTTP. | 3424 // Fetch https://news.google.com/ via HTTP. |
3403 const char get2[] = "GET / HTTP/1.1\r\n" | 3425 const char get2[] = |
| 3426 "GET / HTTP/1.1\r\n" |
3404 "Host: news.google.com\r\n" | 3427 "Host: news.google.com\r\n" |
3405 "Connection: keep-alive\r\n\r\n"; | 3428 "Connection: keep-alive\r\n\r\n"; |
3406 scoped_ptr<SpdyFrame> wrapped_get2( | 3429 scoped_ptr<SpdyFrame> wrapped_get2( |
3407 spdy_util_.ConstructSpdyBodyFrame(3, get2, strlen(get2), false)); | 3430 spdy_util_.ConstructSpdyBodyFrame(3, get2, strlen(get2), false)); |
3408 const char resp2[] = "HTTP/1.1 200 OK\r\n" | 3431 const char resp2[] = |
| 3432 "HTTP/1.1 200 OK\r\n" |
3409 "Content-Length: 2\r\n\r\n"; | 3433 "Content-Length: 2\r\n\r\n"; |
3410 scoped_ptr<SpdyFrame> wrapped_get_resp2( | 3434 scoped_ptr<SpdyFrame> wrapped_get_resp2( |
3411 spdy_util_.ConstructSpdyBodyFrame(3, resp2, strlen(resp2), false)); | 3435 spdy_util_.ConstructSpdyBodyFrame(3, resp2, strlen(resp2), false)); |
3412 scoped_ptr<SpdyFrame> wrapped_body2( | 3436 scoped_ptr<SpdyFrame> wrapped_body2( |
3413 spdy_util_.ConstructSpdyBodyFrame(3, "22", 2, false)); | 3437 spdy_util_.ConstructSpdyBodyFrame(3, "22", 2, false)); |
3414 | 3438 |
3415 MockWrite spdy_writes[] = { | 3439 MockWrite spdy_writes[] = { |
3416 CreateMockWrite(*connect1, 0), | 3440 CreateMockWrite(*connect1, 0), CreateMockWrite(*wrapped_get1, 2), |
3417 CreateMockWrite(*wrapped_get1, 2), | 3441 CreateMockWrite(*connect2, 5), CreateMockWrite(*wrapped_get2, 7), |
3418 CreateMockWrite(*connect2, 5), | |
3419 CreateMockWrite(*wrapped_get2, 7), | |
3420 }; | 3442 }; |
3421 | 3443 |
3422 MockRead spdy_reads[] = { | 3444 MockRead spdy_reads[] = { |
3423 CreateMockRead(*conn_resp1, 1, ASYNC), | 3445 CreateMockRead(*conn_resp1, 1, ASYNC), |
3424 CreateMockRead(*wrapped_get_resp1, 3, ASYNC), | 3446 CreateMockRead(*wrapped_get_resp1, 3, ASYNC), |
3425 CreateMockRead(*wrapped_body1, 4, ASYNC), | 3447 CreateMockRead(*wrapped_body1, 4, ASYNC), |
3426 CreateMockRead(*conn_resp2, 6, ASYNC), | 3448 CreateMockRead(*conn_resp2, 6, ASYNC), |
3427 CreateMockRead(*wrapped_get_resp2, 8, ASYNC), | 3449 CreateMockRead(*wrapped_get_resp2, 8, ASYNC), |
3428 CreateMockRead(*wrapped_body2, 9, ASYNC), | 3450 CreateMockRead(*wrapped_body2, 9, ASYNC), |
3429 MockRead(ASYNC, 0, 10), | 3451 MockRead(ASYNC, 0, 10), |
3430 }; | 3452 }; |
3431 | 3453 |
3432 DeterministicSocketData spdy_data( | 3454 DeterministicSocketData spdy_data( |
3433 spdy_reads, arraysize(spdy_reads), | 3455 spdy_reads, arraysize(spdy_reads), spdy_writes, arraysize(spdy_writes)); |
3434 spdy_writes, arraysize(spdy_writes)); | |
3435 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&spdy_data); | 3456 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&spdy_data); |
3436 | 3457 |
3437 SSLSocketDataProvider ssl(ASYNC, OK); | 3458 SSLSocketDataProvider ssl(ASYNC, OK); |
3438 ssl.SetNextProto(GetParam()); | 3459 ssl.SetNextProto(GetParam()); |
3439 session_deps_.deterministic_socket_factory->AddSSLSocketDataProvider(&ssl); | 3460 session_deps_.deterministic_socket_factory->AddSSLSocketDataProvider(&ssl); |
3440 SSLSocketDataProvider ssl2(ASYNC, OK); | 3461 SSLSocketDataProvider ssl2(ASYNC, OK); |
3441 ssl2.was_npn_negotiated = false; | 3462 ssl2.was_npn_negotiated = false; |
3442 ssl2.protocol_negotiated = kProtoUnknown; | 3463 ssl2.protocol_negotiated = kProtoUnknown; |
3443 session_deps_.deterministic_socket_factory->AddSSLSocketDataProvider(&ssl2); | 3464 session_deps_.deterministic_socket_factory->AddSSLSocketDataProvider(&ssl2); |
3444 SSLSocketDataProvider ssl3(ASYNC, OK); | 3465 SSLSocketDataProvider ssl3(ASYNC, OK); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3492 EXPECT_NE(load_timing_info.socket_log_id, load_timing_info2.socket_log_id); | 3513 EXPECT_NE(load_timing_info.socket_log_id, load_timing_info2.socket_log_id); |
3493 | 3514 |
3494 EXPECT_EQ(2, trans2->Read(buf.get(), 256, callback.callback())); | 3515 EXPECT_EQ(2, trans2->Read(buf.get(), 256, callback.callback())); |
3495 } | 3516 } |
3496 | 3517 |
3497 // Test load timing in the case of two HTTPS (non-SPDY) requests through a SPDY | 3518 // Test load timing in the case of two HTTPS (non-SPDY) requests through a SPDY |
3498 // HTTPS Proxy to the same server. | 3519 // HTTPS Proxy to the same server. |
3499 TEST_P(HttpNetworkTransactionTest, | 3520 TEST_P(HttpNetworkTransactionTest, |
3500 HttpsProxySpdyConnectHttpsLoadTimingTwoRequestsSameServer) { | 3521 HttpsProxySpdyConnectHttpsLoadTimingTwoRequestsSameServer) { |
3501 // Configure against https proxy server "proxy:70". | 3522 // Configure against https proxy server "proxy:70". |
3502 session_deps_.proxy_service.reset(ProxyService::CreateFixed( | 3523 session_deps_.proxy_service.reset( |
3503 "https://proxy:70")); | 3524 ProxyService::CreateFixed("https://proxy:70")); |
3504 CapturingBoundNetLog log; | 3525 CapturingBoundNetLog log; |
3505 session_deps_.net_log = log.bound().net_log(); | 3526 session_deps_.net_log = log.bound().net_log(); |
3506 scoped_refptr<HttpNetworkSession> session( | 3527 scoped_refptr<HttpNetworkSession> session( |
3507 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_)); | 3528 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_)); |
3508 | 3529 |
3509 HttpRequestInfo request1; | 3530 HttpRequestInfo request1; |
3510 request1.method = "GET"; | 3531 request1.method = "GET"; |
3511 request1.url = GURL("https://www.google.com/"); | 3532 request1.url = GURL("https://www.google.com/"); |
3512 request1.load_flags = 0; | 3533 request1.load_flags = 0; |
3513 | 3534 |
3514 HttpRequestInfo request2; | 3535 HttpRequestInfo request2; |
3515 request2.method = "GET"; | 3536 request2.method = "GET"; |
3516 request2.url = GURL("https://www.google.com/2"); | 3537 request2.url = GURL("https://www.google.com/2"); |
3517 request2.load_flags = 0; | 3538 request2.load_flags = 0; |
3518 | 3539 |
3519 // CONNECT to www.google.com:443 via SPDY. | 3540 // CONNECT to www.google.com:443 via SPDY. |
3520 scoped_ptr<SpdyFrame> connect1(spdy_util_.ConstructSpdyConnect(NULL, 0, 1, | 3541 scoped_ptr<SpdyFrame> connect1( |
3521 LOWEST)); | 3542 spdy_util_.ConstructSpdyConnect(NULL, 0, 1, LOWEST)); |
3522 scoped_ptr<SpdyFrame> conn_resp1( | 3543 scoped_ptr<SpdyFrame> conn_resp1( |
3523 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 3544 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
3524 | 3545 |
3525 // Fetch https://www.google.com/ via HTTP. | 3546 // Fetch https://www.google.com/ via HTTP. |
3526 const char get1[] = "GET / HTTP/1.1\r\n" | 3547 const char get1[] = |
| 3548 "GET / HTTP/1.1\r\n" |
3527 "Host: www.google.com\r\n" | 3549 "Host: www.google.com\r\n" |
3528 "Connection: keep-alive\r\n\r\n"; | 3550 "Connection: keep-alive\r\n\r\n"; |
3529 scoped_ptr<SpdyFrame> wrapped_get1( | 3551 scoped_ptr<SpdyFrame> wrapped_get1( |
3530 spdy_util_.ConstructSpdyBodyFrame(1, get1, strlen(get1), false)); | 3552 spdy_util_.ConstructSpdyBodyFrame(1, get1, strlen(get1), false)); |
3531 const char resp1[] = "HTTP/1.1 200 OK\r\n" | 3553 const char resp1[] = |
| 3554 "HTTP/1.1 200 OK\r\n" |
3532 "Content-Length: 1\r\n\r\n"; | 3555 "Content-Length: 1\r\n\r\n"; |
3533 scoped_ptr<SpdyFrame> wrapped_get_resp1( | 3556 scoped_ptr<SpdyFrame> wrapped_get_resp1( |
3534 spdy_util_.ConstructSpdyBodyFrame(1, resp1, strlen(resp1), false)); | 3557 spdy_util_.ConstructSpdyBodyFrame(1, resp1, strlen(resp1), false)); |
3535 scoped_ptr<SpdyFrame> wrapped_body1( | 3558 scoped_ptr<SpdyFrame> wrapped_body1( |
3536 spdy_util_.ConstructSpdyBodyFrame(1, "1", 1, false)); | 3559 spdy_util_.ConstructSpdyBodyFrame(1, "1", 1, false)); |
3537 scoped_ptr<SpdyFrame> window_update( | 3560 scoped_ptr<SpdyFrame> window_update( |
3538 spdy_util_.ConstructSpdyWindowUpdate(1, wrapped_get_resp1->size())); | 3561 spdy_util_.ConstructSpdyWindowUpdate(1, wrapped_get_resp1->size())); |
3539 | 3562 |
3540 // Fetch https://www.google.com/2 via HTTP. | 3563 // Fetch https://www.google.com/2 via HTTP. |
3541 const char get2[] = "GET /2 HTTP/1.1\r\n" | 3564 const char get2[] = |
| 3565 "GET /2 HTTP/1.1\r\n" |
3542 "Host: www.google.com\r\n" | 3566 "Host: www.google.com\r\n" |
3543 "Connection: keep-alive\r\n\r\n"; | 3567 "Connection: keep-alive\r\n\r\n"; |
3544 scoped_ptr<SpdyFrame> wrapped_get2( | 3568 scoped_ptr<SpdyFrame> wrapped_get2( |
3545 spdy_util_.ConstructSpdyBodyFrame(1, get2, strlen(get2), false)); | 3569 spdy_util_.ConstructSpdyBodyFrame(1, get2, strlen(get2), false)); |
3546 const char resp2[] = "HTTP/1.1 200 OK\r\n" | 3570 const char resp2[] = |
| 3571 "HTTP/1.1 200 OK\r\n" |
3547 "Content-Length: 2\r\n\r\n"; | 3572 "Content-Length: 2\r\n\r\n"; |
3548 scoped_ptr<SpdyFrame> wrapped_get_resp2( | 3573 scoped_ptr<SpdyFrame> wrapped_get_resp2( |
3549 spdy_util_.ConstructSpdyBodyFrame(1, resp2, strlen(resp2), false)); | 3574 spdy_util_.ConstructSpdyBodyFrame(1, resp2, strlen(resp2), false)); |
3550 scoped_ptr<SpdyFrame> wrapped_body2( | 3575 scoped_ptr<SpdyFrame> wrapped_body2( |
3551 spdy_util_.ConstructSpdyBodyFrame(1, "22", 2, false)); | 3576 spdy_util_.ConstructSpdyBodyFrame(1, "22", 2, false)); |
3552 | 3577 |
3553 MockWrite spdy_writes[] = { | 3578 MockWrite spdy_writes[] = { |
3554 CreateMockWrite(*connect1, 0), | 3579 CreateMockWrite(*connect1, 0), CreateMockWrite(*wrapped_get1, 2), |
3555 CreateMockWrite(*wrapped_get1, 2), | |
3556 CreateMockWrite(*wrapped_get2, 5), | 3580 CreateMockWrite(*wrapped_get2, 5), |
3557 }; | 3581 }; |
3558 | 3582 |
3559 MockRead spdy_reads[] = { | 3583 MockRead spdy_reads[] = { |
3560 CreateMockRead(*conn_resp1, 1, ASYNC), | 3584 CreateMockRead(*conn_resp1, 1, ASYNC), |
3561 CreateMockRead(*wrapped_get_resp1, 3, ASYNC), | 3585 CreateMockRead(*wrapped_get_resp1, 3, ASYNC), |
3562 CreateMockRead(*wrapped_body1, 4, ASYNC), | 3586 CreateMockRead(*wrapped_body1, 4, ASYNC), |
3563 CreateMockRead(*wrapped_get_resp2, 6, ASYNC), | 3587 CreateMockRead(*wrapped_get_resp2, 6, ASYNC), |
3564 CreateMockRead(*wrapped_body2, 7, ASYNC), | 3588 CreateMockRead(*wrapped_body2, 7, ASYNC), |
3565 MockRead(ASYNC, 0, 8), | 3589 MockRead(ASYNC, 0, 8), |
3566 }; | 3590 }; |
3567 | 3591 |
3568 DeterministicSocketData spdy_data( | 3592 DeterministicSocketData spdy_data( |
3569 spdy_reads, arraysize(spdy_reads), | 3593 spdy_reads, arraysize(spdy_reads), spdy_writes, arraysize(spdy_writes)); |
3570 spdy_writes, arraysize(spdy_writes)); | |
3571 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&spdy_data); | 3594 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&spdy_data); |
3572 | 3595 |
3573 SSLSocketDataProvider ssl(ASYNC, OK); | 3596 SSLSocketDataProvider ssl(ASYNC, OK); |
3574 ssl.SetNextProto(GetParam()); | 3597 ssl.SetNextProto(GetParam()); |
3575 session_deps_.deterministic_socket_factory->AddSSLSocketDataProvider(&ssl); | 3598 session_deps_.deterministic_socket_factory->AddSSLSocketDataProvider(&ssl); |
3576 SSLSocketDataProvider ssl2(ASYNC, OK); | 3599 SSLSocketDataProvider ssl2(ASYNC, OK); |
3577 ssl2.was_npn_negotiated = false; | 3600 ssl2.was_npn_negotiated = false; |
3578 ssl2.protocol_negotiated = kProtoUnknown; | 3601 ssl2.protocol_negotiated = kProtoUnknown; |
3579 session_deps_.deterministic_socket_factory->AddSSLSocketDataProvider(&ssl2); | 3602 session_deps_.deterministic_socket_factory->AddSSLSocketDataProvider(&ssl2); |
3580 | 3603 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3620 TestLoadTimingReused(load_timing_info2); | 3643 TestLoadTimingReused(load_timing_info2); |
3621 | 3644 |
3622 // The requests should have the same ID. | 3645 // The requests should have the same ID. |
3623 EXPECT_EQ(load_timing_info.socket_log_id, load_timing_info2.socket_log_id); | 3646 EXPECT_EQ(load_timing_info.socket_log_id, load_timing_info2.socket_log_id); |
3624 | 3647 |
3625 EXPECT_EQ(2, trans2->Read(buf.get(), 256, callback.callback())); | 3648 EXPECT_EQ(2, trans2->Read(buf.get(), 256, callback.callback())); |
3626 } | 3649 } |
3627 | 3650 |
3628 // Test load timing in the case of of two HTTP requests through a SPDY HTTPS | 3651 // Test load timing in the case of of two HTTP requests through a SPDY HTTPS |
3629 // Proxy to different servers. | 3652 // Proxy to different servers. |
3630 TEST_P(HttpNetworkTransactionTest, | 3653 TEST_P(HttpNetworkTransactionTest, HttpsProxySpdyLoadTimingTwoHttpRequests) { |
3631 HttpsProxySpdyLoadTimingTwoHttpRequests) { | |
3632 // Configure against https proxy server "proxy:70". | 3654 // Configure against https proxy server "proxy:70". |
3633 session_deps_.proxy_service.reset(ProxyService::CreateFixed( | 3655 session_deps_.proxy_service.reset( |
3634 "https://proxy:70")); | 3656 ProxyService::CreateFixed("https://proxy:70")); |
3635 CapturingBoundNetLog log; | 3657 CapturingBoundNetLog log; |
3636 session_deps_.net_log = log.bound().net_log(); | 3658 session_deps_.net_log = log.bound().net_log(); |
3637 scoped_refptr<HttpNetworkSession> session( | 3659 scoped_refptr<HttpNetworkSession> session( |
3638 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_)); | 3660 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_)); |
3639 | 3661 |
3640 HttpRequestInfo request1; | 3662 HttpRequestInfo request1; |
3641 request1.method = "GET"; | 3663 request1.method = "GET"; |
3642 request1.url = GURL("http://www.google.com/"); | 3664 request1.url = GURL("http://www.google.com/"); |
3643 request1.load_flags = 0; | 3665 request1.load_flags = 0; |
3644 | 3666 |
(...skipping 16 matching lines...) Expand all Loading... |
3661 scoped_ptr<SpdyHeaderBlock> headers2( | 3683 scoped_ptr<SpdyHeaderBlock> headers2( |
3662 spdy_util_.ConstructGetHeaderBlockForProxy("http://news.google.com/")); | 3684 spdy_util_.ConstructGetHeaderBlockForProxy("http://news.google.com/")); |
3663 scoped_ptr<SpdyFrame> get2(spdy_util_.ConstructSpdyControlFrame( | 3685 scoped_ptr<SpdyFrame> get2(spdy_util_.ConstructSpdyControlFrame( |
3664 headers2.Pass(), false, 3, LOWEST, SYN_STREAM, CONTROL_FLAG_FIN, 0)); | 3686 headers2.Pass(), false, 3, LOWEST, SYN_STREAM, CONTROL_FLAG_FIN, 0)); |
3665 scoped_ptr<SpdyFrame> get_resp2( | 3687 scoped_ptr<SpdyFrame> get_resp2( |
3666 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); | 3688 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); |
3667 scoped_ptr<SpdyFrame> body2( | 3689 scoped_ptr<SpdyFrame> body2( |
3668 spdy_util_.ConstructSpdyBodyFrame(3, "22", 2, true)); | 3690 spdy_util_.ConstructSpdyBodyFrame(3, "22", 2, true)); |
3669 | 3691 |
3670 MockWrite spdy_writes[] = { | 3692 MockWrite spdy_writes[] = { |
3671 CreateMockWrite(*get1, 0), | 3693 CreateMockWrite(*get1, 0), CreateMockWrite(*get2, 3), |
3672 CreateMockWrite(*get2, 3), | |
3673 }; | 3694 }; |
3674 | 3695 |
3675 MockRead spdy_reads[] = { | 3696 MockRead spdy_reads[] = { |
3676 CreateMockRead(*get_resp1, 1, ASYNC), | 3697 CreateMockRead(*get_resp1, 1, ASYNC), CreateMockRead(*body1, 2, ASYNC), |
3677 CreateMockRead(*body1, 2, ASYNC), | 3698 CreateMockRead(*get_resp2, 4, ASYNC), CreateMockRead(*body2, 5, ASYNC), |
3678 CreateMockRead(*get_resp2, 4, ASYNC), | 3699 MockRead(ASYNC, 0, 6), |
3679 CreateMockRead(*body2, 5, ASYNC), | |
3680 MockRead(ASYNC, 0, 6), | |
3681 }; | 3700 }; |
3682 | 3701 |
3683 DeterministicSocketData spdy_data( | 3702 DeterministicSocketData spdy_data( |
3684 spdy_reads, arraysize(spdy_reads), | 3703 spdy_reads, arraysize(spdy_reads), spdy_writes, arraysize(spdy_writes)); |
3685 spdy_writes, arraysize(spdy_writes)); | |
3686 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&spdy_data); | 3704 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&spdy_data); |
3687 | 3705 |
3688 SSLSocketDataProvider ssl(ASYNC, OK); | 3706 SSLSocketDataProvider ssl(ASYNC, OK); |
3689 ssl.SetNextProto(GetParam()); | 3707 ssl.SetNextProto(GetParam()); |
3690 session_deps_.deterministic_socket_factory->AddSSLSocketDataProvider(&ssl); | 3708 session_deps_.deterministic_socket_factory->AddSSLSocketDataProvider(&ssl); |
3691 | 3709 |
3692 TestCompletionCallback callback; | 3710 TestCompletionCallback callback; |
3693 | 3711 |
3694 scoped_ptr<HttpTransaction> trans( | 3712 scoped_ptr<HttpTransaction> trans( |
3695 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 3713 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3749 | 3767 |
3750 // Configure against https proxy server "myproxy:70". | 3768 // Configure against https proxy server "myproxy:70". |
3751 session_deps_.proxy_service.reset( | 3769 session_deps_.proxy_service.reset( |
3752 ProxyService::CreateFixed("https://myproxy:70")); | 3770 ProxyService::CreateFixed("https://myproxy:70")); |
3753 CapturingBoundNetLog log; | 3771 CapturingBoundNetLog log; |
3754 session_deps_.net_log = log.bound().net_log(); | 3772 session_deps_.net_log = log.bound().net_log(); |
3755 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 3773 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
3756 | 3774 |
3757 // Since we have proxy, should use full url | 3775 // Since we have proxy, should use full url |
3758 MockWrite data_writes1[] = { | 3776 MockWrite data_writes1[] = { |
3759 MockWrite("GET http://www.google.com/ HTTP/1.1\r\n" | 3777 MockWrite( |
3760 "Host: www.google.com\r\n" | 3778 "GET http://www.google.com/ HTTP/1.1\r\n" |
3761 "Proxy-Connection: keep-alive\r\n\r\n"), | 3779 "Host: www.google.com\r\n" |
| 3780 "Proxy-Connection: keep-alive\r\n\r\n"), |
3762 | 3781 |
3763 // After calling trans->RestartWithAuth(), this is the request we should | 3782 // After calling trans->RestartWithAuth(), this is the request we should |
3764 // be issuing -- the final header line contains the credentials. | 3783 // be issuing -- the final header line contains the credentials. |
3765 MockWrite("GET http://www.google.com/ HTTP/1.1\r\n" | 3784 MockWrite( |
3766 "Host: www.google.com\r\n" | 3785 "GET http://www.google.com/ HTTP/1.1\r\n" |
3767 "Proxy-Connection: keep-alive\r\n" | 3786 "Host: www.google.com\r\n" |
3768 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 3787 "Proxy-Connection: keep-alive\r\n" |
| 3788 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
3769 }; | 3789 }; |
3770 | 3790 |
3771 // The proxy responds to the GET with a 407, using a persistent | 3791 // The proxy responds to the GET with a 407, using a persistent |
3772 // connection. | 3792 // connection. |
3773 MockRead data_reads1[] = { | 3793 MockRead data_reads1[] = { |
3774 // No credentials. | 3794 // No credentials. |
3775 MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"), | 3795 MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"), |
3776 MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | 3796 MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
3777 MockRead("Proxy-Connection: keep-alive\r\n"), | 3797 MockRead("Proxy-Connection: keep-alive\r\n"), |
3778 MockRead("Content-Length: 0\r\n\r\n"), | 3798 MockRead("Content-Length: 0\r\n\r\n"), |
3779 | 3799 MockRead("HTTP/1.1 200 OK\r\n"), |
3780 MockRead("HTTP/1.1 200 OK\r\n"), | 3800 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
3781 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 3801 MockRead("Content-Length: 100\r\n\r\n"), |
3782 MockRead("Content-Length: 100\r\n\r\n"), | 3802 MockRead(SYNCHRONOUS, OK), |
3783 MockRead(SYNCHRONOUS, OK), | |
3784 }; | 3803 }; |
3785 | 3804 |
3786 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 3805 StaticSocketDataProvider data1(data_reads1, |
3787 data_writes1, arraysize(data_writes1)); | 3806 arraysize(data_reads1), |
| 3807 data_writes1, |
| 3808 arraysize(data_writes1)); |
3788 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 3809 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
3789 SSLSocketDataProvider ssl(ASYNC, OK); | 3810 SSLSocketDataProvider ssl(ASYNC, OK); |
3790 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 3811 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
3791 | 3812 |
3792 TestCompletionCallback callback1; | 3813 TestCompletionCallback callback1; |
3793 | 3814 |
3794 scoped_ptr<HttpTransaction> trans( | 3815 scoped_ptr<HttpTransaction> trans( |
3795 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 3816 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
3796 | 3817 |
3797 int rv = trans->Start(&request, callback1.callback(), log.bound()); | 3818 int rv = trans->Start(&request, callback1.callback(), log.bound()); |
3798 EXPECT_EQ(ERR_IO_PENDING, rv); | 3819 EXPECT_EQ(ERR_IO_PENDING, rv); |
3799 | 3820 |
3800 rv = callback1.WaitForResult(); | 3821 rv = callback1.WaitForResult(); |
3801 EXPECT_EQ(OK, rv); | 3822 EXPECT_EQ(OK, rv); |
3802 | 3823 |
3803 LoadTimingInfo load_timing_info; | 3824 LoadTimingInfo load_timing_info; |
3804 EXPECT_TRUE(trans->GetLoadTimingInfo(&load_timing_info)); | 3825 EXPECT_TRUE(trans->GetLoadTimingInfo(&load_timing_info)); |
3805 TestLoadTimingNotReused(load_timing_info, | 3826 TestLoadTimingNotReused(load_timing_info, |
3806 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY); | 3827 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY); |
3807 | 3828 |
3808 const HttpResponseInfo* response = trans->GetResponseInfo(); | 3829 const HttpResponseInfo* response = trans->GetResponseInfo(); |
3809 ASSERT_TRUE(response != NULL); | 3830 ASSERT_TRUE(response != NULL); |
3810 ASSERT_FALSE(response->headers.get() == NULL); | 3831 ASSERT_FALSE(response->headers.get() == NULL); |
3811 EXPECT_EQ(407, response->headers->response_code()); | 3832 EXPECT_EQ(407, response->headers->response_code()); |
3812 EXPECT_TRUE(HttpVersion(1, 1) == response->headers->GetHttpVersion()); | 3833 EXPECT_TRUE(HttpVersion(1, 1) == response->headers->GetHttpVersion()); |
3813 EXPECT_TRUE(CheckBasicProxyAuth(response->auth_challenge.get())); | 3834 EXPECT_TRUE(CheckBasicProxyAuth(response->auth_challenge.get())); |
3814 | 3835 |
3815 TestCompletionCallback callback2; | 3836 TestCompletionCallback callback2; |
3816 | 3837 |
3817 rv = trans->RestartWithAuth( | 3838 rv = |
3818 AuthCredentials(kFoo, kBar), callback2.callback()); | 3839 trans->RestartWithAuth(AuthCredentials(kFoo, kBar), callback2.callback()); |
3819 EXPECT_EQ(ERR_IO_PENDING, rv); | 3840 EXPECT_EQ(ERR_IO_PENDING, rv); |
3820 | 3841 |
3821 rv = callback2.WaitForResult(); | 3842 rv = callback2.WaitForResult(); |
3822 EXPECT_EQ(OK, rv); | 3843 EXPECT_EQ(OK, rv); |
3823 | 3844 |
3824 load_timing_info = LoadTimingInfo(); | 3845 load_timing_info = LoadTimingInfo(); |
3825 EXPECT_TRUE(trans->GetLoadTimingInfo(&load_timing_info)); | 3846 EXPECT_TRUE(trans->GetLoadTimingInfo(&load_timing_info)); |
3826 // Retrying with HTTP AUTH is considered to be reusing a socket. | 3847 // Retrying with HTTP AUTH is considered to be reusing a socket. |
3827 TestLoadTimingReused(load_timing_info); | 3848 TestLoadTimingReused(load_timing_info); |
3828 | 3849 |
3829 response = trans->GetResponseInfo(); | 3850 response = trans->GetResponseInfo(); |
3830 ASSERT_TRUE(response != NULL); | 3851 ASSERT_TRUE(response != NULL); |
3831 | 3852 |
3832 EXPECT_TRUE(response->headers->IsKeepAlive()); | 3853 EXPECT_TRUE(response->headers->IsKeepAlive()); |
3833 EXPECT_EQ(200, response->headers->response_code()); | 3854 EXPECT_EQ(200, response->headers->response_code()); |
3834 EXPECT_EQ(100, response->headers->GetContentLength()); | 3855 EXPECT_EQ(100, response->headers->GetContentLength()); |
3835 EXPECT_TRUE(HttpVersion(1, 1) == response->headers->GetHttpVersion()); | 3856 EXPECT_TRUE(HttpVersion(1, 1) == response->headers->GetHttpVersion()); |
3836 | 3857 |
3837 // The password prompt info should not be set. | 3858 // The password prompt info should not be set. |
3838 EXPECT_TRUE(response->auth_challenge.get() == NULL); | 3859 EXPECT_TRUE(response->auth_challenge.get() == NULL); |
3839 } | 3860 } |
3840 | 3861 |
3841 void HttpNetworkTransactionTest::ConnectStatusHelperWithExpectedStatus( | 3862 void HttpNetworkTransactionTest::ConnectStatusHelperWithExpectedStatus( |
3842 const MockRead& status, int expected_status) { | 3863 const MockRead& status, |
| 3864 int expected_status) { |
3843 HttpRequestInfo request; | 3865 HttpRequestInfo request; |
3844 request.method = "GET"; | 3866 request.method = "GET"; |
3845 request.url = GURL("https://www.google.com/"); | 3867 request.url = GURL("https://www.google.com/"); |
3846 request.load_flags = 0; | 3868 request.load_flags = 0; |
3847 | 3869 |
3848 // Configure against proxy server "myproxy:70". | 3870 // Configure against proxy server "myproxy:70". |
3849 session_deps_.proxy_service.reset(ProxyService::CreateFixed("myproxy:70")); | 3871 session_deps_.proxy_service.reset(ProxyService::CreateFixed("myproxy:70")); |
3850 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 3872 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
3851 | 3873 |
3852 // Since we have proxy, should try to establish tunnel. | 3874 // Since we have proxy, should try to establish tunnel. |
3853 MockWrite data_writes[] = { | 3875 MockWrite data_writes[] = { |
3854 MockWrite("CONNECT www.google.com:443 HTTP/1.1\r\n" | 3876 MockWrite( |
3855 "Host: www.google.com\r\n" | 3877 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
3856 "Proxy-Connection: keep-alive\r\n\r\n"), | 3878 "Host: www.google.com\r\n" |
| 3879 "Proxy-Connection: keep-alive\r\n\r\n"), |
3857 }; | 3880 }; |
3858 | 3881 |
3859 MockRead data_reads[] = { | 3882 MockRead data_reads[] = { |
3860 status, | 3883 status, MockRead("Content-Length: 10\r\n\r\n"), |
3861 MockRead("Content-Length: 10\r\n\r\n"), | 3884 // No response body because the test stops reading here. |
3862 // No response body because the test stops reading here. | 3885 MockRead(SYNCHRONOUS, ERR_UNEXPECTED), // Should not be reached. |
3863 MockRead(SYNCHRONOUS, ERR_UNEXPECTED), // Should not be reached. | |
3864 }; | 3886 }; |
3865 | 3887 |
3866 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 3888 StaticSocketDataProvider data( |
3867 data_writes, arraysize(data_writes)); | 3889 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
3868 session_deps_.socket_factory->AddSocketDataProvider(&data); | 3890 session_deps_.socket_factory->AddSocketDataProvider(&data); |
3869 | 3891 |
3870 TestCompletionCallback callback; | 3892 TestCompletionCallback callback; |
3871 | 3893 |
3872 scoped_ptr<HttpTransaction> trans( | 3894 scoped_ptr<HttpTransaction> trans( |
3873 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 3895 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
3874 | 3896 |
3875 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 3897 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
3876 EXPECT_EQ(ERR_IO_PENDING, rv); | 3898 EXPECT_EQ(ERR_IO_PENDING, rv); |
3877 | 3899 |
3878 rv = callback.WaitForResult(); | 3900 rv = callback.WaitForResult(); |
3879 EXPECT_EQ(expected_status, rv); | 3901 EXPECT_EQ(expected_status, rv); |
3880 } | 3902 } |
3881 | 3903 |
3882 void HttpNetworkTransactionTest::ConnectStatusHelper( | 3904 void HttpNetworkTransactionTest::ConnectStatusHelper(const MockRead& status) { |
3883 const MockRead& status) { | 3905 ConnectStatusHelperWithExpectedStatus(status, ERR_TUNNEL_CONNECTION_FAILED); |
3884 ConnectStatusHelperWithExpectedStatus( | |
3885 status, ERR_TUNNEL_CONNECTION_FAILED); | |
3886 } | 3906 } |
3887 | 3907 |
3888 TEST_P(HttpNetworkTransactionTest, ConnectStatus100) { | 3908 TEST_P(HttpNetworkTransactionTest, ConnectStatus100) { |
3889 ConnectStatusHelper(MockRead("HTTP/1.1 100 Continue\r\n")); | 3909 ConnectStatusHelper(MockRead("HTTP/1.1 100 Continue\r\n")); |
3890 } | 3910 } |
3891 | 3911 |
3892 TEST_P(HttpNetworkTransactionTest, ConnectStatus101) { | 3912 TEST_P(HttpNetworkTransactionTest, ConnectStatus101) { |
3893 ConnectStatusHelper(MockRead("HTTP/1.1 101 Switching Protocols\r\n")); | 3913 ConnectStatusHelper(MockRead("HTTP/1.1 101 Switching Protocols\r\n")); |
3894 } | 3914 } |
3895 | 3915 |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4063 request.load_flags = 0; | 4083 request.load_flags = 0; |
4064 | 4084 |
4065 // Configure against proxy server "myproxy:70". | 4085 // Configure against proxy server "myproxy:70". |
4066 session_deps_.proxy_service.reset(ProxyService::CreateFixed("myproxy:70")); | 4086 session_deps_.proxy_service.reset(ProxyService::CreateFixed("myproxy:70")); |
4067 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 4087 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
4068 | 4088 |
4069 scoped_ptr<HttpTransaction> trans( | 4089 scoped_ptr<HttpTransaction> trans( |
4070 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 4090 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
4071 | 4091 |
4072 MockWrite data_writes1[] = { | 4092 MockWrite data_writes1[] = { |
4073 MockWrite("GET http://www.google.com/ HTTP/1.1\r\n" | 4093 MockWrite( |
4074 "Host: www.google.com\r\n" | 4094 "GET http://www.google.com/ HTTP/1.1\r\n" |
4075 "Proxy-Connection: keep-alive\r\n\r\n"), | 4095 "Host: www.google.com\r\n" |
| 4096 "Proxy-Connection: keep-alive\r\n\r\n"), |
4076 }; | 4097 }; |
4077 | 4098 |
4078 MockRead data_reads1[] = { | 4099 MockRead data_reads1[] = { |
4079 MockRead("HTTP/1.0 407 Unauthorized\r\n"), | 4100 MockRead("HTTP/1.0 407 Unauthorized\r\n"), |
4080 // Give a couple authenticate options (only the middle one is actually | 4101 // Give a couple authenticate options (only the middle one is actually |
4081 // supported). | 4102 // supported). |
4082 MockRead("Proxy-Authenticate: Basic invalid\r\n"), // Malformed. | 4103 MockRead("Proxy-Authenticate: Basic invalid\r\n"), // Malformed. |
4083 MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | 4104 MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
4084 MockRead("Proxy-Authenticate: UNSUPPORTED realm=\"FOO\"\r\n"), | 4105 MockRead("Proxy-Authenticate: UNSUPPORTED realm=\"FOO\"\r\n"), |
4085 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 4106 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
4086 // Large content-length -- won't matter, as connection will be reset. | 4107 // Large content-length -- won't matter, as connection will be reset. |
4087 MockRead("Content-Length: 10000\r\n\r\n"), | 4108 MockRead("Content-Length: 10000\r\n\r\n"), |
4088 MockRead(SYNCHRONOUS, ERR_FAILED), | 4109 MockRead(SYNCHRONOUS, ERR_FAILED), |
4089 }; | 4110 }; |
4090 | 4111 |
4091 // After calling trans->RestartWithAuth() the first time, this is the | 4112 // After calling trans->RestartWithAuth() the first time, this is the |
4092 // request we should be issuing -- the final header line contains the | 4113 // request we should be issuing -- the final header line contains the |
4093 // proxy's credentials. | 4114 // proxy's credentials. |
4094 MockWrite data_writes2[] = { | 4115 MockWrite data_writes2[] = { |
4095 MockWrite("GET http://www.google.com/ HTTP/1.1\r\n" | 4116 MockWrite( |
4096 "Host: www.google.com\r\n" | 4117 "GET http://www.google.com/ HTTP/1.1\r\n" |
4097 "Proxy-Connection: keep-alive\r\n" | 4118 "Host: www.google.com\r\n" |
4098 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 4119 "Proxy-Connection: keep-alive\r\n" |
| 4120 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
4099 }; | 4121 }; |
4100 | 4122 |
4101 // Now the proxy server lets the request pass through to origin server. | 4123 // Now the proxy server lets the request pass through to origin server. |
4102 // The origin server responds with a 401. | 4124 // The origin server responds with a 401. |
4103 MockRead data_reads2[] = { | 4125 MockRead data_reads2[] = { |
4104 MockRead("HTTP/1.0 401 Unauthorized\r\n"), | 4126 MockRead("HTTP/1.0 401 Unauthorized\r\n"), |
4105 // Note: We are using the same realm-name as the proxy server. This is | 4127 // Note: We are using the same realm-name as the proxy server. This is |
4106 // completely valid, as realms are unique across hosts. | 4128 // completely valid, as realms are unique across hosts. |
4107 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | 4129 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
4108 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 4130 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
4109 MockRead("Content-Length: 2000\r\n\r\n"), | 4131 MockRead("Content-Length: 2000\r\n\r\n"), |
4110 MockRead(SYNCHRONOUS, ERR_FAILED), // Won't be reached. | 4132 MockRead(SYNCHRONOUS, ERR_FAILED), // Won't be reached. |
4111 }; | 4133 }; |
4112 | 4134 |
4113 // After calling trans->RestartWithAuth() the second time, we should send | 4135 // After calling trans->RestartWithAuth() the second time, we should send |
4114 // the credentials for both the proxy and origin server. | 4136 // the credentials for both the proxy and origin server. |
4115 MockWrite data_writes3[] = { | 4137 MockWrite data_writes3[] = { |
4116 MockWrite("GET http://www.google.com/ HTTP/1.1\r\n" | 4138 MockWrite( |
4117 "Host: www.google.com\r\n" | 4139 "GET http://www.google.com/ HTTP/1.1\r\n" |
4118 "Proxy-Connection: keep-alive\r\n" | 4140 "Host: www.google.com\r\n" |
4119 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n" | 4141 "Proxy-Connection: keep-alive\r\n" |
4120 "Authorization: Basic Zm9vMjpiYXIy\r\n\r\n"), | 4142 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n" |
| 4143 "Authorization: Basic Zm9vMjpiYXIy\r\n\r\n"), |
4121 }; | 4144 }; |
4122 | 4145 |
4123 // Lastly we get the desired content. | 4146 // Lastly we get the desired content. |
4124 MockRead data_reads3[] = { | 4147 MockRead data_reads3[] = { |
4125 MockRead("HTTP/1.0 200 OK\r\n"), | 4148 MockRead("HTTP/1.0 200 OK\r\n"), |
4126 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 4149 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
4127 MockRead("Content-Length: 100\r\n\r\n"), | 4150 MockRead("Content-Length: 100\r\n\r\n"), MockRead(SYNCHRONOUS, OK), |
4128 MockRead(SYNCHRONOUS, OK), | |
4129 }; | 4151 }; |
4130 | 4152 |
4131 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 4153 StaticSocketDataProvider data1(data_reads1, |
4132 data_writes1, arraysize(data_writes1)); | 4154 arraysize(data_reads1), |
4133 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), | 4155 data_writes1, |
4134 data_writes2, arraysize(data_writes2)); | 4156 arraysize(data_writes1)); |
4135 StaticSocketDataProvider data3(data_reads3, arraysize(data_reads3), | 4157 StaticSocketDataProvider data2(data_reads2, |
4136 data_writes3, arraysize(data_writes3)); | 4158 arraysize(data_reads2), |
| 4159 data_writes2, |
| 4160 arraysize(data_writes2)); |
| 4161 StaticSocketDataProvider data3(data_reads3, |
| 4162 arraysize(data_reads3), |
| 4163 data_writes3, |
| 4164 arraysize(data_writes3)); |
4137 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 4165 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
4138 session_deps_.socket_factory->AddSocketDataProvider(&data2); | 4166 session_deps_.socket_factory->AddSocketDataProvider(&data2); |
4139 session_deps_.socket_factory->AddSocketDataProvider(&data3); | 4167 session_deps_.socket_factory->AddSocketDataProvider(&data3); |
4140 | 4168 |
4141 TestCompletionCallback callback1; | 4169 TestCompletionCallback callback1; |
4142 | 4170 |
4143 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); | 4171 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); |
4144 EXPECT_EQ(ERR_IO_PENDING, rv); | 4172 EXPECT_EQ(ERR_IO_PENDING, rv); |
4145 | 4173 |
4146 rv = callback1.WaitForResult(); | 4174 rv = callback1.WaitForResult(); |
4147 EXPECT_EQ(OK, rv); | 4175 EXPECT_EQ(OK, rv); |
4148 | 4176 |
4149 const HttpResponseInfo* response = trans->GetResponseInfo(); | 4177 const HttpResponseInfo* response = trans->GetResponseInfo(); |
4150 ASSERT_TRUE(response != NULL); | 4178 ASSERT_TRUE(response != NULL); |
4151 EXPECT_TRUE(CheckBasicProxyAuth(response->auth_challenge.get())); | 4179 EXPECT_TRUE(CheckBasicProxyAuth(response->auth_challenge.get())); |
4152 | 4180 |
4153 TestCompletionCallback callback2; | 4181 TestCompletionCallback callback2; |
4154 | 4182 |
4155 rv = trans->RestartWithAuth( | 4183 rv = |
4156 AuthCredentials(kFoo, kBar), callback2.callback()); | 4184 trans->RestartWithAuth(AuthCredentials(kFoo, kBar), callback2.callback()); |
4157 EXPECT_EQ(ERR_IO_PENDING, rv); | 4185 EXPECT_EQ(ERR_IO_PENDING, rv); |
4158 | 4186 |
4159 rv = callback2.WaitForResult(); | 4187 rv = callback2.WaitForResult(); |
4160 EXPECT_EQ(OK, rv); | 4188 EXPECT_EQ(OK, rv); |
4161 | 4189 |
4162 response = trans->GetResponseInfo(); | 4190 response = trans->GetResponseInfo(); |
4163 ASSERT_TRUE(response != NULL); | 4191 ASSERT_TRUE(response != NULL); |
4164 EXPECT_TRUE(CheckBasicServerAuth(response->auth_challenge.get())); | 4192 EXPECT_TRUE(CheckBasicServerAuth(response->auth_challenge.get())); |
4165 | 4193 |
4166 TestCompletionCallback callback3; | 4194 TestCompletionCallback callback3; |
4167 | 4195 |
4168 rv = trans->RestartWithAuth( | 4196 rv = trans->RestartWithAuth(AuthCredentials(kFoo2, kBar2), |
4169 AuthCredentials(kFoo2, kBar2), callback3.callback()); | 4197 callback3.callback()); |
4170 EXPECT_EQ(ERR_IO_PENDING, rv); | 4198 EXPECT_EQ(ERR_IO_PENDING, rv); |
4171 | 4199 |
4172 rv = callback3.WaitForResult(); | 4200 rv = callback3.WaitForResult(); |
4173 EXPECT_EQ(OK, rv); | 4201 EXPECT_EQ(OK, rv); |
4174 | 4202 |
4175 response = trans->GetResponseInfo(); | 4203 response = trans->GetResponseInfo(); |
4176 EXPECT_TRUE(response->auth_challenge.get() == NULL); | 4204 EXPECT_TRUE(response->auth_challenge.get() == NULL); |
4177 EXPECT_EQ(100, response->headers->GetContentLength()); | 4205 EXPECT_EQ(100, response->headers->GetContentLength()); |
4178 } | 4206 } |
4179 | 4207 |
(...skipping 13 matching lines...) Expand all Loading... |
4193 | 4221 |
4194 // Ensure load is not disrupted by flags which suppress behaviour specific | 4222 // Ensure load is not disrupted by flags which suppress behaviour specific |
4195 // to other auth schemes. | 4223 // to other auth schemes. |
4196 request.load_flags = LOAD_DO_NOT_USE_EMBEDDED_IDENTITY; | 4224 request.load_flags = LOAD_DO_NOT_USE_EMBEDDED_IDENTITY; |
4197 | 4225 |
4198 HttpAuthHandlerNTLM::ScopedProcSetter proc_setter(MockGenerateRandom1, | 4226 HttpAuthHandlerNTLM::ScopedProcSetter proc_setter(MockGenerateRandom1, |
4199 MockGetHostName); | 4227 MockGetHostName); |
4200 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 4228 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
4201 | 4229 |
4202 MockWrite data_writes1[] = { | 4230 MockWrite data_writes1[] = { |
4203 MockWrite("GET /kids/login.aspx HTTP/1.1\r\n" | 4231 MockWrite( |
4204 "Host: 172.22.68.17\r\n" | 4232 "GET /kids/login.aspx HTTP/1.1\r\n" |
4205 "Connection: keep-alive\r\n\r\n"), | 4233 "Host: 172.22.68.17\r\n" |
| 4234 "Connection: keep-alive\r\n\r\n"), |
4206 }; | 4235 }; |
4207 | 4236 |
4208 MockRead data_reads1[] = { | 4237 MockRead data_reads1[] = { |
4209 MockRead("HTTP/1.1 401 Access Denied\r\n"), | 4238 MockRead("HTTP/1.1 401 Access Denied\r\n"), |
4210 // Negotiate and NTLM are often requested together. However, we only want | 4239 // Negotiate and NTLM are often requested together. However, we only want |
4211 // to test NTLM. Since Negotiate is preferred over NTLM, we have to skip | 4240 // to test NTLM. Since Negotiate is preferred over NTLM, we have to skip |
4212 // the header that requests Negotiate for this test. | 4241 // the header that requests Negotiate for this test. |
4213 MockRead("WWW-Authenticate: NTLM\r\n"), | 4242 MockRead("WWW-Authenticate: NTLM\r\n"), |
4214 MockRead("Connection: close\r\n"), | 4243 MockRead("Connection: close\r\n"), |
4215 MockRead("Content-Length: 42\r\n"), | 4244 MockRead("Content-Length: 42\r\n"), |
4216 MockRead("Content-Type: text/html\r\n\r\n"), | 4245 MockRead("Content-Type: text/html\r\n\r\n"), |
4217 // Missing content -- won't matter, as connection will be reset. | 4246 // Missing content -- won't matter, as connection will be reset. |
4218 MockRead(SYNCHRONOUS, ERR_UNEXPECTED), | 4247 MockRead(SYNCHRONOUS, ERR_UNEXPECTED), |
4219 }; | 4248 }; |
4220 | 4249 |
4221 MockWrite data_writes2[] = { | 4250 MockWrite data_writes2[] = { |
4222 // After restarting with a null identity, this is the | 4251 // After restarting with a null identity, this is the |
4223 // request we should be issuing -- the final header line contains a Type | 4252 // request we should be issuing -- the final header line contains a Type |
4224 // 1 message. | 4253 // 1 message. |
4225 MockWrite("GET /kids/login.aspx HTTP/1.1\r\n" | 4254 MockWrite( |
4226 "Host: 172.22.68.17\r\n" | 4255 "GET /kids/login.aspx HTTP/1.1\r\n" |
4227 "Connection: keep-alive\r\n" | 4256 "Host: 172.22.68.17\r\n" |
4228 "Authorization: NTLM " | 4257 "Connection: keep-alive\r\n" |
4229 "TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=\r\n\r\n"), | 4258 "Authorization: NTLM " |
| 4259 "TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=\r\n\r\n"), |
4230 | 4260 |
4231 // After calling trans->RestartWithAuth(), we should send a Type 3 message | 4261 // After calling trans->RestartWithAuth(), we should send a Type 3 message |
4232 // (the credentials for the origin server). The second request continues | 4262 // (the credentials for the origin server). The second request continues |
4233 // on the same connection. | 4263 // on the same connection. |
4234 MockWrite("GET /kids/login.aspx HTTP/1.1\r\n" | 4264 MockWrite( |
4235 "Host: 172.22.68.17\r\n" | 4265 "GET /kids/login.aspx HTTP/1.1\r\n" |
4236 "Connection: keep-alive\r\n" | 4266 "Host: 172.22.68.17\r\n" |
4237 "Authorization: NTLM TlRMTVNTUAADAAAAGAAYAGgAAAAYABgAgA" | 4267 "Connection: keep-alive\r\n" |
4238 "AAAAAAAABAAAAAGAAYAEAAAAAQABAAWAAAAAAAAAAAAAAABYIIAHQA" | 4268 "Authorization: NTLM TlRMTVNTUAADAAAAGAAYAGgAAAAYABgAgA" |
4239 "ZQBzAHQAaQBuAGcALQBuAHQAbABtAFcAVABDAC0AVwBJAE4ANwBVKW" | 4269 "AAAAAAAABAAAAAGAAYAEAAAAAQABAAWAAAAAAAAAAAAAAABYIIAHQA" |
4240 "Yma5xzVAAAAAAAAAAAAAAAAAAAAACH+gWcm+YsP9Tqb9zCR3WAeZZX" | 4270 "ZQBzAHQAaQBuAGcALQBuAHQAbABtAFcAVABDAC0AVwBJAE4ANwBVKW" |
4241 "ahlhx5I=\r\n\r\n"), | 4271 "Yma5xzVAAAAAAAAAAAAAAAAAAAAACH+gWcm+YsP9Tqb9zCR3WAeZZX" |
| 4272 "ahlhx5I=\r\n\r\n"), |
4242 }; | 4273 }; |
4243 | 4274 |
4244 MockRead data_reads2[] = { | 4275 MockRead data_reads2[] = { |
4245 // The origin server responds with a Type 2 message. | 4276 // The origin server responds with a Type 2 message. |
4246 MockRead("HTTP/1.1 401 Access Denied\r\n"), | 4277 MockRead("HTTP/1.1 401 Access Denied\r\n"), |
4247 MockRead("WWW-Authenticate: NTLM " | 4278 MockRead( |
4248 "TlRMTVNTUAACAAAADAAMADgAAAAFgokCjGpMpPGlYKkAAAAAAAAAALo" | 4279 "WWW-Authenticate: NTLM " |
4249 "AugBEAAAABQEoCgAAAA9HAE8ATwBHAEwARQACAAwARwBPAE8ARwBMAE" | 4280 "TlRMTVNTUAACAAAADAAMADgAAAAFgokCjGpMpPGlYKkAAAAAAAAAALo" |
4250 "UAAQAaAEEASwBFAEUAUwBBAFIAQQAtAEMATwBSAFAABAAeAGMAbwByA" | 4281 "AugBEAAAABQEoCgAAAA9HAE8ATwBHAEwARQACAAwARwBPAE8ARwBMAE" |
4251 "HAALgBnAG8AbwBnAGwAZQAuAGMAbwBtAAMAQABhAGsAZQBlAHMAYQBy" | 4282 "UAAQAaAEEASwBFAEUAUwBBAFIAQQAtAEMATwBSAFAABAAeAGMAbwByA" |
4252 "AGEALQBjAG8AcgBwAC4AYQBkAC4AYwBvAHIAcAAuAGcAbwBvAGcAbAB" | 4283 "HAALgBnAG8AbwBnAGwAZQAuAGMAbwBtAAMAQABhAGsAZQBlAHMAYQBy" |
4253 "lAC4AYwBvAG0ABQAeAGMAbwByAHAALgBnAG8AbwBnAGwAZQAuAGMAbw" | 4284 "AGEALQBjAG8AcgBwAC4AYQBkAC4AYwBvAHIAcAAuAGcAbwBvAGcAbAB" |
4254 "BtAAAAAAA=\r\n"), | 4285 "lAC4AYwBvAG0ABQAeAGMAbwByAHAALgBnAG8AbwBnAGwAZQAuAGMAbw" |
4255 MockRead("Content-Length: 42\r\n"), | 4286 "BtAAAAAAA=\r\n"), |
4256 MockRead("Content-Type: text/html\r\n\r\n"), | 4287 MockRead("Content-Length: 42\r\n"), |
4257 MockRead("You are not authorized to view this page\r\n"), | 4288 MockRead("Content-Type: text/html\r\n\r\n"), |
| 4289 MockRead("You are not authorized to view this page\r\n"), |
4258 | 4290 |
4259 // Lastly we get the desired content. | 4291 // Lastly we get the desired content. |
4260 MockRead("HTTP/1.1 200 OK\r\n"), | 4292 MockRead("HTTP/1.1 200 OK\r\n"), |
4261 MockRead("Content-Type: text/html; charset=utf-8\r\n"), | 4293 MockRead("Content-Type: text/html; charset=utf-8\r\n"), |
4262 MockRead("Content-Length: 13\r\n\r\n"), | 4294 MockRead("Content-Length: 13\r\n\r\n"), MockRead("Please Login\r\n"), |
4263 MockRead("Please Login\r\n"), | 4295 MockRead(SYNCHRONOUS, OK), |
4264 MockRead(SYNCHRONOUS, OK), | |
4265 }; | 4296 }; |
4266 | 4297 |
4267 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 4298 StaticSocketDataProvider data1(data_reads1, |
4268 data_writes1, arraysize(data_writes1)); | 4299 arraysize(data_reads1), |
4269 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), | 4300 data_writes1, |
4270 data_writes2, arraysize(data_writes2)); | 4301 arraysize(data_writes1)); |
| 4302 StaticSocketDataProvider data2(data_reads2, |
| 4303 arraysize(data_reads2), |
| 4304 data_writes2, |
| 4305 arraysize(data_writes2)); |
4271 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 4306 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
4272 session_deps_.socket_factory->AddSocketDataProvider(&data2); | 4307 session_deps_.socket_factory->AddSocketDataProvider(&data2); |
4273 | 4308 |
4274 TestCompletionCallback callback1; | 4309 TestCompletionCallback callback1; |
4275 | 4310 |
4276 scoped_ptr<HttpTransaction> trans( | 4311 scoped_ptr<HttpTransaction> trans( |
4277 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 4312 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
4278 | 4313 |
4279 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); | 4314 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); |
4280 EXPECT_EQ(ERR_IO_PENDING, rv); | 4315 EXPECT_EQ(ERR_IO_PENDING, rv); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4322 HttpRequestInfo request; | 4357 HttpRequestInfo request; |
4323 request.method = "GET"; | 4358 request.method = "GET"; |
4324 request.url = GURL("http://172.22.68.17/kids/login.aspx"); | 4359 request.url = GURL("http://172.22.68.17/kids/login.aspx"); |
4325 request.load_flags = 0; | 4360 request.load_flags = 0; |
4326 | 4361 |
4327 HttpAuthHandlerNTLM::ScopedProcSetter proc_setter(MockGenerateRandom2, | 4362 HttpAuthHandlerNTLM::ScopedProcSetter proc_setter(MockGenerateRandom2, |
4328 MockGetHostName); | 4363 MockGetHostName); |
4329 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 4364 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
4330 | 4365 |
4331 MockWrite data_writes1[] = { | 4366 MockWrite data_writes1[] = { |
4332 MockWrite("GET /kids/login.aspx HTTP/1.1\r\n" | 4367 MockWrite( |
4333 "Host: 172.22.68.17\r\n" | 4368 "GET /kids/login.aspx HTTP/1.1\r\n" |
4334 "Connection: keep-alive\r\n\r\n"), | 4369 "Host: 172.22.68.17\r\n" |
| 4370 "Connection: keep-alive\r\n\r\n"), |
4335 }; | 4371 }; |
4336 | 4372 |
4337 MockRead data_reads1[] = { | 4373 MockRead data_reads1[] = { |
4338 MockRead("HTTP/1.1 401 Access Denied\r\n"), | 4374 MockRead("HTTP/1.1 401 Access Denied\r\n"), |
4339 // Negotiate and NTLM are often requested together. However, we only want | 4375 // Negotiate and NTLM are often requested together. However, we only want |
4340 // to test NTLM. Since Negotiate is preferred over NTLM, we have to skip | 4376 // to test NTLM. Since Negotiate is preferred over NTLM, we have to skip |
4341 // the header that requests Negotiate for this test. | 4377 // the header that requests Negotiate for this test. |
4342 MockRead("WWW-Authenticate: NTLM\r\n"), | 4378 MockRead("WWW-Authenticate: NTLM\r\n"), |
4343 MockRead("Connection: close\r\n"), | 4379 MockRead("Connection: close\r\n"), |
4344 MockRead("Content-Length: 42\r\n"), | 4380 MockRead("Content-Length: 42\r\n"), |
4345 MockRead("Content-Type: text/html\r\n\r\n"), | 4381 MockRead("Content-Type: text/html\r\n\r\n"), |
4346 // Missing content -- won't matter, as connection will be reset. | 4382 // Missing content -- won't matter, as connection will be reset. |
4347 MockRead(SYNCHRONOUS, ERR_UNEXPECTED), | 4383 MockRead(SYNCHRONOUS, ERR_UNEXPECTED), |
4348 }; | 4384 }; |
4349 | 4385 |
4350 MockWrite data_writes2[] = { | 4386 MockWrite data_writes2[] = { |
4351 // After restarting with a null identity, this is the | 4387 // After restarting with a null identity, this is the |
4352 // request we should be issuing -- the final header line contains a Type | 4388 // request we should be issuing -- the final header line contains a Type |
4353 // 1 message. | 4389 // 1 message. |
4354 MockWrite("GET /kids/login.aspx HTTP/1.1\r\n" | 4390 MockWrite( |
4355 "Host: 172.22.68.17\r\n" | 4391 "GET /kids/login.aspx HTTP/1.1\r\n" |
4356 "Connection: keep-alive\r\n" | 4392 "Host: 172.22.68.17\r\n" |
4357 "Authorization: NTLM " | 4393 "Connection: keep-alive\r\n" |
4358 "TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=\r\n\r\n"), | 4394 "Authorization: NTLM " |
| 4395 "TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=\r\n\r\n"), |
4359 | 4396 |
4360 // After calling trans->RestartWithAuth(), we should send a Type 3 message | 4397 // After calling trans->RestartWithAuth(), we should send a Type 3 message |
4361 // (the credentials for the origin server). The second request continues | 4398 // (the credentials for the origin server). The second request continues |
4362 // on the same connection. | 4399 // on the same connection. |
4363 MockWrite("GET /kids/login.aspx HTTP/1.1\r\n" | 4400 MockWrite( |
4364 "Host: 172.22.68.17\r\n" | 4401 "GET /kids/login.aspx HTTP/1.1\r\n" |
4365 "Connection: keep-alive\r\n" | 4402 "Host: 172.22.68.17\r\n" |
4366 "Authorization: NTLM TlRMTVNTUAADAAAAGAAYAGgAAAAYABgAgA" | 4403 "Connection: keep-alive\r\n" |
4367 "AAAAAAAABAAAAAGAAYAEAAAAAQABAAWAAAAAAAAAAAAAAABYIIAHQA" | 4404 "Authorization: NTLM TlRMTVNTUAADAAAAGAAYAGgAAAAYABgAgA" |
4368 "ZQBzAHQAaQBuAGcALQBuAHQAbABtAFcAVABDAC0AVwBJAE4ANwCWeY" | 4405 "AAAAAAAABAAAAAGAAYAEAAAAAQABAAWAAAAAAAAAAAAAAABYIIAHQA" |
4369 "XnSZNwoQAAAAAAAAAAAAAAAAAAAADLa34/phTTKzNTWdub+uyFleOj" | 4406 "ZQBzAHQAaQBuAGcALQBuAHQAbABtAFcAVABDAC0AVwBJAE4ANwCWeY" |
4370 "4Ww7b7E=\r\n\r\n"), | 4407 "XnSZNwoQAAAAAAAAAAAAAAAAAAAADLa34/phTTKzNTWdub+uyFleOj" |
| 4408 "4Ww7b7E=\r\n\r\n"), |
4371 }; | 4409 }; |
4372 | 4410 |
4373 MockRead data_reads2[] = { | 4411 MockRead data_reads2[] = { |
4374 // The origin server responds with a Type 2 message. | 4412 // The origin server responds with a Type 2 message. |
4375 MockRead("HTTP/1.1 401 Access Denied\r\n"), | 4413 MockRead("HTTP/1.1 401 Access Denied\r\n"), |
4376 MockRead("WWW-Authenticate: NTLM " | 4414 MockRead( |
4377 "TlRMTVNTUAACAAAADAAMADgAAAAFgokCbVWUZezVGpAAAAAAAAAAALo" | 4415 "WWW-Authenticate: NTLM " |
4378 "AugBEAAAABQEoCgAAAA9HAE8ATwBHAEwARQACAAwARwBPAE8ARwBMAE" | 4416 "TlRMTVNTUAACAAAADAAMADgAAAAFgokCbVWUZezVGpAAAAAAAAAAALo" |
4379 "UAAQAaAEEASwBFAEUAUwBBAFIAQQAtAEMATwBSAFAABAAeAGMAbwByA" | 4417 "AugBEAAAABQEoCgAAAA9HAE8ATwBHAEwARQACAAwARwBPAE8ARwBMAE" |
4380 "HAALgBnAG8AbwBnAGwAZQAuAGMAbwBtAAMAQABhAGsAZQBlAHMAYQBy" | 4418 "UAAQAaAEEASwBFAEUAUwBBAFIAQQAtAEMATwBSAFAABAAeAGMAbwByA" |
4381 "AGEALQBjAG8AcgBwAC4AYQBkAC4AYwBvAHIAcAAuAGcAbwBvAGcAbAB" | 4419 "HAALgBnAG8AbwBnAGwAZQAuAGMAbwBtAAMAQABhAGsAZQBlAHMAYQBy" |
4382 "lAC4AYwBvAG0ABQAeAGMAbwByAHAALgBnAG8AbwBnAGwAZQAuAGMAbw" | 4420 "AGEALQBjAG8AcgBwAC4AYQBkAC4AYwBvAHIAcAAuAGcAbwBvAGcAbAB" |
4383 "BtAAAAAAA=\r\n"), | 4421 "lAC4AYwBvAG0ABQAeAGMAbwByAHAALgBnAG8AbwBnAGwAZQAuAGMAbw" |
4384 MockRead("Content-Length: 42\r\n"), | 4422 "BtAAAAAAA=\r\n"), |
4385 MockRead("Content-Type: text/html\r\n\r\n"), | 4423 MockRead("Content-Length: 42\r\n"), |
4386 MockRead("You are not authorized to view this page\r\n"), | 4424 MockRead("Content-Type: text/html\r\n\r\n"), |
| 4425 MockRead("You are not authorized to view this page\r\n"), |
4387 | 4426 |
4388 // Wrong password. | 4427 // Wrong password. |
4389 MockRead("HTTP/1.1 401 Access Denied\r\n"), | 4428 MockRead("HTTP/1.1 401 Access Denied\r\n"), |
4390 MockRead("WWW-Authenticate: NTLM\r\n"), | 4429 MockRead("WWW-Authenticate: NTLM\r\n"), MockRead("Connection: close\r\n"), |
4391 MockRead("Connection: close\r\n"), | 4430 MockRead("Content-Length: 42\r\n"), |
4392 MockRead("Content-Length: 42\r\n"), | 4431 MockRead("Content-Type: text/html\r\n\r\n"), |
4393 MockRead("Content-Type: text/html\r\n\r\n"), | 4432 // Missing content -- won't matter, as connection will be reset. |
4394 // Missing content -- won't matter, as connection will be reset. | 4433 MockRead(SYNCHRONOUS, ERR_UNEXPECTED), |
4395 MockRead(SYNCHRONOUS, ERR_UNEXPECTED), | |
4396 }; | 4434 }; |
4397 | 4435 |
4398 MockWrite data_writes3[] = { | 4436 MockWrite data_writes3[] = { |
4399 // After restarting with a null identity, this is the | 4437 // After restarting with a null identity, this is the |
4400 // request we should be issuing -- the final header line contains a Type | 4438 // request we should be issuing -- the final header line contains a Type |
4401 // 1 message. | 4439 // 1 message. |
4402 MockWrite("GET /kids/login.aspx HTTP/1.1\r\n" | 4440 MockWrite( |
4403 "Host: 172.22.68.17\r\n" | 4441 "GET /kids/login.aspx HTTP/1.1\r\n" |
4404 "Connection: keep-alive\r\n" | 4442 "Host: 172.22.68.17\r\n" |
4405 "Authorization: NTLM " | 4443 "Connection: keep-alive\r\n" |
4406 "TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=\r\n\r\n"), | 4444 "Authorization: NTLM " |
| 4445 "TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=\r\n\r\n"), |
4407 | 4446 |
4408 // After calling trans->RestartWithAuth(), we should send a Type 3 message | 4447 // After calling trans->RestartWithAuth(), we should send a Type 3 message |
4409 // (the credentials for the origin server). The second request continues | 4448 // (the credentials for the origin server). The second request continues |
4410 // on the same connection. | 4449 // on the same connection. |
4411 MockWrite("GET /kids/login.aspx HTTP/1.1\r\n" | 4450 MockWrite( |
4412 "Host: 172.22.68.17\r\n" | 4451 "GET /kids/login.aspx HTTP/1.1\r\n" |
4413 "Connection: keep-alive\r\n" | 4452 "Host: 172.22.68.17\r\n" |
4414 "Authorization: NTLM TlRMTVNTUAADAAAAGAAYAGgAAAAYABgAgA" | 4453 "Connection: keep-alive\r\n" |
4415 "AAAAAAAABAAAAAGAAYAEAAAAAQABAAWAAAAAAAAAAAAAAABYIIAHQA" | 4454 "Authorization: NTLM TlRMTVNTUAADAAAAGAAYAGgAAAAYABgAgA" |
4416 "ZQBzAHQAaQBuAGcALQBuAHQAbABtAFcAVABDAC0AVwBJAE4ANwBO54" | 4455 "AAAAAAAABAAAAAGAAYAEAAAAAQABAAWAAAAAAAAAAAAAAABYIIAHQA" |
4417 "dFMVvTHwAAAAAAAAAAAAAAAAAAAACS7sT6Uzw7L0L//WUqlIaVWpbI" | 4456 "ZQBzAHQAaQBuAGcALQBuAHQAbABtAFcAVABDAC0AVwBJAE4ANwBO54" |
4418 "+4MUm7c=\r\n\r\n"), | 4457 "dFMVvTHwAAAAAAAAAAAAAAAAAAAACS7sT6Uzw7L0L//WUqlIaVWpbI" |
| 4458 "+4MUm7c=\r\n\r\n"), |
4419 }; | 4459 }; |
4420 | 4460 |
4421 MockRead data_reads3[] = { | 4461 MockRead data_reads3[] = { |
4422 // The origin server responds with a Type 2 message. | 4462 // The origin server responds with a Type 2 message. |
4423 MockRead("HTTP/1.1 401 Access Denied\r\n"), | 4463 MockRead("HTTP/1.1 401 Access Denied\r\n"), |
4424 MockRead("WWW-Authenticate: NTLM " | 4464 MockRead( |
4425 "TlRMTVNTUAACAAAADAAMADgAAAAFgokCL24VN8dgOR8AAAAAAAAAALo" | 4465 "WWW-Authenticate: NTLM " |
4426 "AugBEAAAABQEoCgAAAA9HAE8ATwBHAEwARQACAAwARwBPAE8ARwBMAE" | 4466 "TlRMTVNTUAACAAAADAAMADgAAAAFgokCL24VN8dgOR8AAAAAAAAAALo" |
4427 "UAAQAaAEEASwBFAEUAUwBBAFIAQQAtAEMATwBSAFAABAAeAGMAbwByA" | 4467 "AugBEAAAABQEoCgAAAA9HAE8ATwBHAEwARQACAAwARwBPAE8ARwBMAE" |
4428 "HAALgBnAG8AbwBnAGwAZQAuAGMAbwBtAAMAQABhAGsAZQBlAHMAYQBy" | 4468 "UAAQAaAEEASwBFAEUAUwBBAFIAQQAtAEMATwBSAFAABAAeAGMAbwByA" |
4429 "AGEALQBjAG8AcgBwAC4AYQBkAC4AYwBvAHIAcAAuAGcAbwBvAGcAbAB" | 4469 "HAALgBnAG8AbwBnAGwAZQAuAGMAbwBtAAMAQABhAGsAZQBlAHMAYQBy" |
4430 "lAC4AYwBvAG0ABQAeAGMAbwByAHAALgBnAG8AbwBnAGwAZQAuAGMAbw" | 4470 "AGEALQBjAG8AcgBwAC4AYQBkAC4AYwBvAHIAcAAuAGcAbwBvAGcAbAB" |
4431 "BtAAAAAAA=\r\n"), | 4471 "lAC4AYwBvAG0ABQAeAGMAbwByAHAALgBnAG8AbwBnAGwAZQAuAGMAbw" |
4432 MockRead("Content-Length: 42\r\n"), | 4472 "BtAAAAAAA=\r\n"), |
4433 MockRead("Content-Type: text/html\r\n\r\n"), | 4473 MockRead("Content-Length: 42\r\n"), |
4434 MockRead("You are not authorized to view this page\r\n"), | 4474 MockRead("Content-Type: text/html\r\n\r\n"), |
| 4475 MockRead("You are not authorized to view this page\r\n"), |
4435 | 4476 |
4436 // Lastly we get the desired content. | 4477 // Lastly we get the desired content. |
4437 MockRead("HTTP/1.1 200 OK\r\n"), | 4478 MockRead("HTTP/1.1 200 OK\r\n"), |
4438 MockRead("Content-Type: text/html; charset=utf-8\r\n"), | 4479 MockRead("Content-Type: text/html; charset=utf-8\r\n"), |
4439 MockRead("Content-Length: 13\r\n\r\n"), | 4480 MockRead("Content-Length: 13\r\n\r\n"), MockRead("Please Login\r\n"), |
4440 MockRead("Please Login\r\n"), | 4481 MockRead(SYNCHRONOUS, OK), |
4441 MockRead(SYNCHRONOUS, OK), | |
4442 }; | 4482 }; |
4443 | 4483 |
4444 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 4484 StaticSocketDataProvider data1(data_reads1, |
4445 data_writes1, arraysize(data_writes1)); | 4485 arraysize(data_reads1), |
4446 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), | 4486 data_writes1, |
4447 data_writes2, arraysize(data_writes2)); | 4487 arraysize(data_writes1)); |
4448 StaticSocketDataProvider data3(data_reads3, arraysize(data_reads3), | 4488 StaticSocketDataProvider data2(data_reads2, |
4449 data_writes3, arraysize(data_writes3)); | 4489 arraysize(data_reads2), |
| 4490 data_writes2, |
| 4491 arraysize(data_writes2)); |
| 4492 StaticSocketDataProvider data3(data_reads3, |
| 4493 arraysize(data_reads3), |
| 4494 data_writes3, |
| 4495 arraysize(data_writes3)); |
4450 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 4496 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
4451 session_deps_.socket_factory->AddSocketDataProvider(&data2); | 4497 session_deps_.socket_factory->AddSocketDataProvider(&data2); |
4452 session_deps_.socket_factory->AddSocketDataProvider(&data3); | 4498 session_deps_.socket_factory->AddSocketDataProvider(&data3); |
4453 | 4499 |
4454 TestCompletionCallback callback1; | 4500 TestCompletionCallback callback1; |
4455 | 4501 |
4456 scoped_ptr<HttpTransaction> trans( | 4502 scoped_ptr<HttpTransaction> trans( |
4457 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 4503 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
4458 | 4504 |
4459 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); | 4505 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4528 | 4574 |
4529 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 4575 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
4530 scoped_ptr<HttpTransaction> trans( | 4576 scoped_ptr<HttpTransaction> trans( |
4531 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 4577 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
4532 | 4578 |
4533 // Respond with 300 kb of headers (we should fail after 256 kb). | 4579 // Respond with 300 kb of headers (we should fail after 256 kb). |
4534 std::string large_headers_string; | 4580 std::string large_headers_string; |
4535 FillLargeHeadersString(&large_headers_string, 300 * 1024); | 4581 FillLargeHeadersString(&large_headers_string, 300 * 1024); |
4536 | 4582 |
4537 MockRead data_reads[] = { | 4583 MockRead data_reads[] = { |
4538 MockRead("HTTP/1.0 200 OK\r\n"), | 4584 MockRead("HTTP/1.0 200 OK\r\n"), |
4539 MockRead(ASYNC, large_headers_string.data(), large_headers_string.size()), | 4585 MockRead(ASYNC, large_headers_string.data(), large_headers_string.size()), |
4540 MockRead("\r\nBODY"), | 4586 MockRead("\r\nBODY"), MockRead(SYNCHRONOUS, OK), |
4541 MockRead(SYNCHRONOUS, OK), | |
4542 }; | 4587 }; |
4543 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); | 4588 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); |
4544 session_deps_.socket_factory->AddSocketDataProvider(&data); | 4589 session_deps_.socket_factory->AddSocketDataProvider(&data); |
4545 | 4590 |
4546 TestCompletionCallback callback; | 4591 TestCompletionCallback callback; |
4547 | 4592 |
4548 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 4593 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
4549 EXPECT_EQ(ERR_IO_PENDING, rv); | 4594 EXPECT_EQ(ERR_IO_PENDING, rv); |
4550 | 4595 |
4551 rv = callback.WaitForResult(); | 4596 rv = callback.WaitForResult(); |
4552 EXPECT_EQ(ERR_RESPONSE_HEADERS_TOO_BIG, rv); | 4597 EXPECT_EQ(ERR_RESPONSE_HEADERS_TOO_BIG, rv); |
4553 | 4598 |
4554 const HttpResponseInfo* response = trans->GetResponseInfo(); | 4599 const HttpResponseInfo* response = trans->GetResponseInfo(); |
4555 EXPECT_TRUE(response == NULL); | 4600 EXPECT_TRUE(response == NULL); |
4556 } | 4601 } |
4557 | 4602 |
4558 // Make sure that we don't try to reuse a TCPClientSocket when failing to | 4603 // Make sure that we don't try to reuse a TCPClientSocket when failing to |
4559 // establish tunnel. | 4604 // establish tunnel. |
4560 // http://code.google.com/p/chromium/issues/detail?id=3772 | 4605 // http://code.google.com/p/chromium/issues/detail?id=3772 |
4561 TEST_P(HttpNetworkTransactionTest, | 4606 TEST_P(HttpNetworkTransactionTest, DontRecycleTransportSocketForSSLTunnel) { |
4562 DontRecycleTransportSocketForSSLTunnel) { | |
4563 HttpRequestInfo request; | 4607 HttpRequestInfo request; |
4564 request.method = "GET"; | 4608 request.method = "GET"; |
4565 request.url = GURL("https://www.google.com/"); | 4609 request.url = GURL("https://www.google.com/"); |
4566 request.load_flags = 0; | 4610 request.load_flags = 0; |
4567 | 4611 |
4568 // Configure against proxy server "myproxy:70". | 4612 // Configure against proxy server "myproxy:70". |
4569 session_deps_.proxy_service.reset(ProxyService::CreateFixed("myproxy:70")); | 4613 session_deps_.proxy_service.reset(ProxyService::CreateFixed("myproxy:70")); |
4570 | 4614 |
4571 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 4615 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
4572 | 4616 |
4573 scoped_ptr<HttpTransaction> trans( | 4617 scoped_ptr<HttpTransaction> trans( |
4574 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 4618 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
4575 | 4619 |
4576 // Since we have proxy, should try to establish tunnel. | 4620 // Since we have proxy, should try to establish tunnel. |
4577 MockWrite data_writes1[] = { | 4621 MockWrite data_writes1[] = { |
4578 MockWrite("CONNECT www.google.com:443 HTTP/1.1\r\n" | 4622 MockWrite( |
4579 "Host: www.google.com\r\n" | 4623 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
4580 "Proxy-Connection: keep-alive\r\n\r\n"), | 4624 "Host: www.google.com\r\n" |
| 4625 "Proxy-Connection: keep-alive\r\n\r\n"), |
4581 }; | 4626 }; |
4582 | 4627 |
4583 // The proxy responds to the connect with a 404, using a persistent | 4628 // The proxy responds to the connect with a 404, using a persistent |
4584 // connection. Usually a proxy would return 501 (not implemented), | 4629 // connection. Usually a proxy would return 501 (not implemented), |
4585 // or 200 (tunnel established). | 4630 // or 200 (tunnel established). |
4586 MockRead data_reads1[] = { | 4631 MockRead data_reads1[] = { |
4587 MockRead("HTTP/1.1 404 Not Found\r\n"), | 4632 MockRead("HTTP/1.1 404 Not Found\r\n"), |
4588 MockRead("Content-Length: 10\r\n\r\n"), | 4633 MockRead("Content-Length: 10\r\n\r\n"), |
4589 MockRead(SYNCHRONOUS, ERR_UNEXPECTED), // Should not be reached. | 4634 MockRead(SYNCHRONOUS, ERR_UNEXPECTED), // Should not be reached. |
4590 }; | 4635 }; |
4591 | 4636 |
4592 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 4637 StaticSocketDataProvider data1(data_reads1, |
4593 data_writes1, arraysize(data_writes1)); | 4638 arraysize(data_reads1), |
| 4639 data_writes1, |
| 4640 arraysize(data_writes1)); |
4594 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 4641 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
4595 | 4642 |
4596 TestCompletionCallback callback1; | 4643 TestCompletionCallback callback1; |
4597 | 4644 |
4598 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); | 4645 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); |
4599 EXPECT_EQ(ERR_IO_PENDING, rv); | 4646 EXPECT_EQ(ERR_IO_PENDING, rv); |
4600 | 4647 |
4601 rv = callback1.WaitForResult(); | 4648 rv = callback1.WaitForResult(); |
4602 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, rv); | 4649 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, rv); |
4603 | 4650 |
(...skipping 19 matching lines...) Expand all Loading... |
4623 request.method = "GET"; | 4670 request.method = "GET"; |
4624 request.url = GURL("http://www.google.com/"); | 4671 request.url = GURL("http://www.google.com/"); |
4625 request.load_flags = 0; | 4672 request.load_flags = 0; |
4626 | 4673 |
4627 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 4674 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
4628 | 4675 |
4629 scoped_ptr<HttpTransaction> trans( | 4676 scoped_ptr<HttpTransaction> trans( |
4630 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 4677 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
4631 | 4678 |
4632 MockRead data_reads[] = { | 4679 MockRead data_reads[] = { |
4633 // A part of the response body is received with the response headers. | 4680 // A part of the response body is received with the response headers. |
4634 MockRead("HTTP/1.1 200 OK\r\nContent-Length: 11\r\n\r\nhel"), | 4681 MockRead("HTTP/1.1 200 OK\r\nContent-Length: 11\r\n\r\nhel"), |
4635 // The rest of the response body is received in two parts. | 4682 // The rest of the response body is received in two parts. |
4636 MockRead("lo"), | 4683 MockRead("lo"), |
4637 MockRead(" world"), | 4684 MockRead(" world"), |
4638 MockRead("junk"), // Should not be read!! | 4685 MockRead("junk"), // Should not be read!! |
4639 MockRead(SYNCHRONOUS, OK), | 4686 MockRead(SYNCHRONOUS, OK), |
4640 }; | 4687 }; |
4641 | 4688 |
4642 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); | 4689 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); |
4643 session_deps_.socket_factory->AddSocketDataProvider(&data); | 4690 session_deps_.socket_factory->AddSocketDataProvider(&data); |
4644 | 4691 |
4645 TestCompletionCallback callback; | 4692 TestCompletionCallback callback; |
4646 | 4693 |
4647 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 4694 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
4648 EXPECT_EQ(ERR_IO_PENDING, rv); | 4695 EXPECT_EQ(ERR_IO_PENDING, rv); |
4649 | 4696 |
(...skipping 24 matching lines...) Expand all Loading... |
4674 | 4721 |
4675 // Make sure that we recycle a SSL socket after reading all of the response | 4722 // Make sure that we recycle a SSL socket after reading all of the response |
4676 // body. | 4723 // body. |
4677 TEST_P(HttpNetworkTransactionTest, RecycleSSLSocket) { | 4724 TEST_P(HttpNetworkTransactionTest, RecycleSSLSocket) { |
4678 HttpRequestInfo request; | 4725 HttpRequestInfo request; |
4679 request.method = "GET"; | 4726 request.method = "GET"; |
4680 request.url = GURL("https://www.google.com/"); | 4727 request.url = GURL("https://www.google.com/"); |
4681 request.load_flags = 0; | 4728 request.load_flags = 0; |
4682 | 4729 |
4683 MockWrite data_writes[] = { | 4730 MockWrite data_writes[] = { |
4684 MockWrite("GET / HTTP/1.1\r\n" | 4731 MockWrite( |
4685 "Host: www.google.com\r\n" | 4732 "GET / HTTP/1.1\r\n" |
4686 "Connection: keep-alive\r\n\r\n"), | 4733 "Host: www.google.com\r\n" |
| 4734 "Connection: keep-alive\r\n\r\n"), |
4687 }; | 4735 }; |
4688 | 4736 |
4689 MockRead data_reads[] = { | 4737 MockRead data_reads[] = { |
4690 MockRead("HTTP/1.1 200 OK\r\n"), | 4738 MockRead("HTTP/1.1 200 OK\r\n"), MockRead("Content-Length: 11\r\n\r\n"), |
4691 MockRead("Content-Length: 11\r\n\r\n"), | 4739 MockRead("hello world"), MockRead(SYNCHRONOUS, OK), |
4692 MockRead("hello world"), | |
4693 MockRead(SYNCHRONOUS, OK), | |
4694 }; | 4740 }; |
4695 | 4741 |
4696 SSLSocketDataProvider ssl(ASYNC, OK); | 4742 SSLSocketDataProvider ssl(ASYNC, OK); |
4697 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 4743 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
4698 | 4744 |
4699 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 4745 StaticSocketDataProvider data( |
4700 data_writes, arraysize(data_writes)); | 4746 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
4701 session_deps_.socket_factory->AddSocketDataProvider(&data); | 4747 session_deps_.socket_factory->AddSocketDataProvider(&data); |
4702 | 4748 |
4703 TestCompletionCallback callback; | 4749 TestCompletionCallback callback; |
4704 | 4750 |
4705 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 4751 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
4706 scoped_ptr<HttpTransaction> trans( | 4752 scoped_ptr<HttpTransaction> trans( |
4707 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 4753 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
4708 | 4754 |
4709 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 4755 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
4710 | 4756 |
(...skipping 22 matching lines...) Expand all Loading... |
4733 | 4779 |
4734 // Grab a SSL socket, use it, and put it back into the pool. Then, reuse it | 4780 // Grab a SSL socket, use it, and put it back into the pool. Then, reuse it |
4735 // from the pool and make sure that we recover okay. | 4781 // from the pool and make sure that we recover okay. |
4736 TEST_P(HttpNetworkTransactionTest, RecycleDeadSSLSocket) { | 4782 TEST_P(HttpNetworkTransactionTest, RecycleDeadSSLSocket) { |
4737 HttpRequestInfo request; | 4783 HttpRequestInfo request; |
4738 request.method = "GET"; | 4784 request.method = "GET"; |
4739 request.url = GURL("https://www.google.com/"); | 4785 request.url = GURL("https://www.google.com/"); |
4740 request.load_flags = 0; | 4786 request.load_flags = 0; |
4741 | 4787 |
4742 MockWrite data_writes[] = { | 4788 MockWrite data_writes[] = { |
4743 MockWrite("GET / HTTP/1.1\r\n" | 4789 MockWrite( |
4744 "Host: www.google.com\r\n" | 4790 "GET / HTTP/1.1\r\n" |
4745 "Connection: keep-alive\r\n\r\n"), | 4791 "Host: www.google.com\r\n" |
4746 MockWrite("GET / HTTP/1.1\r\n" | 4792 "Connection: keep-alive\r\n\r\n"), |
4747 "Host: www.google.com\r\n" | 4793 MockWrite( |
4748 "Connection: keep-alive\r\n\r\n"), | 4794 "GET / HTTP/1.1\r\n" |
| 4795 "Host: www.google.com\r\n" |
| 4796 "Connection: keep-alive\r\n\r\n"), |
4749 }; | 4797 }; |
4750 | 4798 |
4751 MockRead data_reads[] = { | 4799 MockRead data_reads[] = { |
4752 MockRead("HTTP/1.1 200 OK\r\n"), | 4800 MockRead("HTTP/1.1 200 OK\r\n"), MockRead("Content-Length: 11\r\n\r\n"), |
4753 MockRead("Content-Length: 11\r\n\r\n"), | 4801 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
4754 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 4802 MockRead("hello world"), MockRead(ASYNC, 0, 0) // EOF |
4755 MockRead("hello world"), | |
4756 MockRead(ASYNC, 0, 0) // EOF | |
4757 }; | 4803 }; |
4758 | 4804 |
4759 SSLSocketDataProvider ssl(ASYNC, OK); | 4805 SSLSocketDataProvider ssl(ASYNC, OK); |
4760 SSLSocketDataProvider ssl2(ASYNC, OK); | 4806 SSLSocketDataProvider ssl2(ASYNC, OK); |
4761 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 4807 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
4762 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl2); | 4808 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl2); |
4763 | 4809 |
4764 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 4810 StaticSocketDataProvider data( |
4765 data_writes, arraysize(data_writes)); | 4811 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
4766 StaticSocketDataProvider data2(data_reads, arraysize(data_reads), | 4812 StaticSocketDataProvider data2( |
4767 data_writes, arraysize(data_writes)); | 4813 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
4768 session_deps_.socket_factory->AddSocketDataProvider(&data); | 4814 session_deps_.socket_factory->AddSocketDataProvider(&data); |
4769 session_deps_.socket_factory->AddSocketDataProvider(&data2); | 4815 session_deps_.socket_factory->AddSocketDataProvider(&data2); |
4770 | 4816 |
4771 TestCompletionCallback callback; | 4817 TestCompletionCallback callback; |
4772 | 4818 |
4773 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 4819 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
4774 scoped_ptr<HttpTransaction> trans( | 4820 scoped_ptr<HttpTransaction> trans( |
4775 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 4821 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
4776 | 4822 |
4777 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 4823 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4824 | 4870 |
4825 // We now check to make sure the socket was added back to the pool. | 4871 // We now check to make sure the socket was added back to the pool. |
4826 EXPECT_EQ(1, GetIdleSocketCountInSSLSocketPool(session.get())); | 4872 EXPECT_EQ(1, GetIdleSocketCountInSSLSocketPool(session.get())); |
4827 } | 4873 } |
4828 | 4874 |
4829 // Make sure that we recycle a socket after a zero-length response. | 4875 // Make sure that we recycle a socket after a zero-length response. |
4830 // http://crbug.com/9880 | 4876 // http://crbug.com/9880 |
4831 TEST_P(HttpNetworkTransactionTest, RecycleSocketAfterZeroContentLength) { | 4877 TEST_P(HttpNetworkTransactionTest, RecycleSocketAfterZeroContentLength) { |
4832 HttpRequestInfo request; | 4878 HttpRequestInfo request; |
4833 request.method = "GET"; | 4879 request.method = "GET"; |
4834 request.url = GURL("http://www.google.com/csi?v=3&s=web&action=&" | 4880 request.url = GURL( |
4835 "tran=undefined&ei=mAXcSeegAo-SMurloeUN&" | 4881 "http://www.google.com/csi?v=3&s=web&action=&" |
4836 "e=17259,18167,19592,19773,19981,20133,20173,20233&" | 4882 "tran=undefined&ei=mAXcSeegAo-SMurloeUN&" |
4837 "rt=prt.2642,ol.2649,xjs.2951"); | 4883 "e=17259,18167,19592,19773,19981,20133,20173,20233&" |
| 4884 "rt=prt.2642,ol.2649,xjs.2951"); |
4838 request.load_flags = 0; | 4885 request.load_flags = 0; |
4839 | 4886 |
4840 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 4887 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
4841 | 4888 |
4842 scoped_ptr<HttpTransaction> trans( | 4889 scoped_ptr<HttpTransaction> trans( |
4843 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 4890 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
4844 | 4891 |
4845 MockRead data_reads[] = { | 4892 MockRead data_reads[] = { |
4846 MockRead("HTTP/1.1 204 No Content\r\n" | 4893 MockRead( |
4847 "Content-Length: 0\r\n" | 4894 "HTTP/1.1 204 No Content\r\n" |
4848 "Content-Type: text/html\r\n\r\n"), | 4895 "Content-Length: 0\r\n" |
4849 MockRead("junk"), // Should not be read!! | 4896 "Content-Type: text/html\r\n\r\n"), |
4850 MockRead(SYNCHRONOUS, OK), | 4897 MockRead("junk"), // Should not be read!! |
| 4898 MockRead(SYNCHRONOUS, OK), |
4851 }; | 4899 }; |
4852 | 4900 |
4853 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); | 4901 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); |
4854 session_deps_.socket_factory->AddSocketDataProvider(&data); | 4902 session_deps_.socket_factory->AddSocketDataProvider(&data); |
4855 | 4903 |
4856 TestCompletionCallback callback; | 4904 TestCompletionCallback callback; |
4857 | 4905 |
4858 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 4906 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
4859 EXPECT_EQ(ERR_IO_PENDING, rv); | 4907 EXPECT_EQ(ERR_IO_PENDING, rv); |
4860 | 4908 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4903 request[1].upload_data_stream = &upload_data_stream; | 4951 request[1].upload_data_stream = &upload_data_stream; |
4904 request[1].load_flags = 0; | 4952 request[1].load_flags = 0; |
4905 | 4953 |
4906 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 4954 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
4907 | 4955 |
4908 // The first socket is used for transaction 1 and the first attempt of | 4956 // The first socket is used for transaction 1 and the first attempt of |
4909 // transaction 2. | 4957 // transaction 2. |
4910 | 4958 |
4911 // The response of transaction 1. | 4959 // The response of transaction 1. |
4912 MockRead data_reads1[] = { | 4960 MockRead data_reads1[] = { |
4913 MockRead("HTTP/1.1 200 OK\r\nContent-Length: 11\r\n\r\n"), | 4961 MockRead("HTTP/1.1 200 OK\r\nContent-Length: 11\r\n\r\n"), |
4914 MockRead("hello world"), | 4962 MockRead("hello world"), MockRead(SYNCHRONOUS, OK), |
4915 MockRead(SYNCHRONOUS, OK), | |
4916 }; | 4963 }; |
4917 // The mock write results of transaction 1 and the first attempt of | 4964 // The mock write results of transaction 1 and the first attempt of |
4918 // transaction 2. | 4965 // transaction 2. |
4919 MockWrite data_writes1[] = { | 4966 MockWrite data_writes1[] = { |
4920 MockWrite(SYNCHRONOUS, 64), // GET | 4967 MockWrite(SYNCHRONOUS, 64), // GET |
4921 MockWrite(SYNCHRONOUS, 93), // POST | 4968 MockWrite(SYNCHRONOUS, 93), // POST |
4922 MockWrite(SYNCHRONOUS, ERR_CONNECTION_ABORTED), // POST data | 4969 MockWrite(SYNCHRONOUS, ERR_CONNECTION_ABORTED), // POST data |
4923 }; | 4970 }; |
4924 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 4971 StaticSocketDataProvider data1(data_reads1, |
4925 data_writes1, arraysize(data_writes1)); | 4972 arraysize(data_reads1), |
| 4973 data_writes1, |
| 4974 arraysize(data_writes1)); |
4926 | 4975 |
4927 // The second socket is used for the second attempt of transaction 2. | 4976 // The second socket is used for the second attempt of transaction 2. |
4928 | 4977 |
4929 // The response of transaction 2. | 4978 // The response of transaction 2. |
4930 MockRead data_reads2[] = { | 4979 MockRead data_reads2[] = { |
4931 MockRead("HTTP/1.1 200 OK\r\nContent-Length: 7\r\n\r\n"), | 4980 MockRead("HTTP/1.1 200 OK\r\nContent-Length: 7\r\n\r\n"), |
4932 MockRead("welcome"), | 4981 MockRead("welcome"), MockRead(SYNCHRONOUS, OK), |
4933 MockRead(SYNCHRONOUS, OK), | |
4934 }; | 4982 }; |
4935 // The mock write results of the second attempt of transaction 2. | 4983 // The mock write results of the second attempt of transaction 2. |
4936 MockWrite data_writes2[] = { | 4984 MockWrite data_writes2[] = { |
4937 MockWrite(SYNCHRONOUS, 93), // POST | 4985 MockWrite(SYNCHRONOUS, 93), // POST |
4938 MockWrite(SYNCHRONOUS, 3), // POST data | 4986 MockWrite(SYNCHRONOUS, 3), // POST data |
4939 }; | 4987 }; |
4940 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), | 4988 StaticSocketDataProvider data2(data_reads2, |
4941 data_writes2, arraysize(data_writes2)); | 4989 arraysize(data_reads2), |
| 4990 data_writes2, |
| 4991 arraysize(data_writes2)); |
4942 | 4992 |
4943 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 4993 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
4944 session_deps_.socket_factory->AddSocketDataProvider(&data2); | 4994 session_deps_.socket_factory->AddSocketDataProvider(&data2); |
4945 | 4995 |
4946 const char* kExpectedResponseData[] = { | 4996 const char* kExpectedResponseData[] = {"hello world", "welcome"}; |
4947 "hello world", "welcome" | |
4948 }; | |
4949 | 4997 |
4950 for (int i = 0; i < 2; ++i) { | 4998 for (int i = 0; i < 2; ++i) { |
4951 scoped_ptr<HttpTransaction> trans( | 4999 scoped_ptr<HttpTransaction> trans( |
4952 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 5000 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
4953 | 5001 |
4954 TestCompletionCallback callback; | 5002 TestCompletionCallback callback; |
4955 | 5003 |
4956 int rv = trans->Start(&request[i], callback.callback(), BoundNetLog()); | 5004 int rv = trans->Start(&request[i], callback.callback(), BoundNetLog()); |
4957 EXPECT_EQ(ERR_IO_PENDING, rv); | 5005 EXPECT_EQ(ERR_IO_PENDING, rv); |
4958 | 5006 |
(...skipping 24 matching lines...) Expand all Loading... |
4983 | 5031 |
4984 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 5032 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
4985 scoped_ptr<HttpTransaction> trans( | 5033 scoped_ptr<HttpTransaction> trans( |
4986 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 5034 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
4987 | 5035 |
4988 // The password contains an escaped character -- for this test to pass it | 5036 // The password contains an escaped character -- for this test to pass it |
4989 // will need to be unescaped by HttpNetworkTransaction. | 5037 // will need to be unescaped by HttpNetworkTransaction. |
4990 EXPECT_EQ("b%40r", request.url.password()); | 5038 EXPECT_EQ("b%40r", request.url.password()); |
4991 | 5039 |
4992 MockWrite data_writes1[] = { | 5040 MockWrite data_writes1[] = { |
4993 MockWrite("GET / HTTP/1.1\r\n" | 5041 MockWrite( |
4994 "Host: www.google.com\r\n" | 5042 "GET / HTTP/1.1\r\n" |
4995 "Connection: keep-alive\r\n\r\n"), | 5043 "Host: www.google.com\r\n" |
| 5044 "Connection: keep-alive\r\n\r\n"), |
4996 }; | 5045 }; |
4997 | 5046 |
4998 MockRead data_reads1[] = { | 5047 MockRead data_reads1[] = { |
4999 MockRead("HTTP/1.0 401 Unauthorized\r\n"), | 5048 MockRead("HTTP/1.0 401 Unauthorized\r\n"), |
5000 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | 5049 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
5001 MockRead("Content-Length: 10\r\n\r\n"), | 5050 MockRead("Content-Length: 10\r\n\r\n"), MockRead(SYNCHRONOUS, ERR_FAILED), |
5002 MockRead(SYNCHRONOUS, ERR_FAILED), | |
5003 }; | 5051 }; |
5004 | 5052 |
5005 // After the challenge above, the transaction will be restarted using the | 5053 // After the challenge above, the transaction will be restarted using the |
5006 // identity from the url (foo, b@r) to answer the challenge. | 5054 // identity from the url (foo, b@r) to answer the challenge. |
5007 MockWrite data_writes2[] = { | 5055 MockWrite data_writes2[] = { |
5008 MockWrite("GET / HTTP/1.1\r\n" | 5056 MockWrite( |
5009 "Host: www.google.com\r\n" | 5057 "GET / HTTP/1.1\r\n" |
5010 "Connection: keep-alive\r\n" | 5058 "Host: www.google.com\r\n" |
5011 "Authorization: Basic Zm9vOmJAcg==\r\n\r\n"), | 5059 "Connection: keep-alive\r\n" |
| 5060 "Authorization: Basic Zm9vOmJAcg==\r\n\r\n"), |
5012 }; | 5061 }; |
5013 | 5062 |
5014 MockRead data_reads2[] = { | 5063 MockRead data_reads2[] = { |
5015 MockRead("HTTP/1.0 200 OK\r\n"), | 5064 MockRead("HTTP/1.0 200 OK\r\n"), MockRead("Content-Length: 100\r\n\r\n"), |
5016 MockRead("Content-Length: 100\r\n\r\n"), | 5065 MockRead(SYNCHRONOUS, OK), |
5017 MockRead(SYNCHRONOUS, OK), | |
5018 }; | 5066 }; |
5019 | 5067 |
5020 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 5068 StaticSocketDataProvider data1(data_reads1, |
5021 data_writes1, arraysize(data_writes1)); | 5069 arraysize(data_reads1), |
5022 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), | 5070 data_writes1, |
5023 data_writes2, arraysize(data_writes2)); | 5071 arraysize(data_writes1)); |
| 5072 StaticSocketDataProvider data2(data_reads2, |
| 5073 arraysize(data_reads2), |
| 5074 data_writes2, |
| 5075 arraysize(data_writes2)); |
5024 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 5076 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
5025 session_deps_.socket_factory->AddSocketDataProvider(&data2); | 5077 session_deps_.socket_factory->AddSocketDataProvider(&data2); |
5026 | 5078 |
5027 TestCompletionCallback callback1; | 5079 TestCompletionCallback callback1; |
5028 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); | 5080 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); |
5029 EXPECT_EQ(ERR_IO_PENDING, rv); | 5081 EXPECT_EQ(ERR_IO_PENDING, rv); |
5030 rv = callback1.WaitForResult(); | 5082 rv = callback1.WaitForResult(); |
5031 EXPECT_EQ(OK, rv); | 5083 EXPECT_EQ(OK, rv); |
5032 EXPECT_TRUE(trans->IsReadyToRestartForAuth()); | 5084 EXPECT_TRUE(trans->IsReadyToRestartForAuth()); |
5033 | 5085 |
(...skipping 26 matching lines...) Expand all Loading... |
5060 // wrong (should be "bar"). | 5112 // wrong (should be "bar"). |
5061 request.url = GURL("http://foo:baz@www.google.com/"); | 5113 request.url = GURL("http://foo:baz@www.google.com/"); |
5062 | 5114 |
5063 request.load_flags = LOAD_NORMAL; | 5115 request.load_flags = LOAD_NORMAL; |
5064 | 5116 |
5065 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 5117 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
5066 scoped_ptr<HttpTransaction> trans( | 5118 scoped_ptr<HttpTransaction> trans( |
5067 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 5119 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
5068 | 5120 |
5069 MockWrite data_writes1[] = { | 5121 MockWrite data_writes1[] = { |
5070 MockWrite("GET / HTTP/1.1\r\n" | 5122 MockWrite( |
5071 "Host: www.google.com\r\n" | 5123 "GET / HTTP/1.1\r\n" |
5072 "Connection: keep-alive\r\n\r\n"), | 5124 "Host: www.google.com\r\n" |
| 5125 "Connection: keep-alive\r\n\r\n"), |
5073 }; | 5126 }; |
5074 | 5127 |
5075 MockRead data_reads1[] = { | 5128 MockRead data_reads1[] = { |
5076 MockRead("HTTP/1.0 401 Unauthorized\r\n"), | 5129 MockRead("HTTP/1.0 401 Unauthorized\r\n"), |
5077 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | 5130 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
5078 MockRead("Content-Length: 10\r\n\r\n"), | 5131 MockRead("Content-Length: 10\r\n\r\n"), MockRead(SYNCHRONOUS, ERR_FAILED), |
5079 MockRead(SYNCHRONOUS, ERR_FAILED), | |
5080 }; | 5132 }; |
5081 | 5133 |
5082 // After the challenge above, the transaction will be restarted using the | 5134 // After the challenge above, the transaction will be restarted using the |
5083 // identity from the url (foo, baz) to answer the challenge. | 5135 // identity from the url (foo, baz) to answer the challenge. |
5084 MockWrite data_writes2[] = { | 5136 MockWrite data_writes2[] = { |
5085 MockWrite("GET / HTTP/1.1\r\n" | 5137 MockWrite( |
5086 "Host: www.google.com\r\n" | 5138 "GET / HTTP/1.1\r\n" |
5087 "Connection: keep-alive\r\n" | 5139 "Host: www.google.com\r\n" |
5088 "Authorization: Basic Zm9vOmJheg==\r\n\r\n"), | 5140 "Connection: keep-alive\r\n" |
| 5141 "Authorization: Basic Zm9vOmJheg==\r\n\r\n"), |
5089 }; | 5142 }; |
5090 | 5143 |
5091 MockRead data_reads2[] = { | 5144 MockRead data_reads2[] = { |
5092 MockRead("HTTP/1.0 401 Unauthorized\r\n"), | 5145 MockRead("HTTP/1.0 401 Unauthorized\r\n"), |
5093 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | 5146 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
5094 MockRead("Content-Length: 10\r\n\r\n"), | 5147 MockRead("Content-Length: 10\r\n\r\n"), MockRead(SYNCHRONOUS, ERR_FAILED), |
5095 MockRead(SYNCHRONOUS, ERR_FAILED), | |
5096 }; | 5148 }; |
5097 | 5149 |
5098 // After the challenge above, the transaction will be restarted using the | 5150 // After the challenge above, the transaction will be restarted using the |
5099 // identity supplied by the user (foo, bar) to answer the challenge. | 5151 // identity supplied by the user (foo, bar) to answer the challenge. |
5100 MockWrite data_writes3[] = { | 5152 MockWrite data_writes3[] = { |
5101 MockWrite("GET / HTTP/1.1\r\n" | 5153 MockWrite( |
5102 "Host: www.google.com\r\n" | 5154 "GET / HTTP/1.1\r\n" |
5103 "Connection: keep-alive\r\n" | 5155 "Host: www.google.com\r\n" |
5104 "Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 5156 "Connection: keep-alive\r\n" |
| 5157 "Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
5105 }; | 5158 }; |
5106 | 5159 |
5107 MockRead data_reads3[] = { | 5160 MockRead data_reads3[] = { |
5108 MockRead("HTTP/1.0 200 OK\r\n"), | 5161 MockRead("HTTP/1.0 200 OK\r\n"), MockRead("Content-Length: 100\r\n\r\n"), |
5109 MockRead("Content-Length: 100\r\n\r\n"), | 5162 MockRead(SYNCHRONOUS, OK), |
5110 MockRead(SYNCHRONOUS, OK), | |
5111 }; | 5163 }; |
5112 | 5164 |
5113 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 5165 StaticSocketDataProvider data1(data_reads1, |
5114 data_writes1, arraysize(data_writes1)); | 5166 arraysize(data_reads1), |
5115 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), | 5167 data_writes1, |
5116 data_writes2, arraysize(data_writes2)); | 5168 arraysize(data_writes1)); |
5117 StaticSocketDataProvider data3(data_reads3, arraysize(data_reads3), | 5169 StaticSocketDataProvider data2(data_reads2, |
5118 data_writes3, arraysize(data_writes3)); | 5170 arraysize(data_reads2), |
| 5171 data_writes2, |
| 5172 arraysize(data_writes2)); |
| 5173 StaticSocketDataProvider data3(data_reads3, |
| 5174 arraysize(data_reads3), |
| 5175 data_writes3, |
| 5176 arraysize(data_writes3)); |
5119 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 5177 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
5120 session_deps_.socket_factory->AddSocketDataProvider(&data2); | 5178 session_deps_.socket_factory->AddSocketDataProvider(&data2); |
5121 session_deps_.socket_factory->AddSocketDataProvider(&data3); | 5179 session_deps_.socket_factory->AddSocketDataProvider(&data3); |
5122 | 5180 |
5123 TestCompletionCallback callback1; | 5181 TestCompletionCallback callback1; |
5124 | 5182 |
5125 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); | 5183 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); |
5126 EXPECT_EQ(ERR_IO_PENDING, rv); | 5184 EXPECT_EQ(ERR_IO_PENDING, rv); |
5127 | 5185 |
5128 rv = callback1.WaitForResult(); | 5186 rv = callback1.WaitForResult(); |
5129 EXPECT_EQ(OK, rv); | 5187 EXPECT_EQ(OK, rv); |
5130 | 5188 |
5131 EXPECT_TRUE(trans->IsReadyToRestartForAuth()); | 5189 EXPECT_TRUE(trans->IsReadyToRestartForAuth()); |
5132 TestCompletionCallback callback2; | 5190 TestCompletionCallback callback2; |
5133 rv = trans->RestartWithAuth(AuthCredentials(), callback2.callback()); | 5191 rv = trans->RestartWithAuth(AuthCredentials(), callback2.callback()); |
5134 EXPECT_EQ(ERR_IO_PENDING, rv); | 5192 EXPECT_EQ(ERR_IO_PENDING, rv); |
5135 rv = callback2.WaitForResult(); | 5193 rv = callback2.WaitForResult(); |
5136 EXPECT_EQ(OK, rv); | 5194 EXPECT_EQ(OK, rv); |
5137 EXPECT_FALSE(trans->IsReadyToRestartForAuth()); | 5195 EXPECT_FALSE(trans->IsReadyToRestartForAuth()); |
5138 | 5196 |
5139 const HttpResponseInfo* response = trans->GetResponseInfo(); | 5197 const HttpResponseInfo* response = trans->GetResponseInfo(); |
5140 ASSERT_TRUE(response != NULL); | 5198 ASSERT_TRUE(response != NULL); |
5141 EXPECT_TRUE(CheckBasicServerAuth(response->auth_challenge.get())); | 5199 EXPECT_TRUE(CheckBasicServerAuth(response->auth_challenge.get())); |
5142 | 5200 |
5143 TestCompletionCallback callback3; | 5201 TestCompletionCallback callback3; |
5144 rv = trans->RestartWithAuth( | 5202 rv = |
5145 AuthCredentials(kFoo, kBar), callback3.callback()); | 5203 trans->RestartWithAuth(AuthCredentials(kFoo, kBar), callback3.callback()); |
5146 EXPECT_EQ(ERR_IO_PENDING, rv); | 5204 EXPECT_EQ(ERR_IO_PENDING, rv); |
5147 rv = callback3.WaitForResult(); | 5205 rv = callback3.WaitForResult(); |
5148 EXPECT_EQ(OK, rv); | 5206 EXPECT_EQ(OK, rv); |
5149 EXPECT_FALSE(trans->IsReadyToRestartForAuth()); | 5207 EXPECT_FALSE(trans->IsReadyToRestartForAuth()); |
5150 | 5208 |
5151 response = trans->GetResponseInfo(); | 5209 response = trans->GetResponseInfo(); |
5152 ASSERT_TRUE(response != NULL); | 5210 ASSERT_TRUE(response != NULL); |
5153 | 5211 |
5154 // There is no challenge info, since the identity worked. | 5212 // There is no challenge info, since the identity worked. |
5155 EXPECT_TRUE(response->auth_challenge.get() == NULL); | 5213 EXPECT_TRUE(response->auth_challenge.get() == NULL); |
5156 | 5214 |
5157 EXPECT_EQ(100, response->headers->GetContentLength()); | 5215 EXPECT_EQ(100, response->headers->GetContentLength()); |
5158 | 5216 |
5159 // Empty the current queue. | 5217 // Empty the current queue. |
5160 base::MessageLoop::current()->RunUntilIdle(); | 5218 base::MessageLoop::current()->RunUntilIdle(); |
5161 } | 5219 } |
5162 | 5220 |
5163 | |
5164 // Test the request-challenge-retry sequence for basic auth when there is a | 5221 // Test the request-challenge-retry sequence for basic auth when there is a |
5165 // correct identity in the URL, but its use is being suppressed. The identity | 5222 // correct identity in the URL, but its use is being suppressed. The identity |
5166 // from the URL should never be used. | 5223 // from the URL should never be used. |
5167 TEST_P(HttpNetworkTransactionTest, AuthIdentityInURLSuppressed) { | 5224 TEST_P(HttpNetworkTransactionTest, AuthIdentityInURLSuppressed) { |
5168 HttpRequestInfo request; | 5225 HttpRequestInfo request; |
5169 request.method = "GET"; | 5226 request.method = "GET"; |
5170 request.url = GURL("http://foo:bar@www.google.com/"); | 5227 request.url = GURL("http://foo:bar@www.google.com/"); |
5171 request.load_flags = LOAD_DO_NOT_USE_EMBEDDED_IDENTITY; | 5228 request.load_flags = LOAD_DO_NOT_USE_EMBEDDED_IDENTITY; |
5172 | 5229 |
5173 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 5230 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
5174 scoped_ptr<HttpTransaction> trans( | 5231 scoped_ptr<HttpTransaction> trans( |
5175 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 5232 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
5176 | 5233 |
5177 MockWrite data_writes1[] = { | 5234 MockWrite data_writes1[] = { |
5178 MockWrite("GET / HTTP/1.1\r\n" | 5235 MockWrite( |
5179 "Host: www.google.com\r\n" | 5236 "GET / HTTP/1.1\r\n" |
5180 "Connection: keep-alive\r\n\r\n"), | 5237 "Host: www.google.com\r\n" |
| 5238 "Connection: keep-alive\r\n\r\n"), |
5181 }; | 5239 }; |
5182 | 5240 |
5183 MockRead data_reads1[] = { | 5241 MockRead data_reads1[] = { |
5184 MockRead("HTTP/1.0 401 Unauthorized\r\n"), | 5242 MockRead("HTTP/1.0 401 Unauthorized\r\n"), |
5185 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | 5243 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
5186 MockRead("Content-Length: 10\r\n\r\n"), | 5244 MockRead("Content-Length: 10\r\n\r\n"), MockRead(SYNCHRONOUS, ERR_FAILED), |
5187 MockRead(SYNCHRONOUS, ERR_FAILED), | |
5188 }; | 5245 }; |
5189 | 5246 |
5190 // After the challenge above, the transaction will be restarted using the | 5247 // After the challenge above, the transaction will be restarted using the |
5191 // identity supplied by the user, not the one in the URL, to answer the | 5248 // identity supplied by the user, not the one in the URL, to answer the |
5192 // challenge. | 5249 // challenge. |
5193 MockWrite data_writes3[] = { | 5250 MockWrite data_writes3[] = { |
5194 MockWrite("GET / HTTP/1.1\r\n" | 5251 MockWrite( |
5195 "Host: www.google.com\r\n" | 5252 "GET / HTTP/1.1\r\n" |
5196 "Connection: keep-alive\r\n" | 5253 "Host: www.google.com\r\n" |
5197 "Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 5254 "Connection: keep-alive\r\n" |
| 5255 "Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
5198 }; | 5256 }; |
5199 | 5257 |
5200 MockRead data_reads3[] = { | 5258 MockRead data_reads3[] = { |
5201 MockRead("HTTP/1.0 200 OK\r\n"), | 5259 MockRead("HTTP/1.0 200 OK\r\n"), MockRead("Content-Length: 100\r\n\r\n"), |
5202 MockRead("Content-Length: 100\r\n\r\n"), | 5260 MockRead(SYNCHRONOUS, OK), |
5203 MockRead(SYNCHRONOUS, OK), | |
5204 }; | 5261 }; |
5205 | 5262 |
5206 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 5263 StaticSocketDataProvider data1(data_reads1, |
5207 data_writes1, arraysize(data_writes1)); | 5264 arraysize(data_reads1), |
5208 StaticSocketDataProvider data3(data_reads3, arraysize(data_reads3), | 5265 data_writes1, |
5209 data_writes3, arraysize(data_writes3)); | 5266 arraysize(data_writes1)); |
| 5267 StaticSocketDataProvider data3(data_reads3, |
| 5268 arraysize(data_reads3), |
| 5269 data_writes3, |
| 5270 arraysize(data_writes3)); |
5210 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 5271 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
5211 session_deps_.socket_factory->AddSocketDataProvider(&data3); | 5272 session_deps_.socket_factory->AddSocketDataProvider(&data3); |
5212 | 5273 |
5213 TestCompletionCallback callback1; | 5274 TestCompletionCallback callback1; |
5214 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); | 5275 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); |
5215 EXPECT_EQ(ERR_IO_PENDING, rv); | 5276 EXPECT_EQ(ERR_IO_PENDING, rv); |
5216 rv = callback1.WaitForResult(); | 5277 rv = callback1.WaitForResult(); |
5217 EXPECT_EQ(OK, rv); | 5278 EXPECT_EQ(OK, rv); |
5218 EXPECT_FALSE(trans->IsReadyToRestartForAuth()); | 5279 EXPECT_FALSE(trans->IsReadyToRestartForAuth()); |
5219 | 5280 |
5220 const HttpResponseInfo* response = trans->GetResponseInfo(); | 5281 const HttpResponseInfo* response = trans->GetResponseInfo(); |
5221 ASSERT_TRUE(response != NULL); | 5282 ASSERT_TRUE(response != NULL); |
5222 EXPECT_TRUE(CheckBasicServerAuth(response->auth_challenge.get())); | 5283 EXPECT_TRUE(CheckBasicServerAuth(response->auth_challenge.get())); |
5223 | 5284 |
5224 TestCompletionCallback callback3; | 5285 TestCompletionCallback callback3; |
5225 rv = trans->RestartWithAuth( | 5286 rv = |
5226 AuthCredentials(kFoo, kBar), callback3.callback()); | 5287 trans->RestartWithAuth(AuthCredentials(kFoo, kBar), callback3.callback()); |
5227 EXPECT_EQ(ERR_IO_PENDING, rv); | 5288 EXPECT_EQ(ERR_IO_PENDING, rv); |
5228 rv = callback3.WaitForResult(); | 5289 rv = callback3.WaitForResult(); |
5229 EXPECT_EQ(OK, rv); | 5290 EXPECT_EQ(OK, rv); |
5230 EXPECT_FALSE(trans->IsReadyToRestartForAuth()); | 5291 EXPECT_FALSE(trans->IsReadyToRestartForAuth()); |
5231 | 5292 |
5232 response = trans->GetResponseInfo(); | 5293 response = trans->GetResponseInfo(); |
5233 ASSERT_TRUE(response != NULL); | 5294 ASSERT_TRUE(response != NULL); |
5234 | 5295 |
5235 // There is no challenge info, since the identity worked. | 5296 // There is no challenge info, since the identity worked. |
5236 EXPECT_TRUE(response->auth_challenge.get() == NULL); | 5297 EXPECT_TRUE(response->auth_challenge.get() == NULL); |
(...skipping 11 matching lines...) Expand all Loading... |
5248 { | 5309 { |
5249 HttpRequestInfo request; | 5310 HttpRequestInfo request; |
5250 request.method = "GET"; | 5311 request.method = "GET"; |
5251 request.url = GURL("http://www.google.com/x/y/z"); | 5312 request.url = GURL("http://www.google.com/x/y/z"); |
5252 request.load_flags = 0; | 5313 request.load_flags = 0; |
5253 | 5314 |
5254 scoped_ptr<HttpTransaction> trans( | 5315 scoped_ptr<HttpTransaction> trans( |
5255 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 5316 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
5256 | 5317 |
5257 MockWrite data_writes1[] = { | 5318 MockWrite data_writes1[] = { |
5258 MockWrite("GET /x/y/z HTTP/1.1\r\n" | 5319 MockWrite( |
5259 "Host: www.google.com\r\n" | 5320 "GET /x/y/z HTTP/1.1\r\n" |
5260 "Connection: keep-alive\r\n\r\n"), | 5321 "Host: www.google.com\r\n" |
| 5322 "Connection: keep-alive\r\n\r\n"), |
5261 }; | 5323 }; |
5262 | 5324 |
5263 MockRead data_reads1[] = { | 5325 MockRead data_reads1[] = { |
5264 MockRead("HTTP/1.0 401 Unauthorized\r\n"), | 5326 MockRead("HTTP/1.0 401 Unauthorized\r\n"), |
5265 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | 5327 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
5266 MockRead("Content-Length: 10000\r\n\r\n"), | 5328 MockRead("Content-Length: 10000\r\n\r\n"), |
5267 MockRead(SYNCHRONOUS, ERR_FAILED), | 5329 MockRead(SYNCHRONOUS, ERR_FAILED), |
5268 }; | 5330 }; |
5269 | 5331 |
5270 // Resend with authorization (username=foo, password=bar) | 5332 // Resend with authorization (username=foo, password=bar) |
5271 MockWrite data_writes2[] = { | 5333 MockWrite data_writes2[] = { |
5272 MockWrite("GET /x/y/z HTTP/1.1\r\n" | 5334 MockWrite( |
5273 "Host: www.google.com\r\n" | 5335 "GET /x/y/z HTTP/1.1\r\n" |
5274 "Connection: keep-alive\r\n" | 5336 "Host: www.google.com\r\n" |
5275 "Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 5337 "Connection: keep-alive\r\n" |
| 5338 "Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
5276 }; | 5339 }; |
5277 | 5340 |
5278 // Sever accepts the authorization. | 5341 // Sever accepts the authorization. |
5279 MockRead data_reads2[] = { | 5342 MockRead data_reads2[] = { |
5280 MockRead("HTTP/1.0 200 OK\r\n"), | 5343 MockRead("HTTP/1.0 200 OK\r\n"), |
5281 MockRead("Content-Length: 100\r\n\r\n"), | 5344 MockRead("Content-Length: 100\r\n\r\n"), MockRead(SYNCHRONOUS, OK), |
5282 MockRead(SYNCHRONOUS, OK), | |
5283 }; | 5345 }; |
5284 | 5346 |
5285 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 5347 StaticSocketDataProvider data1(data_reads1, |
5286 data_writes1, arraysize(data_writes1)); | 5348 arraysize(data_reads1), |
5287 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), | 5349 data_writes1, |
5288 data_writes2, arraysize(data_writes2)); | 5350 arraysize(data_writes1)); |
| 5351 StaticSocketDataProvider data2(data_reads2, |
| 5352 arraysize(data_reads2), |
| 5353 data_writes2, |
| 5354 arraysize(data_writes2)); |
5289 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 5355 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
5290 session_deps_.socket_factory->AddSocketDataProvider(&data2); | 5356 session_deps_.socket_factory->AddSocketDataProvider(&data2); |
5291 | 5357 |
5292 TestCompletionCallback callback1; | 5358 TestCompletionCallback callback1; |
5293 | 5359 |
5294 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); | 5360 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); |
5295 EXPECT_EQ(ERR_IO_PENDING, rv); | 5361 EXPECT_EQ(ERR_IO_PENDING, rv); |
5296 | 5362 |
5297 rv = callback1.WaitForResult(); | 5363 rv = callback1.WaitForResult(); |
5298 EXPECT_EQ(OK, rv); | 5364 EXPECT_EQ(OK, rv); |
5299 | 5365 |
5300 const HttpResponseInfo* response = trans->GetResponseInfo(); | 5366 const HttpResponseInfo* response = trans->GetResponseInfo(); |
5301 ASSERT_TRUE(response != NULL); | 5367 ASSERT_TRUE(response != NULL); |
5302 EXPECT_TRUE(CheckBasicServerAuth(response->auth_challenge.get())); | 5368 EXPECT_TRUE(CheckBasicServerAuth(response->auth_challenge.get())); |
5303 | 5369 |
5304 TestCompletionCallback callback2; | 5370 TestCompletionCallback callback2; |
5305 | 5371 |
5306 rv = trans->RestartWithAuth( | 5372 rv = trans->RestartWithAuth(AuthCredentials(kFoo, kBar), |
5307 AuthCredentials(kFoo, kBar), callback2.callback()); | 5373 callback2.callback()); |
5308 EXPECT_EQ(ERR_IO_PENDING, rv); | 5374 EXPECT_EQ(ERR_IO_PENDING, rv); |
5309 | 5375 |
5310 rv = callback2.WaitForResult(); | 5376 rv = callback2.WaitForResult(); |
5311 EXPECT_EQ(OK, rv); | 5377 EXPECT_EQ(OK, rv); |
5312 | 5378 |
5313 response = trans->GetResponseInfo(); | 5379 response = trans->GetResponseInfo(); |
5314 ASSERT_TRUE(response != NULL); | 5380 ASSERT_TRUE(response != NULL); |
5315 EXPECT_TRUE(response->auth_challenge.get() == NULL); | 5381 EXPECT_TRUE(response->auth_challenge.get() == NULL); |
5316 EXPECT_EQ(100, response->headers->GetContentLength()); | 5382 EXPECT_EQ(100, response->headers->GetContentLength()); |
5317 } | 5383 } |
5318 | 5384 |
5319 // ------------------------------------------------------------------------ | 5385 // ------------------------------------------------------------------------ |
5320 | 5386 |
5321 // Transaction 2: authenticate (foo2, bar2) on MyRealm2 | 5387 // Transaction 2: authenticate (foo2, bar2) on MyRealm2 |
5322 { | 5388 { |
5323 HttpRequestInfo request; | 5389 HttpRequestInfo request; |
5324 request.method = "GET"; | 5390 request.method = "GET"; |
5325 // Note that Transaction 1 was at /x/y/z, so this is in the same | 5391 // Note that Transaction 1 was at /x/y/z, so this is in the same |
5326 // protection space as MyRealm1. | 5392 // protection space as MyRealm1. |
5327 request.url = GURL("http://www.google.com/x/y/a/b"); | 5393 request.url = GURL("http://www.google.com/x/y/a/b"); |
5328 request.load_flags = 0; | 5394 request.load_flags = 0; |
5329 | 5395 |
5330 scoped_ptr<HttpTransaction> trans( | 5396 scoped_ptr<HttpTransaction> trans( |
5331 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 5397 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
5332 | 5398 |
5333 MockWrite data_writes1[] = { | 5399 MockWrite data_writes1[] = { |
5334 MockWrite("GET /x/y/a/b HTTP/1.1\r\n" | 5400 MockWrite( |
5335 "Host: www.google.com\r\n" | 5401 "GET /x/y/a/b HTTP/1.1\r\n" |
5336 "Connection: keep-alive\r\n" | 5402 "Host: www.google.com\r\n" |
5337 // Send preemptive authorization for MyRealm1 | 5403 "Connection: keep-alive\r\n" |
5338 "Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 5404 // Send preemptive authorization for MyRealm1 |
| 5405 "Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
5339 }; | 5406 }; |
5340 | 5407 |
5341 // The server didn't like the preemptive authorization, and | 5408 // The server didn't like the preemptive authorization, and |
5342 // challenges us for a different realm (MyRealm2). | 5409 // challenges us for a different realm (MyRealm2). |
5343 MockRead data_reads1[] = { | 5410 MockRead data_reads1[] = { |
5344 MockRead("HTTP/1.0 401 Unauthorized\r\n"), | 5411 MockRead("HTTP/1.0 401 Unauthorized\r\n"), |
5345 MockRead("WWW-Authenticate: Basic realm=\"MyRealm2\"\r\n"), | 5412 MockRead("WWW-Authenticate: Basic realm=\"MyRealm2\"\r\n"), |
5346 MockRead("Content-Length: 10000\r\n\r\n"), | 5413 MockRead("Content-Length: 10000\r\n\r\n"), |
5347 MockRead(SYNCHRONOUS, ERR_FAILED), | 5414 MockRead(SYNCHRONOUS, ERR_FAILED), |
5348 }; | 5415 }; |
5349 | 5416 |
5350 // Resend with authorization for MyRealm2 (username=foo2, password=bar2) | 5417 // Resend with authorization for MyRealm2 (username=foo2, password=bar2) |
5351 MockWrite data_writes2[] = { | 5418 MockWrite data_writes2[] = { |
5352 MockWrite("GET /x/y/a/b HTTP/1.1\r\n" | 5419 MockWrite( |
5353 "Host: www.google.com\r\n" | 5420 "GET /x/y/a/b HTTP/1.1\r\n" |
5354 "Connection: keep-alive\r\n" | 5421 "Host: www.google.com\r\n" |
5355 "Authorization: Basic Zm9vMjpiYXIy\r\n\r\n"), | 5422 "Connection: keep-alive\r\n" |
| 5423 "Authorization: Basic Zm9vMjpiYXIy\r\n\r\n"), |
5356 }; | 5424 }; |
5357 | 5425 |
5358 // Sever accepts the authorization. | 5426 // Sever accepts the authorization. |
5359 MockRead data_reads2[] = { | 5427 MockRead data_reads2[] = { |
5360 MockRead("HTTP/1.0 200 OK\r\n"), | 5428 MockRead("HTTP/1.0 200 OK\r\n"), |
5361 MockRead("Content-Length: 100\r\n\r\n"), | 5429 MockRead("Content-Length: 100\r\n\r\n"), MockRead(SYNCHRONOUS, OK), |
5362 MockRead(SYNCHRONOUS, OK), | |
5363 }; | 5430 }; |
5364 | 5431 |
5365 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 5432 StaticSocketDataProvider data1(data_reads1, |
5366 data_writes1, arraysize(data_writes1)); | 5433 arraysize(data_reads1), |
5367 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), | 5434 data_writes1, |
5368 data_writes2, arraysize(data_writes2)); | 5435 arraysize(data_writes1)); |
| 5436 StaticSocketDataProvider data2(data_reads2, |
| 5437 arraysize(data_reads2), |
| 5438 data_writes2, |
| 5439 arraysize(data_writes2)); |
5369 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 5440 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
5370 session_deps_.socket_factory->AddSocketDataProvider(&data2); | 5441 session_deps_.socket_factory->AddSocketDataProvider(&data2); |
5371 | 5442 |
5372 TestCompletionCallback callback1; | 5443 TestCompletionCallback callback1; |
5373 | 5444 |
5374 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); | 5445 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); |
5375 EXPECT_EQ(ERR_IO_PENDING, rv); | 5446 EXPECT_EQ(ERR_IO_PENDING, rv); |
5376 | 5447 |
5377 rv = callback1.WaitForResult(); | 5448 rv = callback1.WaitForResult(); |
5378 EXPECT_EQ(OK, rv); | 5449 EXPECT_EQ(OK, rv); |
5379 | 5450 |
5380 const HttpResponseInfo* response = trans->GetResponseInfo(); | 5451 const HttpResponseInfo* response = trans->GetResponseInfo(); |
5381 ASSERT_TRUE(response != NULL); | 5452 ASSERT_TRUE(response != NULL); |
5382 ASSERT_TRUE(response->auth_challenge.get()); | 5453 ASSERT_TRUE(response->auth_challenge.get()); |
5383 EXPECT_FALSE(response->auth_challenge->is_proxy); | 5454 EXPECT_FALSE(response->auth_challenge->is_proxy); |
5384 EXPECT_EQ("www.google.com:80", | 5455 EXPECT_EQ("www.google.com:80", |
5385 response->auth_challenge->challenger.ToString()); | 5456 response->auth_challenge->challenger.ToString()); |
5386 EXPECT_EQ("MyRealm2", response->auth_challenge->realm); | 5457 EXPECT_EQ("MyRealm2", response->auth_challenge->realm); |
5387 EXPECT_EQ("basic", response->auth_challenge->scheme); | 5458 EXPECT_EQ("basic", response->auth_challenge->scheme); |
5388 | 5459 |
5389 TestCompletionCallback callback2; | 5460 TestCompletionCallback callback2; |
5390 | 5461 |
5391 rv = trans->RestartWithAuth( | 5462 rv = trans->RestartWithAuth(AuthCredentials(kFoo2, kBar2), |
5392 AuthCredentials(kFoo2, kBar2), callback2.callback()); | 5463 callback2.callback()); |
5393 EXPECT_EQ(ERR_IO_PENDING, rv); | 5464 EXPECT_EQ(ERR_IO_PENDING, rv); |
5394 | 5465 |
5395 rv = callback2.WaitForResult(); | 5466 rv = callback2.WaitForResult(); |
5396 EXPECT_EQ(OK, rv); | 5467 EXPECT_EQ(OK, rv); |
5397 | 5468 |
5398 response = trans->GetResponseInfo(); | 5469 response = trans->GetResponseInfo(); |
5399 ASSERT_TRUE(response != NULL); | 5470 ASSERT_TRUE(response != NULL); |
5400 EXPECT_TRUE(response->auth_challenge.get() == NULL); | 5471 EXPECT_TRUE(response->auth_challenge.get() == NULL); |
5401 EXPECT_EQ(100, response->headers->GetContentLength()); | 5472 EXPECT_EQ(100, response->headers->GetContentLength()); |
5402 } | 5473 } |
5403 | 5474 |
5404 // ------------------------------------------------------------------------ | 5475 // ------------------------------------------------------------------------ |
5405 | 5476 |
5406 // Transaction 3: Resend a request in MyRealm's protection space -- | 5477 // Transaction 3: Resend a request in MyRealm's protection space -- |
5407 // succeed with preemptive authorization. | 5478 // succeed with preemptive authorization. |
5408 { | 5479 { |
5409 HttpRequestInfo request; | 5480 HttpRequestInfo request; |
5410 request.method = "GET"; | 5481 request.method = "GET"; |
5411 request.url = GURL("http://www.google.com/x/y/z2"); | 5482 request.url = GURL("http://www.google.com/x/y/z2"); |
5412 request.load_flags = 0; | 5483 request.load_flags = 0; |
5413 | 5484 |
5414 scoped_ptr<HttpTransaction> trans( | 5485 scoped_ptr<HttpTransaction> trans( |
5415 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 5486 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
5416 | 5487 |
5417 MockWrite data_writes1[] = { | 5488 MockWrite data_writes1[] = { |
5418 MockWrite("GET /x/y/z2 HTTP/1.1\r\n" | 5489 MockWrite( |
5419 "Host: www.google.com\r\n" | 5490 "GET /x/y/z2 HTTP/1.1\r\n" |
5420 "Connection: keep-alive\r\n" | 5491 "Host: www.google.com\r\n" |
5421 // The authorization for MyRealm1 gets sent preemptively | 5492 "Connection: keep-alive\r\n" |
5422 // (since the url is in the same protection space) | 5493 // The authorization for MyRealm1 gets sent preemptively |
5423 "Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 5494 // (since the url is in the same protection space) |
| 5495 "Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
5424 }; | 5496 }; |
5425 | 5497 |
5426 // Sever accepts the preemptive authorization | 5498 // Sever accepts the preemptive authorization |
5427 MockRead data_reads1[] = { | 5499 MockRead data_reads1[] = { |
5428 MockRead("HTTP/1.0 200 OK\r\n"), | 5500 MockRead("HTTP/1.0 200 OK\r\n"), |
5429 MockRead("Content-Length: 100\r\n\r\n"), | 5501 MockRead("Content-Length: 100\r\n\r\n"), MockRead(SYNCHRONOUS, OK), |
5430 MockRead(SYNCHRONOUS, OK), | |
5431 }; | 5502 }; |
5432 | 5503 |
5433 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 5504 StaticSocketDataProvider data1(data_reads1, |
5434 data_writes1, arraysize(data_writes1)); | 5505 arraysize(data_reads1), |
| 5506 data_writes1, |
| 5507 arraysize(data_writes1)); |
5435 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 5508 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
5436 | 5509 |
5437 TestCompletionCallback callback1; | 5510 TestCompletionCallback callback1; |
5438 | 5511 |
5439 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); | 5512 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); |
5440 EXPECT_EQ(ERR_IO_PENDING, rv); | 5513 EXPECT_EQ(ERR_IO_PENDING, rv); |
5441 | 5514 |
5442 rv = callback1.WaitForResult(); | 5515 rv = callback1.WaitForResult(); |
5443 EXPECT_EQ(OK, rv); | 5516 EXPECT_EQ(OK, rv); |
5444 | 5517 |
(...skipping 11 matching lines...) Expand all Loading... |
5456 { | 5529 { |
5457 HttpRequestInfo request; | 5530 HttpRequestInfo request; |
5458 request.method = "GET"; | 5531 request.method = "GET"; |
5459 request.url = GURL("http://www.google.com/x/1"); | 5532 request.url = GURL("http://www.google.com/x/1"); |
5460 request.load_flags = 0; | 5533 request.load_flags = 0; |
5461 | 5534 |
5462 scoped_ptr<HttpTransaction> trans( | 5535 scoped_ptr<HttpTransaction> trans( |
5463 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 5536 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
5464 | 5537 |
5465 MockWrite data_writes1[] = { | 5538 MockWrite data_writes1[] = { |
5466 MockWrite("GET /x/1 HTTP/1.1\r\n" | 5539 MockWrite( |
5467 "Host: www.google.com\r\n" | 5540 "GET /x/1 HTTP/1.1\r\n" |
5468 "Connection: keep-alive\r\n\r\n"), | 5541 "Host: www.google.com\r\n" |
| 5542 "Connection: keep-alive\r\n\r\n"), |
5469 }; | 5543 }; |
5470 | 5544 |
5471 MockRead data_reads1[] = { | 5545 MockRead data_reads1[] = { |
5472 MockRead("HTTP/1.0 401 Unauthorized\r\n"), | 5546 MockRead("HTTP/1.0 401 Unauthorized\r\n"), |
5473 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | 5547 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
5474 MockRead("Content-Length: 10000\r\n\r\n"), | 5548 MockRead("Content-Length: 10000\r\n\r\n"), |
5475 MockRead(SYNCHRONOUS, ERR_FAILED), | 5549 MockRead(SYNCHRONOUS, ERR_FAILED), |
5476 }; | 5550 }; |
5477 | 5551 |
5478 // Resend with authorization from MyRealm's cache. | 5552 // Resend with authorization from MyRealm's cache. |
5479 MockWrite data_writes2[] = { | 5553 MockWrite data_writes2[] = { |
5480 MockWrite("GET /x/1 HTTP/1.1\r\n" | 5554 MockWrite( |
5481 "Host: www.google.com\r\n" | 5555 "GET /x/1 HTTP/1.1\r\n" |
5482 "Connection: keep-alive\r\n" | 5556 "Host: www.google.com\r\n" |
5483 "Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 5557 "Connection: keep-alive\r\n" |
| 5558 "Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
5484 }; | 5559 }; |
5485 | 5560 |
5486 // Sever accepts the authorization. | 5561 // Sever accepts the authorization. |
5487 MockRead data_reads2[] = { | 5562 MockRead data_reads2[] = { |
5488 MockRead("HTTP/1.0 200 OK\r\n"), | 5563 MockRead("HTTP/1.0 200 OK\r\n"), |
5489 MockRead("Content-Length: 100\r\n\r\n"), | 5564 MockRead("Content-Length: 100\r\n\r\n"), MockRead(SYNCHRONOUS, OK), |
5490 MockRead(SYNCHRONOUS, OK), | |
5491 }; | 5565 }; |
5492 | 5566 |
5493 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 5567 StaticSocketDataProvider data1(data_reads1, |
5494 data_writes1, arraysize(data_writes1)); | 5568 arraysize(data_reads1), |
5495 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), | 5569 data_writes1, |
5496 data_writes2, arraysize(data_writes2)); | 5570 arraysize(data_writes1)); |
| 5571 StaticSocketDataProvider data2(data_reads2, |
| 5572 arraysize(data_reads2), |
| 5573 data_writes2, |
| 5574 arraysize(data_writes2)); |
5497 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 5575 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
5498 session_deps_.socket_factory->AddSocketDataProvider(&data2); | 5576 session_deps_.socket_factory->AddSocketDataProvider(&data2); |
5499 | 5577 |
5500 TestCompletionCallback callback1; | 5578 TestCompletionCallback callback1; |
5501 | 5579 |
5502 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); | 5580 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); |
5503 EXPECT_EQ(ERR_IO_PENDING, rv); | 5581 EXPECT_EQ(ERR_IO_PENDING, rv); |
5504 | 5582 |
5505 rv = callback1.WaitForResult(); | 5583 rv = callback1.WaitForResult(); |
5506 EXPECT_EQ(OK, rv); | 5584 EXPECT_EQ(OK, rv); |
(...skipping 19 matching lines...) Expand all Loading... |
5526 { | 5604 { |
5527 HttpRequestInfo request; | 5605 HttpRequestInfo request; |
5528 request.method = "GET"; | 5606 request.method = "GET"; |
5529 request.url = GURL("http://www.google.com/p/q/t"); | 5607 request.url = GURL("http://www.google.com/p/q/t"); |
5530 request.load_flags = 0; | 5608 request.load_flags = 0; |
5531 | 5609 |
5532 scoped_ptr<HttpTransaction> trans( | 5610 scoped_ptr<HttpTransaction> trans( |
5533 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 5611 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
5534 | 5612 |
5535 MockWrite data_writes1[] = { | 5613 MockWrite data_writes1[] = { |
5536 MockWrite("GET /p/q/t HTTP/1.1\r\n" | 5614 MockWrite( |
5537 "Host: www.google.com\r\n" | 5615 "GET /p/q/t HTTP/1.1\r\n" |
5538 "Connection: keep-alive\r\n\r\n"), | 5616 "Host: www.google.com\r\n" |
| 5617 "Connection: keep-alive\r\n\r\n"), |
5539 }; | 5618 }; |
5540 | 5619 |
5541 MockRead data_reads1[] = { | 5620 MockRead data_reads1[] = { |
5542 MockRead("HTTP/1.0 401 Unauthorized\r\n"), | 5621 MockRead("HTTP/1.0 401 Unauthorized\r\n"), |
5543 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | 5622 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
5544 MockRead("Content-Length: 10000\r\n\r\n"), | 5623 MockRead("Content-Length: 10000\r\n\r\n"), |
5545 MockRead(SYNCHRONOUS, ERR_FAILED), | 5624 MockRead(SYNCHRONOUS, ERR_FAILED), |
5546 }; | 5625 }; |
5547 | 5626 |
5548 // Resend with authorization from cache for MyRealm. | 5627 // Resend with authorization from cache for MyRealm. |
5549 MockWrite data_writes2[] = { | 5628 MockWrite data_writes2[] = { |
5550 MockWrite("GET /p/q/t HTTP/1.1\r\n" | 5629 MockWrite( |
5551 "Host: www.google.com\r\n" | 5630 "GET /p/q/t HTTP/1.1\r\n" |
5552 "Connection: keep-alive\r\n" | 5631 "Host: www.google.com\r\n" |
5553 "Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 5632 "Connection: keep-alive\r\n" |
| 5633 "Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
5554 }; | 5634 }; |
5555 | 5635 |
5556 // Sever rejects the authorization. | 5636 // Sever rejects the authorization. |
5557 MockRead data_reads2[] = { | 5637 MockRead data_reads2[] = { |
5558 MockRead("HTTP/1.0 401 Unauthorized\r\n"), | 5638 MockRead("HTTP/1.0 401 Unauthorized\r\n"), |
5559 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | 5639 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
5560 MockRead("Content-Length: 10000\r\n\r\n"), | 5640 MockRead("Content-Length: 10000\r\n\r\n"), |
5561 MockRead(SYNCHRONOUS, ERR_FAILED), | 5641 MockRead(SYNCHRONOUS, ERR_FAILED), |
5562 }; | 5642 }; |
5563 | 5643 |
5564 // At this point we should prompt for new credentials for MyRealm. | 5644 // At this point we should prompt for new credentials for MyRealm. |
5565 // Restart with username=foo3, password=foo4. | 5645 // Restart with username=foo3, password=foo4. |
5566 MockWrite data_writes3[] = { | 5646 MockWrite data_writes3[] = { |
5567 MockWrite("GET /p/q/t HTTP/1.1\r\n" | 5647 MockWrite( |
5568 "Host: www.google.com\r\n" | 5648 "GET /p/q/t HTTP/1.1\r\n" |
5569 "Connection: keep-alive\r\n" | 5649 "Host: www.google.com\r\n" |
5570 "Authorization: Basic Zm9vMzpiYXIz\r\n\r\n"), | 5650 "Connection: keep-alive\r\n" |
| 5651 "Authorization: Basic Zm9vMzpiYXIz\r\n\r\n"), |
5571 }; | 5652 }; |
5572 | 5653 |
5573 // Sever accepts the authorization. | 5654 // Sever accepts the authorization. |
5574 MockRead data_reads3[] = { | 5655 MockRead data_reads3[] = { |
5575 MockRead("HTTP/1.0 200 OK\r\n"), | 5656 MockRead("HTTP/1.0 200 OK\r\n"), |
5576 MockRead("Content-Length: 100\r\n\r\n"), | 5657 MockRead("Content-Length: 100\r\n\r\n"), MockRead(SYNCHRONOUS, OK), |
5577 MockRead(SYNCHRONOUS, OK), | |
5578 }; | 5658 }; |
5579 | 5659 |
5580 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 5660 StaticSocketDataProvider data1(data_reads1, |
5581 data_writes1, arraysize(data_writes1)); | 5661 arraysize(data_reads1), |
5582 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), | 5662 data_writes1, |
5583 data_writes2, arraysize(data_writes2)); | 5663 arraysize(data_writes1)); |
5584 StaticSocketDataProvider data3(data_reads3, arraysize(data_reads3), | 5664 StaticSocketDataProvider data2(data_reads2, |
5585 data_writes3, arraysize(data_writes3)); | 5665 arraysize(data_reads2), |
| 5666 data_writes2, |
| 5667 arraysize(data_writes2)); |
| 5668 StaticSocketDataProvider data3(data_reads3, |
| 5669 arraysize(data_reads3), |
| 5670 data_writes3, |
| 5671 arraysize(data_writes3)); |
5586 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 5672 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
5587 session_deps_.socket_factory->AddSocketDataProvider(&data2); | 5673 session_deps_.socket_factory->AddSocketDataProvider(&data2); |
5588 session_deps_.socket_factory->AddSocketDataProvider(&data3); | 5674 session_deps_.socket_factory->AddSocketDataProvider(&data3); |
5589 | 5675 |
5590 TestCompletionCallback callback1; | 5676 TestCompletionCallback callback1; |
5591 | 5677 |
5592 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); | 5678 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); |
5593 EXPECT_EQ(ERR_IO_PENDING, rv); | 5679 EXPECT_EQ(ERR_IO_PENDING, rv); |
5594 | 5680 |
5595 rv = callback1.WaitForResult(); | 5681 rv = callback1.WaitForResult(); |
5596 EXPECT_EQ(OK, rv); | 5682 EXPECT_EQ(OK, rv); |
5597 | 5683 |
5598 EXPECT_TRUE(trans->IsReadyToRestartForAuth()); | 5684 EXPECT_TRUE(trans->IsReadyToRestartForAuth()); |
5599 TestCompletionCallback callback2; | 5685 TestCompletionCallback callback2; |
5600 rv = trans->RestartWithAuth(AuthCredentials(), callback2.callback()); | 5686 rv = trans->RestartWithAuth(AuthCredentials(), callback2.callback()); |
5601 EXPECT_EQ(ERR_IO_PENDING, rv); | 5687 EXPECT_EQ(ERR_IO_PENDING, rv); |
5602 rv = callback2.WaitForResult(); | 5688 rv = callback2.WaitForResult(); |
5603 EXPECT_EQ(OK, rv); | 5689 EXPECT_EQ(OK, rv); |
5604 EXPECT_FALSE(trans->IsReadyToRestartForAuth()); | 5690 EXPECT_FALSE(trans->IsReadyToRestartForAuth()); |
5605 | 5691 |
5606 const HttpResponseInfo* response = trans->GetResponseInfo(); | 5692 const HttpResponseInfo* response = trans->GetResponseInfo(); |
5607 ASSERT_TRUE(response != NULL); | 5693 ASSERT_TRUE(response != NULL); |
5608 EXPECT_TRUE(CheckBasicServerAuth(response->auth_challenge.get())); | 5694 EXPECT_TRUE(CheckBasicServerAuth(response->auth_challenge.get())); |
5609 | 5695 |
5610 TestCompletionCallback callback3; | 5696 TestCompletionCallback callback3; |
5611 | 5697 |
5612 rv = trans->RestartWithAuth( | 5698 rv = trans->RestartWithAuth(AuthCredentials(kFoo3, kBar3), |
5613 AuthCredentials(kFoo3, kBar3), callback3.callback()); | 5699 callback3.callback()); |
5614 EXPECT_EQ(ERR_IO_PENDING, rv); | 5700 EXPECT_EQ(ERR_IO_PENDING, rv); |
5615 | 5701 |
5616 rv = callback3.WaitForResult(); | 5702 rv = callback3.WaitForResult(); |
5617 EXPECT_EQ(OK, rv); | 5703 EXPECT_EQ(OK, rv); |
5618 | 5704 |
5619 response = trans->GetResponseInfo(); | 5705 response = trans->GetResponseInfo(); |
5620 ASSERT_TRUE(response != NULL); | 5706 ASSERT_TRUE(response != NULL); |
5621 EXPECT_TRUE(response->auth_challenge.get() == NULL); | 5707 EXPECT_TRUE(response->auth_challenge.get() == NULL); |
5622 EXPECT_EQ(100, response->headers->GetContentLength()); | 5708 EXPECT_EQ(100, response->headers->GetContentLength()); |
5623 } | 5709 } |
(...skipping 14 matching lines...) Expand all Loading... |
5638 { | 5724 { |
5639 HttpRequestInfo request; | 5725 HttpRequestInfo request; |
5640 request.method = "GET"; | 5726 request.method = "GET"; |
5641 request.url = GURL("http://www.google.com/x/y/z"); | 5727 request.url = GURL("http://www.google.com/x/y/z"); |
5642 request.load_flags = 0; | 5728 request.load_flags = 0; |
5643 | 5729 |
5644 scoped_ptr<HttpTransaction> trans( | 5730 scoped_ptr<HttpTransaction> trans( |
5645 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 5731 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
5646 | 5732 |
5647 MockWrite data_writes1[] = { | 5733 MockWrite data_writes1[] = { |
5648 MockWrite("GET /x/y/z HTTP/1.1\r\n" | 5734 MockWrite( |
5649 "Host: www.google.com\r\n" | 5735 "GET /x/y/z HTTP/1.1\r\n" |
5650 "Connection: keep-alive\r\n\r\n"), | 5736 "Host: www.google.com\r\n" |
| 5737 "Connection: keep-alive\r\n\r\n"), |
5651 }; | 5738 }; |
5652 | 5739 |
5653 MockRead data_reads1[] = { | 5740 MockRead data_reads1[] = { |
5654 MockRead("HTTP/1.0 401 Unauthorized\r\n"), | 5741 MockRead("HTTP/1.0 401 Unauthorized\r\n"), |
5655 MockRead("WWW-Authenticate: Digest realm=\"digestive\", nonce=\"OU812\", " | 5742 MockRead( |
5656 "algorithm=MD5, qop=\"auth\"\r\n\r\n"), | 5743 "WWW-Authenticate: Digest realm=\"digestive\", nonce=\"OU812\", " |
5657 MockRead(SYNCHRONOUS, OK), | 5744 "algorithm=MD5, qop=\"auth\"\r\n\r\n"), |
| 5745 MockRead(SYNCHRONOUS, OK), |
5658 }; | 5746 }; |
5659 | 5747 |
5660 // Resend with authorization (username=foo, password=bar) | 5748 // Resend with authorization (username=foo, password=bar) |
5661 MockWrite data_writes2[] = { | 5749 MockWrite data_writes2[] = { |
5662 MockWrite("GET /x/y/z HTTP/1.1\r\n" | 5750 MockWrite( |
5663 "Host: www.google.com\r\n" | 5751 "GET /x/y/z HTTP/1.1\r\n" |
5664 "Connection: keep-alive\r\n" | 5752 "Host: www.google.com\r\n" |
5665 "Authorization: Digest username=\"foo\", realm=\"digestive\", " | 5753 "Connection: keep-alive\r\n" |
5666 "nonce=\"OU812\", uri=\"/x/y/z\", algorithm=MD5, " | 5754 "Authorization: Digest username=\"foo\", realm=\"digestive\", " |
5667 "response=\"03ffbcd30add722589c1de345d7a927f\", qop=auth, " | 5755 "nonce=\"OU812\", uri=\"/x/y/z\", algorithm=MD5, " |
5668 "nc=00000001, cnonce=\"0123456789abcdef\"\r\n\r\n"), | 5756 "response=\"03ffbcd30add722589c1de345d7a927f\", qop=auth, " |
| 5757 "nc=00000001, cnonce=\"0123456789abcdef\"\r\n\r\n"), |
5669 }; | 5758 }; |
5670 | 5759 |
5671 // Sever accepts the authorization. | 5760 // Sever accepts the authorization. |
5672 MockRead data_reads2[] = { | 5761 MockRead data_reads2[] = { |
5673 MockRead("HTTP/1.0 200 OK\r\n"), | 5762 MockRead("HTTP/1.0 200 OK\r\n"), MockRead(SYNCHRONOUS, OK), |
5674 MockRead(SYNCHRONOUS, OK), | |
5675 }; | 5763 }; |
5676 | 5764 |
5677 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 5765 StaticSocketDataProvider data1(data_reads1, |
5678 data_writes1, arraysize(data_writes1)); | 5766 arraysize(data_reads1), |
5679 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), | 5767 data_writes1, |
5680 data_writes2, arraysize(data_writes2)); | 5768 arraysize(data_writes1)); |
| 5769 StaticSocketDataProvider data2(data_reads2, |
| 5770 arraysize(data_reads2), |
| 5771 data_writes2, |
| 5772 arraysize(data_writes2)); |
5681 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 5773 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
5682 session_deps_.socket_factory->AddSocketDataProvider(&data2); | 5774 session_deps_.socket_factory->AddSocketDataProvider(&data2); |
5683 | 5775 |
5684 TestCompletionCallback callback1; | 5776 TestCompletionCallback callback1; |
5685 | 5777 |
5686 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); | 5778 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); |
5687 EXPECT_EQ(ERR_IO_PENDING, rv); | 5779 EXPECT_EQ(ERR_IO_PENDING, rv); |
5688 | 5780 |
5689 rv = callback1.WaitForResult(); | 5781 rv = callback1.WaitForResult(); |
5690 EXPECT_EQ(OK, rv); | 5782 EXPECT_EQ(OK, rv); |
5691 | 5783 |
5692 const HttpResponseInfo* response = trans->GetResponseInfo(); | 5784 const HttpResponseInfo* response = trans->GetResponseInfo(); |
5693 ASSERT_TRUE(response != NULL); | 5785 ASSERT_TRUE(response != NULL); |
5694 EXPECT_TRUE(CheckDigestServerAuth(response->auth_challenge.get())); | 5786 EXPECT_TRUE(CheckDigestServerAuth(response->auth_challenge.get())); |
5695 | 5787 |
5696 TestCompletionCallback callback2; | 5788 TestCompletionCallback callback2; |
5697 | 5789 |
5698 rv = trans->RestartWithAuth( | 5790 rv = trans->RestartWithAuth(AuthCredentials(kFoo, kBar), |
5699 AuthCredentials(kFoo, kBar), callback2.callback()); | 5791 callback2.callback()); |
5700 EXPECT_EQ(ERR_IO_PENDING, rv); | 5792 EXPECT_EQ(ERR_IO_PENDING, rv); |
5701 | 5793 |
5702 rv = callback2.WaitForResult(); | 5794 rv = callback2.WaitForResult(); |
5703 EXPECT_EQ(OK, rv); | 5795 EXPECT_EQ(OK, rv); |
5704 | 5796 |
5705 response = trans->GetResponseInfo(); | 5797 response = trans->GetResponseInfo(); |
5706 ASSERT_TRUE(response != NULL); | 5798 ASSERT_TRUE(response != NULL); |
5707 EXPECT_TRUE(response->auth_challenge.get() == NULL); | 5799 EXPECT_TRUE(response->auth_challenge.get() == NULL); |
5708 } | 5800 } |
5709 | 5801 |
5710 // ------------------------------------------------------------------------ | 5802 // ------------------------------------------------------------------------ |
5711 | 5803 |
5712 // Transaction 2: Request another resource in digestive's protection space. | 5804 // Transaction 2: Request another resource in digestive's protection space. |
5713 // This will preemptively add an Authorization header which should have an | 5805 // This will preemptively add an Authorization header which should have an |
5714 // "nc" value of 2 (as compared to 1 in the first use. | 5806 // "nc" value of 2 (as compared to 1 in the first use. |
5715 { | 5807 { |
5716 HttpRequestInfo request; | 5808 HttpRequestInfo request; |
5717 request.method = "GET"; | 5809 request.method = "GET"; |
5718 // Note that Transaction 1 was at /x/y/z, so this is in the same | 5810 // Note that Transaction 1 was at /x/y/z, so this is in the same |
5719 // protection space as digest. | 5811 // protection space as digest. |
5720 request.url = GURL("http://www.google.com/x/y/a/b"); | 5812 request.url = GURL("http://www.google.com/x/y/a/b"); |
5721 request.load_flags = 0; | 5813 request.load_flags = 0; |
5722 | 5814 |
5723 scoped_ptr<HttpTransaction> trans( | 5815 scoped_ptr<HttpTransaction> trans( |
5724 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 5816 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
5725 | 5817 |
5726 MockWrite data_writes1[] = { | 5818 MockWrite data_writes1[] = { |
5727 MockWrite("GET /x/y/a/b HTTP/1.1\r\n" | 5819 MockWrite( |
5728 "Host: www.google.com\r\n" | 5820 "GET /x/y/a/b HTTP/1.1\r\n" |
5729 "Connection: keep-alive\r\n" | 5821 "Host: www.google.com\r\n" |
5730 "Authorization: Digest username=\"foo\", realm=\"digestive\", " | 5822 "Connection: keep-alive\r\n" |
5731 "nonce=\"OU812\", uri=\"/x/y/a/b\", algorithm=MD5, " | 5823 "Authorization: Digest username=\"foo\", realm=\"digestive\", " |
5732 "response=\"d6f9a2c07d1c5df7b89379dca1269b35\", qop=auth, " | 5824 "nonce=\"OU812\", uri=\"/x/y/a/b\", algorithm=MD5, " |
5733 "nc=00000002, cnonce=\"0123456789abcdef\"\r\n\r\n"), | 5825 "response=\"d6f9a2c07d1c5df7b89379dca1269b35\", qop=auth, " |
| 5826 "nc=00000002, cnonce=\"0123456789abcdef\"\r\n\r\n"), |
5734 }; | 5827 }; |
5735 | 5828 |
5736 // Sever accepts the authorization. | 5829 // Sever accepts the authorization. |
5737 MockRead data_reads1[] = { | 5830 MockRead data_reads1[] = { |
5738 MockRead("HTTP/1.0 200 OK\r\n"), | 5831 MockRead("HTTP/1.0 200 OK\r\n"), |
5739 MockRead("Content-Length: 100\r\n\r\n"), | 5832 MockRead("Content-Length: 100\r\n\r\n"), MockRead(SYNCHRONOUS, OK), |
5740 MockRead(SYNCHRONOUS, OK), | |
5741 }; | 5833 }; |
5742 | 5834 |
5743 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 5835 StaticSocketDataProvider data1(data_reads1, |
5744 data_writes1, arraysize(data_writes1)); | 5836 arraysize(data_reads1), |
| 5837 data_writes1, |
| 5838 arraysize(data_writes1)); |
5745 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 5839 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
5746 | 5840 |
5747 TestCompletionCallback callback1; | 5841 TestCompletionCallback callback1; |
5748 | 5842 |
5749 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); | 5843 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); |
5750 EXPECT_EQ(ERR_IO_PENDING, rv); | 5844 EXPECT_EQ(ERR_IO_PENDING, rv); |
5751 | 5845 |
5752 rv = callback1.WaitForResult(); | 5846 rv = callback1.WaitForResult(); |
5753 EXPECT_EQ(OK, rv); | 5847 EXPECT_EQ(OK, rv); |
5754 | 5848 |
(...skipping 15 matching lines...) Expand all Loading... |
5770 trans->read_buf_len_ = 15; | 5864 trans->read_buf_len_ = 15; |
5771 trans->request_headers_.SetHeader("Authorization", "NTLM"); | 5865 trans->request_headers_.SetHeader("Authorization", "NTLM"); |
5772 | 5866 |
5773 // Setup state in response_ | 5867 // Setup state in response_ |
5774 HttpResponseInfo* response = &trans->response_; | 5868 HttpResponseInfo* response = &trans->response_; |
5775 response->auth_challenge = new AuthChallengeInfo(); | 5869 response->auth_challenge = new AuthChallengeInfo(); |
5776 response->ssl_info.cert_status = static_cast<CertStatus>(-1); // Nonsensical. | 5870 response->ssl_info.cert_status = static_cast<CertStatus>(-1); // Nonsensical. |
5777 response->response_time = base::Time::Now(); | 5871 response->response_time = base::Time::Now(); |
5778 response->was_cached = true; // (Wouldn't ever actually be true...) | 5872 response->was_cached = true; // (Wouldn't ever actually be true...) |
5779 | 5873 |
5780 { // Setup state for response_.vary_data | 5874 { // Setup state for response_.vary_data |
5781 HttpRequestInfo request; | 5875 HttpRequestInfo request; |
5782 std::string temp("HTTP/1.1 200 OK\nVary: foo, bar\n\n"); | 5876 std::string temp("HTTP/1.1 200 OK\nVary: foo, bar\n\n"); |
5783 std::replace(temp.begin(), temp.end(), '\n', '\0'); | 5877 std::replace(temp.begin(), temp.end(), '\n', '\0'); |
5784 scoped_refptr<HttpResponseHeaders> headers(new HttpResponseHeaders(temp)); | 5878 scoped_refptr<HttpResponseHeaders> headers(new HttpResponseHeaders(temp)); |
5785 request.extra_headers.SetHeader("Foo", "1"); | 5879 request.extra_headers.SetHeader("Foo", "1"); |
5786 request.extra_headers.SetHeader("bar", "23"); | 5880 request.extra_headers.SetHeader("bar", "23"); |
5787 EXPECT_TRUE(response->vary_data.Init(request, *headers.get())); | 5881 EXPECT_TRUE(response->vary_data.Init(request, *headers.get())); |
5788 } | 5882 } |
5789 | 5883 |
5790 // Cause the above state to be reset. | 5884 // Cause the above state to be reset. |
(...skipping 15 matching lines...) Expand all Loading... |
5806 HttpRequestInfo request; | 5900 HttpRequestInfo request; |
5807 request.method = "GET"; | 5901 request.method = "GET"; |
5808 request.url = GURL("https://www.google.com/"); | 5902 request.url = GURL("https://www.google.com/"); |
5809 request.load_flags = 0; | 5903 request.load_flags = 0; |
5810 | 5904 |
5811 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 5905 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
5812 scoped_ptr<HttpTransaction> trans( | 5906 scoped_ptr<HttpTransaction> trans( |
5813 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 5907 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
5814 | 5908 |
5815 MockWrite data_writes[] = { | 5909 MockWrite data_writes[] = { |
5816 MockWrite("GET / HTTP/1.1\r\n" | 5910 MockWrite( |
5817 "Host: www.google.com\r\n" | 5911 "GET / HTTP/1.1\r\n" |
5818 "Connection: keep-alive\r\n\r\n"), | 5912 "Host: www.google.com\r\n" |
| 5913 "Connection: keep-alive\r\n\r\n"), |
5819 }; | 5914 }; |
5820 | 5915 |
5821 MockRead data_reads[] = { | 5916 MockRead data_reads[] = { |
5822 MockRead("HTTP/1.0 200 OK\r\n"), | 5917 MockRead("HTTP/1.0 200 OK\r\n"), |
5823 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 5918 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
5824 MockRead("Content-Length: 100\r\n\r\n"), | 5919 MockRead("Content-Length: 100\r\n\r\n"), MockRead(SYNCHRONOUS, OK), |
5825 MockRead(SYNCHRONOUS, OK), | |
5826 }; | 5920 }; |
5827 | 5921 |
5828 StaticSocketDataProvider ssl_bad_certificate; | 5922 StaticSocketDataProvider ssl_bad_certificate; |
5829 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 5923 StaticSocketDataProvider data( |
5830 data_writes, arraysize(data_writes)); | 5924 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
5831 SSLSocketDataProvider ssl_bad(ASYNC, ERR_CERT_AUTHORITY_INVALID); | 5925 SSLSocketDataProvider ssl_bad(ASYNC, ERR_CERT_AUTHORITY_INVALID); |
5832 SSLSocketDataProvider ssl(ASYNC, OK); | 5926 SSLSocketDataProvider ssl(ASYNC, OK); |
5833 | 5927 |
5834 session_deps_.socket_factory->AddSocketDataProvider(&ssl_bad_certificate); | 5928 session_deps_.socket_factory->AddSocketDataProvider(&ssl_bad_certificate); |
5835 session_deps_.socket_factory->AddSocketDataProvider(&data); | 5929 session_deps_.socket_factory->AddSocketDataProvider(&data); |
5836 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_bad); | 5930 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_bad); |
5837 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 5931 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
5838 | 5932 |
5839 TestCompletionCallback callback; | 5933 TestCompletionCallback callback; |
5840 | 5934 |
(...skipping 19 matching lines...) Expand all Loading... |
5860 // proxy | 5954 // proxy |
5861 TEST_P(HttpNetworkTransactionTest, HTTPSBadCertificateViaProxy) { | 5955 TEST_P(HttpNetworkTransactionTest, HTTPSBadCertificateViaProxy) { |
5862 session_deps_.proxy_service.reset(ProxyService::CreateFixed("myproxy:70")); | 5956 session_deps_.proxy_service.reset(ProxyService::CreateFixed("myproxy:70")); |
5863 | 5957 |
5864 HttpRequestInfo request; | 5958 HttpRequestInfo request; |
5865 request.method = "GET"; | 5959 request.method = "GET"; |
5866 request.url = GURL("https://www.google.com/"); | 5960 request.url = GURL("https://www.google.com/"); |
5867 request.load_flags = 0; | 5961 request.load_flags = 0; |
5868 | 5962 |
5869 MockWrite proxy_writes[] = { | 5963 MockWrite proxy_writes[] = { |
5870 MockWrite("CONNECT www.google.com:443 HTTP/1.1\r\n" | 5964 MockWrite( |
5871 "Host: www.google.com\r\n" | 5965 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
5872 "Proxy-Connection: keep-alive\r\n\r\n"), | 5966 "Host: www.google.com\r\n" |
| 5967 "Proxy-Connection: keep-alive\r\n\r\n"), |
5873 }; | 5968 }; |
5874 | 5969 |
5875 MockRead proxy_reads[] = { | 5970 MockRead proxy_reads[] = {MockRead("HTTP/1.0 200 Connected\r\n\r\n"), |
5876 MockRead("HTTP/1.0 200 Connected\r\n\r\n"), | 5971 MockRead(SYNCHRONOUS, OK)}; |
5877 MockRead(SYNCHRONOUS, OK) | |
5878 }; | |
5879 | 5972 |
5880 MockWrite data_writes[] = { | 5973 MockWrite data_writes[] = { |
5881 MockWrite("CONNECT www.google.com:443 HTTP/1.1\r\n" | 5974 MockWrite( |
5882 "Host: www.google.com\r\n" | 5975 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
5883 "Proxy-Connection: keep-alive\r\n\r\n"), | 5976 "Host: www.google.com\r\n" |
5884 MockWrite("GET / HTTP/1.1\r\n" | 5977 "Proxy-Connection: keep-alive\r\n\r\n"), |
5885 "Host: www.google.com\r\n" | 5978 MockWrite( |
5886 "Connection: keep-alive\r\n\r\n"), | 5979 "GET / HTTP/1.1\r\n" |
| 5980 "Host: www.google.com\r\n" |
| 5981 "Connection: keep-alive\r\n\r\n"), |
5887 }; | 5982 }; |
5888 | 5983 |
5889 MockRead data_reads[] = { | 5984 MockRead data_reads[] = { |
5890 MockRead("HTTP/1.0 200 Connected\r\n\r\n"), | 5985 MockRead("HTTP/1.0 200 Connected\r\n\r\n"), |
5891 MockRead("HTTP/1.0 200 OK\r\n"), | 5986 MockRead("HTTP/1.0 200 OK\r\n"), |
5892 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 5987 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
5893 MockRead("Content-Length: 100\r\n\r\n"), | 5988 MockRead("Content-Length: 100\r\n\r\n"), |
5894 MockRead(SYNCHRONOUS, OK), | 5989 MockRead(SYNCHRONOUS, OK), |
5895 }; | 5990 }; |
5896 | 5991 |
5897 StaticSocketDataProvider ssl_bad_certificate( | 5992 StaticSocketDataProvider ssl_bad_certificate(proxy_reads, |
5898 proxy_reads, arraysize(proxy_reads), | 5993 arraysize(proxy_reads), |
5899 proxy_writes, arraysize(proxy_writes)); | 5994 proxy_writes, |
5900 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 5995 arraysize(proxy_writes)); |
5901 data_writes, arraysize(data_writes)); | 5996 StaticSocketDataProvider data( |
| 5997 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
5902 SSLSocketDataProvider ssl_bad(ASYNC, ERR_CERT_AUTHORITY_INVALID); | 5998 SSLSocketDataProvider ssl_bad(ASYNC, ERR_CERT_AUTHORITY_INVALID); |
5903 SSLSocketDataProvider ssl(ASYNC, OK); | 5999 SSLSocketDataProvider ssl(ASYNC, OK); |
5904 | 6000 |
5905 session_deps_.socket_factory->AddSocketDataProvider(&ssl_bad_certificate); | 6001 session_deps_.socket_factory->AddSocketDataProvider(&ssl_bad_certificate); |
5906 session_deps_.socket_factory->AddSocketDataProvider(&data); | 6002 session_deps_.socket_factory->AddSocketDataProvider(&data); |
5907 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_bad); | 6003 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_bad); |
5908 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 6004 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
5909 | 6005 |
5910 TestCompletionCallback callback; | 6006 TestCompletionCallback callback; |
5911 | 6007 |
(...skipping 16 matching lines...) Expand all Loading... |
5928 rv = callback.WaitForResult(); | 6024 rv = callback.WaitForResult(); |
5929 EXPECT_EQ(OK, rv); | 6025 EXPECT_EQ(OK, rv); |
5930 | 6026 |
5931 const HttpResponseInfo* response = trans->GetResponseInfo(); | 6027 const HttpResponseInfo* response = trans->GetResponseInfo(); |
5932 | 6028 |
5933 ASSERT_TRUE(response != NULL); | 6029 ASSERT_TRUE(response != NULL); |
5934 EXPECT_EQ(100, response->headers->GetContentLength()); | 6030 EXPECT_EQ(100, response->headers->GetContentLength()); |
5935 } | 6031 } |
5936 } | 6032 } |
5937 | 6033 |
5938 | |
5939 // Test HTTPS connections to a site, going through an HTTPS proxy | 6034 // Test HTTPS connections to a site, going through an HTTPS proxy |
5940 TEST_P(HttpNetworkTransactionTest, HTTPSViaHttpsProxy) { | 6035 TEST_P(HttpNetworkTransactionTest, HTTPSViaHttpsProxy) { |
5941 session_deps_.proxy_service.reset( | 6036 session_deps_.proxy_service.reset( |
5942 ProxyService::CreateFixedFromPacResult("HTTPS proxy:70")); | 6037 ProxyService::CreateFixedFromPacResult("HTTPS proxy:70")); |
5943 CapturingNetLog net_log; | 6038 CapturingNetLog net_log; |
5944 session_deps_.net_log = &net_log; | 6039 session_deps_.net_log = &net_log; |
5945 | 6040 |
5946 HttpRequestInfo request; | 6041 HttpRequestInfo request; |
5947 request.method = "GET"; | 6042 request.method = "GET"; |
5948 request.url = GURL("https://www.google.com/"); | 6043 request.url = GURL("https://www.google.com/"); |
5949 request.load_flags = 0; | 6044 request.load_flags = 0; |
5950 | 6045 |
5951 MockWrite data_writes[] = { | 6046 MockWrite data_writes[] = { |
5952 MockWrite("CONNECT www.google.com:443 HTTP/1.1\r\n" | 6047 MockWrite( |
5953 "Host: www.google.com\r\n" | 6048 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
5954 "Proxy-Connection: keep-alive\r\n\r\n"), | 6049 "Host: www.google.com\r\n" |
5955 MockWrite("GET / HTTP/1.1\r\n" | 6050 "Proxy-Connection: keep-alive\r\n\r\n"), |
5956 "Host: www.google.com\r\n" | 6051 MockWrite( |
5957 "Connection: keep-alive\r\n\r\n"), | 6052 "GET / HTTP/1.1\r\n" |
| 6053 "Host: www.google.com\r\n" |
| 6054 "Connection: keep-alive\r\n\r\n"), |
5958 }; | 6055 }; |
5959 | 6056 |
5960 MockRead data_reads[] = { | 6057 MockRead data_reads[] = { |
5961 MockRead("HTTP/1.0 200 Connected\r\n\r\n"), | 6058 MockRead("HTTP/1.0 200 Connected\r\n\r\n"), |
5962 MockRead("HTTP/1.1 200 OK\r\n"), | 6059 MockRead("HTTP/1.1 200 OK\r\n"), |
5963 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 6060 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
5964 MockRead("Content-Length: 100\r\n\r\n"), | 6061 MockRead("Content-Length: 100\r\n\r\n"), |
5965 MockRead(SYNCHRONOUS, OK), | 6062 MockRead(SYNCHRONOUS, OK), |
5966 }; | 6063 }; |
5967 | 6064 |
5968 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 6065 StaticSocketDataProvider data( |
5969 data_writes, arraysize(data_writes)); | 6066 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
5970 SSLSocketDataProvider proxy_ssl(ASYNC, OK); // SSL to the proxy | 6067 SSLSocketDataProvider proxy_ssl(ASYNC, OK); // SSL to the proxy |
5971 SSLSocketDataProvider tunnel_ssl(ASYNC, OK); // SSL through the tunnel | 6068 SSLSocketDataProvider tunnel_ssl(ASYNC, OK); // SSL through the tunnel |
5972 | 6069 |
5973 session_deps_.socket_factory->AddSocketDataProvider(&data); | 6070 session_deps_.socket_factory->AddSocketDataProvider(&data); |
5974 session_deps_.socket_factory->AddSSLSocketDataProvider(&proxy_ssl); | 6071 session_deps_.socket_factory->AddSSLSocketDataProvider(&proxy_ssl); |
5975 session_deps_.socket_factory->AddSSLSocketDataProvider(&tunnel_ssl); | 6072 session_deps_.socket_factory->AddSSLSocketDataProvider(&tunnel_ssl); |
5976 | 6073 |
5977 TestCompletionCallback callback; | 6074 TestCompletionCallback callback; |
5978 | 6075 |
5979 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 6076 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
5980 scoped_ptr<HttpTransaction> trans( | 6077 scoped_ptr<HttpTransaction> trans( |
(...skipping 25 matching lines...) Expand all Loading... |
6006 ProxyService::CreateFixedFromPacResult("HTTPS proxy:70")); | 6103 ProxyService::CreateFixedFromPacResult("HTTPS proxy:70")); |
6007 CapturingNetLog net_log; | 6104 CapturingNetLog net_log; |
6008 session_deps_.net_log = &net_log; | 6105 session_deps_.net_log = &net_log; |
6009 | 6106 |
6010 HttpRequestInfo request; | 6107 HttpRequestInfo request; |
6011 request.method = "GET"; | 6108 request.method = "GET"; |
6012 request.url = GURL("https://www.google.com/"); | 6109 request.url = GURL("https://www.google.com/"); |
6013 request.load_flags = 0; | 6110 request.load_flags = 0; |
6014 | 6111 |
6015 MockWrite data_writes[] = { | 6112 MockWrite data_writes[] = { |
6016 MockWrite("CONNECT www.google.com:443 HTTP/1.1\r\n" | 6113 MockWrite( |
6017 "Host: www.google.com\r\n" | 6114 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
6018 "Proxy-Connection: keep-alive\r\n\r\n"), | 6115 "Host: www.google.com\r\n" |
| 6116 "Proxy-Connection: keep-alive\r\n\r\n"), |
6019 }; | 6117 }; |
6020 | 6118 |
6021 MockRead data_reads[] = { | 6119 MockRead data_reads[] = { |
6022 MockRead("HTTP/1.1 302 Redirect\r\n"), | 6120 MockRead("HTTP/1.1 302 Redirect\r\n"), |
6023 MockRead("Location: http://login.example.com/\r\n"), | 6121 MockRead("Location: http://login.example.com/\r\n"), |
6024 MockRead("Content-Length: 0\r\n\r\n"), | 6122 MockRead("Content-Length: 0\r\n\r\n"), MockRead(SYNCHRONOUS, OK), |
6025 MockRead(SYNCHRONOUS, OK), | |
6026 }; | 6123 }; |
6027 | 6124 |
6028 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 6125 StaticSocketDataProvider data( |
6029 data_writes, arraysize(data_writes)); | 6126 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
6030 SSLSocketDataProvider proxy_ssl(ASYNC, OK); // SSL to the proxy | 6127 SSLSocketDataProvider proxy_ssl(ASYNC, OK); // SSL to the proxy |
6031 | 6128 |
6032 session_deps_.socket_factory->AddSocketDataProvider(&data); | 6129 session_deps_.socket_factory->AddSocketDataProvider(&data); |
6033 session_deps_.socket_factory->AddSSLSocketDataProvider(&proxy_ssl); | 6130 session_deps_.socket_factory->AddSSLSocketDataProvider(&proxy_ssl); |
6034 | 6131 |
6035 TestCompletionCallback callback; | 6132 TestCompletionCallback callback; |
6036 | 6133 |
6037 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 6134 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
6038 scoped_ptr<HttpTransaction> trans( | 6135 scoped_ptr<HttpTransaction> trans( |
6039 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 6136 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6079 // Test an HTTPS (SPDY) Proxy's ability to redirect a CONNECT request | 6176 // Test an HTTPS (SPDY) Proxy's ability to redirect a CONNECT request |
6080 TEST_P(HttpNetworkTransactionTest, RedirectOfHttpsConnectViaSpdyProxy) { | 6177 TEST_P(HttpNetworkTransactionTest, RedirectOfHttpsConnectViaSpdyProxy) { |
6081 session_deps_.proxy_service.reset( | 6178 session_deps_.proxy_service.reset( |
6082 ProxyService::CreateFixed("https://proxy:70")); | 6179 ProxyService::CreateFixed("https://proxy:70")); |
6083 | 6180 |
6084 HttpRequestInfo request; | 6181 HttpRequestInfo request; |
6085 request.method = "GET"; | 6182 request.method = "GET"; |
6086 request.url = GURL("https://www.google.com/"); | 6183 request.url = GURL("https://www.google.com/"); |
6087 request.load_flags = 0; | 6184 request.load_flags = 0; |
6088 | 6185 |
6089 scoped_ptr<SpdyFrame> conn(spdy_util_.ConstructSpdyConnect(NULL, 0, 1, | 6186 scoped_ptr<SpdyFrame> conn( |
6090 LOWEST)); | 6187 spdy_util_.ConstructSpdyConnect(NULL, 0, 1, LOWEST)); |
6091 scoped_ptr<SpdyFrame> goaway( | 6188 scoped_ptr<SpdyFrame> goaway( |
6092 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 6189 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
6093 MockWrite data_writes[] = { | 6190 MockWrite data_writes[] = { |
6094 CreateMockWrite(*conn.get(), 0, SYNCHRONOUS), | 6191 CreateMockWrite(*conn.get(), 0, SYNCHRONOUS), |
6095 CreateMockWrite(*goaway.get(), 3, SYNCHRONOUS), | 6192 CreateMockWrite(*goaway.get(), 3, SYNCHRONOUS), |
6096 }; | 6193 }; |
6097 | 6194 |
6098 static const char* const kExtraHeaders[] = { | 6195 static const char* const kExtraHeaders[] = { |
6099 "location", | 6196 "location", "http://login.example.com/", |
6100 "http://login.example.com/", | |
6101 }; | 6197 }; |
6102 scoped_ptr<SpdyFrame> resp( | 6198 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdySynReplyError( |
6103 spdy_util_.ConstructSpdySynReplyError("302 Redirect", kExtraHeaders, | 6199 "302 Redirect", kExtraHeaders, arraysize(kExtraHeaders) / 2, 1)); |
6104 arraysize(kExtraHeaders)/2, 1)); | |
6105 MockRead data_reads[] = { | 6200 MockRead data_reads[] = { |
6106 CreateMockRead(*resp.get(), 1, SYNCHRONOUS), | 6201 CreateMockRead(*resp.get(), 1, SYNCHRONOUS), |
6107 MockRead(ASYNC, 0, 2), // EOF | 6202 MockRead(ASYNC, 0, 2), // EOF |
6108 }; | 6203 }; |
6109 | 6204 |
6110 DelayedSocketData data( | 6205 DelayedSocketData data(1, // wait for one write to finish before reading. |
6111 1, // wait for one write to finish before reading. | 6206 data_reads, |
6112 data_reads, arraysize(data_reads), | 6207 arraysize(data_reads), |
6113 data_writes, arraysize(data_writes)); | 6208 data_writes, |
| 6209 arraysize(data_writes)); |
6114 SSLSocketDataProvider proxy_ssl(ASYNC, OK); // SSL to the proxy | 6210 SSLSocketDataProvider proxy_ssl(ASYNC, OK); // SSL to the proxy |
6115 proxy_ssl.SetNextProto(GetParam()); | 6211 proxy_ssl.SetNextProto(GetParam()); |
6116 | 6212 |
6117 session_deps_.socket_factory->AddSocketDataProvider(&data); | 6213 session_deps_.socket_factory->AddSocketDataProvider(&data); |
6118 session_deps_.socket_factory->AddSSLSocketDataProvider(&proxy_ssl); | 6214 session_deps_.socket_factory->AddSSLSocketDataProvider(&proxy_ssl); |
6119 | 6215 |
6120 TestCompletionCallback callback; | 6216 TestCompletionCallback callback; |
6121 | 6217 |
6122 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 6218 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
6123 scoped_ptr<HttpTransaction> trans( | 6219 scoped_ptr<HttpTransaction> trans( |
6124 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 6220 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
6125 | 6221 |
6126 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 6222 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
6127 EXPECT_EQ(ERR_IO_PENDING, rv); | 6223 EXPECT_EQ(ERR_IO_PENDING, rv); |
6128 | 6224 |
6129 rv = callback.WaitForResult(); | 6225 rv = callback.WaitForResult(); |
6130 EXPECT_EQ(OK, rv); | 6226 EXPECT_EQ(OK, rv); |
6131 const HttpResponseInfo* response = trans->GetResponseInfo(); | 6227 const HttpResponseInfo* response = trans->GetResponseInfo(); |
6132 | 6228 |
6133 ASSERT_TRUE(response != NULL); | 6229 ASSERT_TRUE(response != NULL); |
6134 | 6230 |
6135 EXPECT_EQ(302, response->headers->response_code()); | 6231 EXPECT_EQ(302, response->headers->response_code()); |
6136 std::string url; | 6232 std::string url; |
6137 EXPECT_TRUE(response->headers->IsRedirect(&url)); | 6233 EXPECT_TRUE(response->headers->IsRedirect(&url)); |
6138 EXPECT_EQ("http://login.example.com/", url); | 6234 EXPECT_EQ("http://login.example.com/", url); |
6139 } | 6235 } |
6140 | 6236 |
6141 // Test that an HTTPS proxy's response to a CONNECT request is filtered. | 6237 // Test that an HTTPS proxy's response to a CONNECT request is filtered. |
6142 TEST_P(HttpNetworkTransactionTest, | 6238 TEST_P(HttpNetworkTransactionTest, ErrorResponseToHttpsConnectViaHttpsProxy) { |
6143 ErrorResponseToHttpsConnectViaHttpsProxy) { | |
6144 session_deps_.proxy_service.reset( | 6239 session_deps_.proxy_service.reset( |
6145 ProxyService::CreateFixed("https://proxy:70")); | 6240 ProxyService::CreateFixed("https://proxy:70")); |
6146 | 6241 |
6147 HttpRequestInfo request; | 6242 HttpRequestInfo request; |
6148 request.method = "GET"; | 6243 request.method = "GET"; |
6149 request.url = GURL("https://www.google.com/"); | 6244 request.url = GURL("https://www.google.com/"); |
6150 request.load_flags = 0; | 6245 request.load_flags = 0; |
6151 | 6246 |
6152 MockWrite data_writes[] = { | 6247 MockWrite data_writes[] = { |
6153 MockWrite("CONNECT www.google.com:443 HTTP/1.1\r\n" | 6248 MockWrite( |
6154 "Host: www.google.com\r\n" | 6249 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
6155 "Proxy-Connection: keep-alive\r\n\r\n"), | 6250 "Host: www.google.com\r\n" |
| 6251 "Proxy-Connection: keep-alive\r\n\r\n"), |
6156 }; | 6252 }; |
6157 | 6253 |
6158 MockRead data_reads[] = { | 6254 MockRead data_reads[] = { |
6159 MockRead("HTTP/1.1 404 Not Found\r\n"), | 6255 MockRead("HTTP/1.1 404 Not Found\r\n"), |
6160 MockRead("Content-Length: 23\r\n\r\n"), | 6256 MockRead("Content-Length: 23\r\n\r\n"), |
6161 MockRead("The host does not exist"), | 6257 MockRead("The host does not exist"), MockRead(SYNCHRONOUS, OK), |
6162 MockRead(SYNCHRONOUS, OK), | |
6163 }; | 6258 }; |
6164 | 6259 |
6165 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 6260 StaticSocketDataProvider data( |
6166 data_writes, arraysize(data_writes)); | 6261 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
6167 SSLSocketDataProvider proxy_ssl(ASYNC, OK); // SSL to the proxy | 6262 SSLSocketDataProvider proxy_ssl(ASYNC, OK); // SSL to the proxy |
6168 | 6263 |
6169 session_deps_.socket_factory->AddSocketDataProvider(&data); | 6264 session_deps_.socket_factory->AddSocketDataProvider(&data); |
6170 session_deps_.socket_factory->AddSSLSocketDataProvider(&proxy_ssl); | 6265 session_deps_.socket_factory->AddSSLSocketDataProvider(&proxy_ssl); |
6171 | 6266 |
6172 TestCompletionCallback callback; | 6267 TestCompletionCallback callback; |
6173 | 6268 |
6174 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 6269 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
6175 scoped_ptr<HttpTransaction> trans( | 6270 scoped_ptr<HttpTransaction> trans( |
6176 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 6271 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
6177 | 6272 |
6178 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 6273 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
6179 EXPECT_EQ(ERR_IO_PENDING, rv); | 6274 EXPECT_EQ(ERR_IO_PENDING, rv); |
6180 | 6275 |
6181 rv = callback.WaitForResult(); | 6276 rv = callback.WaitForResult(); |
6182 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, rv); | 6277 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, rv); |
6183 | 6278 |
6184 // TODO(ttuttle): Anything else to check here? | 6279 // TODO(ttuttle): Anything else to check here? |
6185 } | 6280 } |
6186 | 6281 |
6187 // Test that a SPDY proxy's response to a CONNECT request is filtered. | 6282 // Test that a SPDY proxy's response to a CONNECT request is filtered. |
6188 TEST_P(HttpNetworkTransactionTest, | 6283 TEST_P(HttpNetworkTransactionTest, ErrorResponseToHttpsConnectViaSpdyProxy) { |
6189 ErrorResponseToHttpsConnectViaSpdyProxy) { | |
6190 session_deps_.proxy_service.reset( | 6284 session_deps_.proxy_service.reset( |
6191 ProxyService::CreateFixed("https://proxy:70")); | 6285 ProxyService::CreateFixed("https://proxy:70")); |
6192 | 6286 |
6193 HttpRequestInfo request; | 6287 HttpRequestInfo request; |
6194 request.method = "GET"; | 6288 request.method = "GET"; |
6195 request.url = GURL("https://www.google.com/"); | 6289 request.url = GURL("https://www.google.com/"); |
6196 request.load_flags = 0; | 6290 request.load_flags = 0; |
6197 | 6291 |
6198 scoped_ptr<SpdyFrame> conn(spdy_util_.ConstructSpdyConnect(NULL, 0, 1, | 6292 scoped_ptr<SpdyFrame> conn( |
6199 LOWEST)); | 6293 spdy_util_.ConstructSpdyConnect(NULL, 0, 1, LOWEST)); |
6200 scoped_ptr<SpdyFrame> rst( | 6294 scoped_ptr<SpdyFrame> rst( |
6201 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 6295 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
6202 MockWrite data_writes[] = { | 6296 MockWrite data_writes[] = { |
6203 CreateMockWrite(*conn.get(), 0, SYNCHRONOUS), | 6297 CreateMockWrite(*conn.get(), 0, SYNCHRONOUS), |
6204 CreateMockWrite(*rst.get(), 3, SYNCHRONOUS), | 6298 CreateMockWrite(*rst.get(), 3, SYNCHRONOUS), |
6205 }; | 6299 }; |
6206 | 6300 |
6207 static const char* const kExtraHeaders[] = { | 6301 static const char* const kExtraHeaders[] = { |
6208 "location", | 6302 "location", "http://login.example.com/", |
6209 "http://login.example.com/", | |
6210 }; | 6303 }; |
6211 scoped_ptr<SpdyFrame> resp( | 6304 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdySynReplyError( |
6212 spdy_util_.ConstructSpdySynReplyError("404 Not Found", kExtraHeaders, | 6305 "404 Not Found", kExtraHeaders, arraysize(kExtraHeaders) / 2, 1)); |
6213 arraysize(kExtraHeaders)/2, 1)); | 6306 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame( |
6214 scoped_ptr<SpdyFrame> body( | 6307 1, "The host does not exist", 23, true)); |
6215 spdy_util_.ConstructSpdyBodyFrame( | |
6216 1, "The host does not exist", 23, true)); | |
6217 MockRead data_reads[] = { | 6308 MockRead data_reads[] = { |
6218 CreateMockRead(*resp.get(), 1, SYNCHRONOUS), | 6309 CreateMockRead(*resp.get(), 1, SYNCHRONOUS), |
6219 CreateMockRead(*body.get(), 2, SYNCHRONOUS), | 6310 CreateMockRead(*body.get(), 2, SYNCHRONOUS), |
6220 MockRead(ASYNC, 0, 4), // EOF | 6311 MockRead(ASYNC, 0, 4), // EOF |
6221 }; | 6312 }; |
6222 | 6313 |
6223 DelayedSocketData data( | 6314 DelayedSocketData data(1, // wait for one write to finish before reading. |
6224 1, // wait for one write to finish before reading. | 6315 data_reads, |
6225 data_reads, arraysize(data_reads), | 6316 arraysize(data_reads), |
6226 data_writes, arraysize(data_writes)); | 6317 data_writes, |
| 6318 arraysize(data_writes)); |
6227 SSLSocketDataProvider proxy_ssl(ASYNC, OK); // SSL to the proxy | 6319 SSLSocketDataProvider proxy_ssl(ASYNC, OK); // SSL to the proxy |
6228 proxy_ssl.SetNextProto(GetParam()); | 6320 proxy_ssl.SetNextProto(GetParam()); |
6229 | 6321 |
6230 session_deps_.socket_factory->AddSocketDataProvider(&data); | 6322 session_deps_.socket_factory->AddSocketDataProvider(&data); |
6231 session_deps_.socket_factory->AddSSLSocketDataProvider(&proxy_ssl); | 6323 session_deps_.socket_factory->AddSSLSocketDataProvider(&proxy_ssl); |
6232 | 6324 |
6233 TestCompletionCallback callback; | 6325 TestCompletionCallback callback; |
6234 | 6326 |
6235 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 6327 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
6236 scoped_ptr<HttpTransaction> trans( | 6328 scoped_ptr<HttpTransaction> trans( |
(...skipping 18 matching lines...) Expand all Loading... |
6255 request.load_flags = net::LOAD_DO_NOT_SEND_AUTH_DATA; | 6347 request.load_flags = net::LOAD_DO_NOT_SEND_AUTH_DATA; |
6256 | 6348 |
6257 // Configure against https proxy server "myproxy:70". | 6349 // Configure against https proxy server "myproxy:70". |
6258 session_deps_.proxy_service.reset( | 6350 session_deps_.proxy_service.reset( |
6259 ProxyService::CreateFixedFromPacResult("HTTPS myproxy:70")); | 6351 ProxyService::CreateFixedFromPacResult("HTTPS myproxy:70")); |
6260 CapturingBoundNetLog log; | 6352 CapturingBoundNetLog log; |
6261 session_deps_.net_log = log.bound().net_log(); | 6353 session_deps_.net_log = log.bound().net_log(); |
6262 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 6354 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
6263 | 6355 |
6264 // Since we have proxy, should try to establish tunnel. | 6356 // Since we have proxy, should try to establish tunnel. |
6265 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyConnect(NULL, 0, 1, | 6357 scoped_ptr<SpdyFrame> req( |
6266 LOWEST)); | 6358 spdy_util_.ConstructSpdyConnect(NULL, 0, 1, LOWEST)); |
6267 scoped_ptr<SpdyFrame> rst( | 6359 scoped_ptr<SpdyFrame> rst( |
6268 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 6360 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
6269 | 6361 |
6270 // After calling trans->RestartWithAuth(), this is the request we should | 6362 // After calling trans->RestartWithAuth(), this is the request we should |
6271 // be issuing -- the final header line contains the credentials. | 6363 // be issuing -- the final header line contains the credentials. |
6272 const char* const kAuthCredentials[] = { | 6364 const char* const kAuthCredentials[] = { |
6273 "proxy-authorization", "Basic Zm9vOmJhcg==", | 6365 "proxy-authorization", "Basic Zm9vOmJhcg==", |
6274 }; | 6366 }; |
6275 scoped_ptr<SpdyFrame> connect2(spdy_util_.ConstructSpdyConnect( | 6367 scoped_ptr<SpdyFrame> connect2(spdy_util_.ConstructSpdyConnect( |
6276 kAuthCredentials, arraysize(kAuthCredentials) / 2, 3, LOWEST)); | 6368 kAuthCredentials, arraysize(kAuthCredentials) / 2, 3, LOWEST)); |
6277 // fetch https://www.google.com/ via HTTP | 6369 // fetch https://www.google.com/ via HTTP |
6278 const char get[] = "GET / HTTP/1.1\r\n" | 6370 const char get[] = |
6279 "Host: www.google.com\r\n" | 6371 "GET / HTTP/1.1\r\n" |
6280 "Connection: keep-alive\r\n\r\n"; | 6372 "Host: www.google.com\r\n" |
| 6373 "Connection: keep-alive\r\n\r\n"; |
6281 scoped_ptr<SpdyFrame> wrapped_get( | 6374 scoped_ptr<SpdyFrame> wrapped_get( |
6282 spdy_util_.ConstructSpdyBodyFrame(3, get, strlen(get), false)); | 6375 spdy_util_.ConstructSpdyBodyFrame(3, get, strlen(get), false)); |
6283 | 6376 |
6284 MockWrite spdy_writes[] = { | 6377 MockWrite spdy_writes[] = { |
6285 CreateMockWrite(*req, 1, ASYNC), | 6378 CreateMockWrite(*req, 1, ASYNC), CreateMockWrite(*rst, 4, ASYNC), |
6286 CreateMockWrite(*rst, 4, ASYNC), | 6379 CreateMockWrite(*connect2, 5), CreateMockWrite(*wrapped_get, 8), |
6287 CreateMockWrite(*connect2, 5), | |
6288 CreateMockWrite(*wrapped_get, 8), | |
6289 }; | 6380 }; |
6290 | 6381 |
6291 // The proxy responds to the connect with a 407, using a persistent | 6382 // The proxy responds to the connect with a 407, using a persistent |
6292 // connection. | 6383 // connection. |
6293 const char* const kAuthChallenge[] = { | 6384 const char* const kAuthChallenge[] = { |
6294 spdy_util_.GetStatusKey(), "407 Proxy Authentication Required", | 6385 spdy_util_.GetStatusKey(), "407 Proxy Authentication Required", |
6295 spdy_util_.GetVersionKey(), "HTTP/1.1", | 6386 spdy_util_.GetVersionKey(), "HTTP/1.1", |
6296 "proxy-authenticate", "Basic realm=\"MyRealm1\"", | 6387 "proxy-authenticate", "Basic realm=\"MyRealm1\"", |
6297 }; | 6388 }; |
6298 | 6389 |
6299 scoped_ptr<SpdyFrame> conn_auth_resp( | 6390 scoped_ptr<SpdyFrame> conn_auth_resp( |
6300 spdy_util_.ConstructSpdyControlFrame(NULL, | 6391 spdy_util_.ConstructSpdyControlFrame(NULL, |
6301 0, | 6392 0, |
6302 false, | 6393 false, |
6303 1, | 6394 1, |
6304 LOWEST, | 6395 LOWEST, |
6305 SYN_REPLY, | 6396 SYN_REPLY, |
6306 CONTROL_FLAG_NONE, | 6397 CONTROL_FLAG_NONE, |
6307 kAuthChallenge, | 6398 kAuthChallenge, |
6308 arraysize(kAuthChallenge), | 6399 arraysize(kAuthChallenge), |
6309 0)); | 6400 0)); |
6310 | 6401 |
6311 scoped_ptr<SpdyFrame> conn_resp( | 6402 scoped_ptr<SpdyFrame> conn_resp( |
6312 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); | 6403 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); |
6313 const char resp[] = "HTTP/1.1 200 OK\r\n" | 6404 const char resp[] = |
| 6405 "HTTP/1.1 200 OK\r\n" |
6314 "Content-Length: 5\r\n\r\n"; | 6406 "Content-Length: 5\r\n\r\n"; |
6315 | 6407 |
6316 scoped_ptr<SpdyFrame> wrapped_get_resp( | 6408 scoped_ptr<SpdyFrame> wrapped_get_resp( |
6317 spdy_util_.ConstructSpdyBodyFrame(3, resp, strlen(resp), false)); | 6409 spdy_util_.ConstructSpdyBodyFrame(3, resp, strlen(resp), false)); |
6318 scoped_ptr<SpdyFrame> wrapped_body( | 6410 scoped_ptr<SpdyFrame> wrapped_body( |
6319 spdy_util_.ConstructSpdyBodyFrame(3, "hello", 5, false)); | 6411 spdy_util_.ConstructSpdyBodyFrame(3, "hello", 5, false)); |
6320 MockRead spdy_reads[] = { | 6412 MockRead spdy_reads[] = { |
6321 CreateMockRead(*conn_auth_resp, 2, ASYNC), | 6413 CreateMockRead(*conn_auth_resp, 2, ASYNC), |
6322 CreateMockRead(*conn_resp, 6, ASYNC), | 6414 CreateMockRead(*conn_resp, 6, ASYNC), |
6323 CreateMockRead(*wrapped_get_resp, 9, ASYNC), | 6415 CreateMockRead(*wrapped_get_resp, 9, ASYNC), |
6324 CreateMockRead(*wrapped_body, 10, ASYNC), | 6416 CreateMockRead(*wrapped_body, 10, ASYNC), |
6325 MockRead(ASYNC, OK, 11), // EOF. May or may not be read. | 6417 MockRead(ASYNC, OK, 11), // EOF. May or may not be read. |
6326 }; | 6418 }; |
6327 | 6419 |
6328 OrderedSocketData spdy_data( | 6420 OrderedSocketData spdy_data( |
6329 spdy_reads, arraysize(spdy_reads), | 6421 spdy_reads, arraysize(spdy_reads), spdy_writes, arraysize(spdy_writes)); |
6330 spdy_writes, arraysize(spdy_writes)); | |
6331 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); | 6422 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); |
6332 // Negotiate SPDY to the proxy | 6423 // Negotiate SPDY to the proxy |
6333 SSLSocketDataProvider proxy(ASYNC, OK); | 6424 SSLSocketDataProvider proxy(ASYNC, OK); |
6334 proxy.SetNextProto(GetParam()); | 6425 proxy.SetNextProto(GetParam()); |
6335 session_deps_.socket_factory->AddSSLSocketDataProvider(&proxy); | 6426 session_deps_.socket_factory->AddSSLSocketDataProvider(&proxy); |
6336 // Vanilla SSL to the server | 6427 // Vanilla SSL to the server |
6337 SSLSocketDataProvider server(ASYNC, OK); | 6428 SSLSocketDataProvider server(ASYNC, OK); |
6338 session_deps_.socket_factory->AddSSLSocketDataProvider(&server); | 6429 session_deps_.socket_factory->AddSSLSocketDataProvider(&server); |
6339 | 6430 |
6340 TestCompletionCallback callback1; | 6431 TestCompletionCallback callback1; |
6341 | 6432 |
6342 scoped_ptr<HttpTransaction> trans( | 6433 scoped_ptr<HttpTransaction> trans( |
6343 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 6434 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
6344 | 6435 |
6345 int rv = trans->Start(&request, callback1.callback(), log.bound()); | 6436 int rv = trans->Start(&request, callback1.callback(), log.bound()); |
6346 EXPECT_EQ(ERR_IO_PENDING, rv); | 6437 EXPECT_EQ(ERR_IO_PENDING, rv); |
6347 | 6438 |
6348 rv = callback1.WaitForResult(); | 6439 rv = callback1.WaitForResult(); |
6349 EXPECT_EQ(OK, rv); | 6440 EXPECT_EQ(OK, rv); |
6350 net::CapturingNetLog::CapturedEntryList entries; | 6441 net::CapturingNetLog::CapturedEntryList entries; |
6351 log.GetEntries(&entries); | 6442 log.GetEntries(&entries); |
6352 size_t pos = ExpectLogContainsSomewhere( | 6443 size_t pos = ExpectLogContainsSomewhere( |
6353 entries, 0, NetLog::TYPE_HTTP_TRANSACTION_SEND_TUNNEL_HEADERS, | 6444 entries, |
| 6445 0, |
| 6446 NetLog::TYPE_HTTP_TRANSACTION_SEND_TUNNEL_HEADERS, |
6354 NetLog::PHASE_NONE); | 6447 NetLog::PHASE_NONE); |
6355 ExpectLogContainsSomewhere( | 6448 ExpectLogContainsSomewhere( |
6356 entries, pos, | 6449 entries, |
| 6450 pos, |
6357 NetLog::TYPE_HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS, | 6451 NetLog::TYPE_HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS, |
6358 NetLog::PHASE_NONE); | 6452 NetLog::PHASE_NONE); |
6359 | 6453 |
6360 const HttpResponseInfo* response = trans->GetResponseInfo(); | 6454 const HttpResponseInfo* response = trans->GetResponseInfo(); |
6361 ASSERT_TRUE(response != NULL); | 6455 ASSERT_TRUE(response != NULL); |
6362 ASSERT_FALSE(response->headers.get() == NULL); | 6456 ASSERT_FALSE(response->headers.get() == NULL); |
6363 EXPECT_EQ(407, response->headers->response_code()); | 6457 EXPECT_EQ(407, response->headers->response_code()); |
6364 EXPECT_TRUE(HttpVersion(1, 1) == response->headers->GetHttpVersion()); | 6458 EXPECT_TRUE(HttpVersion(1, 1) == response->headers->GetHttpVersion()); |
6365 EXPECT_TRUE(response->auth_challenge.get() != NULL); | 6459 EXPECT_TRUE(response->auth_challenge.get() != NULL); |
6366 EXPECT_TRUE(CheckBasicProxyAuth(response->auth_challenge.get())); | 6460 EXPECT_TRUE(CheckBasicProxyAuth(response->auth_challenge.get())); |
6367 | 6461 |
6368 TestCompletionCallback callback2; | 6462 TestCompletionCallback callback2; |
6369 | 6463 |
6370 rv = trans->RestartWithAuth(AuthCredentials(kFoo, kBar), | 6464 rv = |
6371 callback2.callback()); | 6465 trans->RestartWithAuth(AuthCredentials(kFoo, kBar), callback2.callback()); |
6372 EXPECT_EQ(ERR_IO_PENDING, rv); | 6466 EXPECT_EQ(ERR_IO_PENDING, rv); |
6373 | 6467 |
6374 rv = callback2.WaitForResult(); | 6468 rv = callback2.WaitForResult(); |
6375 EXPECT_EQ(OK, rv); | 6469 EXPECT_EQ(OK, rv); |
6376 | 6470 |
6377 response = trans->GetResponseInfo(); | 6471 response = trans->GetResponseInfo(); |
6378 ASSERT_TRUE(response != NULL); | 6472 ASSERT_TRUE(response != NULL); |
6379 | 6473 |
6380 EXPECT_TRUE(response->headers->IsKeepAlive()); | 6474 EXPECT_TRUE(response->headers->IsKeepAlive()); |
6381 EXPECT_EQ(200, response->headers->response_code()); | 6475 EXPECT_EQ(200, response->headers->response_code()); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6413 | 6507 |
6414 // Enable cross-origin push. | 6508 // Enable cross-origin push. |
6415 session_deps_.trusted_spdy_proxy = "myproxy:70"; | 6509 session_deps_.trusted_spdy_proxy = "myproxy:70"; |
6416 | 6510 |
6417 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 6511 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
6418 | 6512 |
6419 scoped_ptr<SpdyFrame> stream1_syn( | 6513 scoped_ptr<SpdyFrame> stream1_syn( |
6420 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, false)); | 6514 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, false)); |
6421 | 6515 |
6422 MockWrite spdy_writes[] = { | 6516 MockWrite spdy_writes[] = { |
6423 CreateMockWrite(*stream1_syn, 1, ASYNC), | 6517 CreateMockWrite(*stream1_syn, 1, ASYNC), |
6424 }; | 6518 }; |
6425 | 6519 |
6426 scoped_ptr<SpdyFrame> | 6520 scoped_ptr<SpdyFrame> stream1_reply( |
6427 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 6521 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
6428 | 6522 |
6429 scoped_ptr<SpdyFrame> | 6523 scoped_ptr<SpdyFrame> stream1_body( |
6430 stream1_body(spdy_util_.ConstructSpdyBodyFrame(1, true)); | 6524 spdy_util_.ConstructSpdyBodyFrame(1, true)); |
6431 | 6525 |
6432 scoped_ptr<SpdyFrame> | 6526 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( |
6433 stream2_syn(spdy_util_.ConstructSpdyPush(NULL, | 6527 NULL, 0, 2, 1, "http://www.another-origin.com/foo.dat")); |
6434 0, | |
6435 2, | |
6436 1, | |
6437 "http://www.another-origin.com/foo.dat")); | |
6438 const char kPushedData[] = "pushed"; | 6528 const char kPushedData[] = "pushed"; |
6439 scoped_ptr<SpdyFrame> stream2_body( | 6529 scoped_ptr<SpdyFrame> stream2_body(spdy_util_.ConstructSpdyBodyFrame( |
6440 spdy_util_.ConstructSpdyBodyFrame( | 6530 2, kPushedData, strlen(kPushedData), true)); |
6441 2, kPushedData, strlen(kPushedData), true)); | |
6442 | 6531 |
6443 MockRead spdy_reads[] = { | 6532 MockRead spdy_reads[] = { |
6444 CreateMockRead(*stream1_reply, 2, ASYNC), | 6533 CreateMockRead(*stream1_reply, 2, ASYNC), |
6445 CreateMockRead(*stream2_syn, 3, ASYNC), | 6534 CreateMockRead(*stream2_syn, 3, ASYNC), |
6446 CreateMockRead(*stream1_body, 4, ASYNC), | 6535 CreateMockRead(*stream1_body, 4, ASYNC), |
6447 CreateMockRead(*stream2_body, 5, ASYNC), | 6536 CreateMockRead(*stream2_body, 5, ASYNC), |
6448 MockRead(ASYNC, ERR_IO_PENDING, 6), // Force a pause | 6537 MockRead(ASYNC, ERR_IO_PENDING, 6), // Force a pause |
6449 }; | 6538 }; |
6450 | 6539 |
6451 OrderedSocketData spdy_data( | 6540 OrderedSocketData spdy_data( |
6452 spdy_reads, arraysize(spdy_reads), | 6541 spdy_reads, arraysize(spdy_reads), spdy_writes, arraysize(spdy_writes)); |
6453 spdy_writes, arraysize(spdy_writes)); | |
6454 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); | 6542 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); |
6455 // Negotiate SPDY to the proxy | 6543 // Negotiate SPDY to the proxy |
6456 SSLSocketDataProvider proxy(ASYNC, OK); | 6544 SSLSocketDataProvider proxy(ASYNC, OK); |
6457 proxy.SetNextProto(GetParam()); | 6545 proxy.SetNextProto(GetParam()); |
6458 session_deps_.socket_factory->AddSSLSocketDataProvider(&proxy); | 6546 session_deps_.socket_factory->AddSSLSocketDataProvider(&proxy); |
6459 | 6547 |
6460 scoped_ptr<HttpTransaction> trans( | 6548 scoped_ptr<HttpTransaction> trans( |
6461 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 6549 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
6462 TestCompletionCallback callback; | 6550 TestCompletionCallback callback; |
6463 int rv = trans->Start(&request, callback.callback(), log.bound()); | 6551 int rv = trans->Start(&request, callback.callback(), log.bound()); |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6531 | 6619 |
6532 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 6620 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
6533 | 6621 |
6534 scoped_ptr<SpdyFrame> stream1_syn( | 6622 scoped_ptr<SpdyFrame> stream1_syn( |
6535 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, false)); | 6623 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, false)); |
6536 | 6624 |
6537 scoped_ptr<SpdyFrame> push_rst( | 6625 scoped_ptr<SpdyFrame> push_rst( |
6538 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); | 6626 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); |
6539 | 6627 |
6540 MockWrite spdy_writes[] = { | 6628 MockWrite spdy_writes[] = { |
6541 CreateMockWrite(*stream1_syn, 1, ASYNC), | 6629 CreateMockWrite(*stream1_syn, 1, ASYNC), CreateMockWrite(*push_rst, 4), |
6542 CreateMockWrite(*push_rst, 4), | |
6543 }; | 6630 }; |
6544 | 6631 |
6545 scoped_ptr<SpdyFrame> | 6632 scoped_ptr<SpdyFrame> stream1_reply( |
6546 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 6633 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
6547 | 6634 |
6548 scoped_ptr<SpdyFrame> | 6635 scoped_ptr<SpdyFrame> stream1_body( |
6549 stream1_body(spdy_util_.ConstructSpdyBodyFrame(1, true)); | 6636 spdy_util_.ConstructSpdyBodyFrame(1, true)); |
6550 | 6637 |
6551 scoped_ptr<SpdyFrame> | 6638 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( |
6552 stream2_syn(spdy_util_.ConstructSpdyPush(NULL, | 6639 NULL, 0, 2, 1, "https://www.another-origin.com/foo.dat")); |
6553 0, | |
6554 2, | |
6555 1, | |
6556 "https://www.another-origin.com/foo.dat")); | |
6557 | 6640 |
6558 MockRead spdy_reads[] = { | 6641 MockRead spdy_reads[] = { |
6559 CreateMockRead(*stream1_reply, 2, ASYNC), | 6642 CreateMockRead(*stream1_reply, 2, ASYNC), |
6560 CreateMockRead(*stream2_syn, 3, ASYNC), | 6643 CreateMockRead(*stream2_syn, 3, ASYNC), |
6561 CreateMockRead(*stream1_body, 5, ASYNC), | 6644 CreateMockRead(*stream1_body, 5, ASYNC), |
6562 MockRead(ASYNC, ERR_IO_PENDING, 6), // Force a pause | 6645 MockRead(ASYNC, ERR_IO_PENDING, 6), // Force a pause |
6563 }; | 6646 }; |
6564 | 6647 |
6565 OrderedSocketData spdy_data( | 6648 OrderedSocketData spdy_data( |
6566 spdy_reads, arraysize(spdy_reads), | 6649 spdy_reads, arraysize(spdy_reads), spdy_writes, arraysize(spdy_writes)); |
6567 spdy_writes, arraysize(spdy_writes)); | |
6568 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); | 6650 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); |
6569 // Negotiate SPDY to the proxy | 6651 // Negotiate SPDY to the proxy |
6570 SSLSocketDataProvider proxy(ASYNC, OK); | 6652 SSLSocketDataProvider proxy(ASYNC, OK); |
6571 proxy.SetNextProto(GetParam()); | 6653 proxy.SetNextProto(GetParam()); |
6572 session_deps_.socket_factory->AddSSLSocketDataProvider(&proxy); | 6654 session_deps_.socket_factory->AddSSLSocketDataProvider(&proxy); |
6573 | 6655 |
6574 scoped_ptr<HttpTransaction> trans( | 6656 scoped_ptr<HttpTransaction> trans( |
6575 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 6657 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
6576 TestCompletionCallback callback; | 6658 TestCompletionCallback callback; |
6577 int rv = trans->Start(&request, callback.callback(), log.bound()); | 6659 int rv = trans->Start(&request, callback.callback(), log.bound()); |
(...skipping 14 matching lines...) Expand all Loading... |
6592 EXPECT_EQ(OK, rv); | 6674 EXPECT_EQ(OK, rv); |
6593 EXPECT_EQ("hello!", response_data); | 6675 EXPECT_EQ("hello!", response_data); |
6594 | 6676 |
6595 trans.reset(); | 6677 trans.reset(); |
6596 session->CloseAllConnections(); | 6678 session->CloseAllConnections(); |
6597 } | 6679 } |
6598 | 6680 |
6599 // Test HTTPS connections to a site with a bad certificate, going through an | 6681 // Test HTTPS connections to a site with a bad certificate, going through an |
6600 // HTTPS proxy | 6682 // HTTPS proxy |
6601 TEST_P(HttpNetworkTransactionTest, HTTPSBadCertificateViaHttpsProxy) { | 6683 TEST_P(HttpNetworkTransactionTest, HTTPSBadCertificateViaHttpsProxy) { |
6602 session_deps_.proxy_service.reset(ProxyService::CreateFixed( | 6684 session_deps_.proxy_service.reset( |
6603 "https://proxy:70")); | 6685 ProxyService::CreateFixed("https://proxy:70")); |
6604 | 6686 |
6605 HttpRequestInfo request; | 6687 HttpRequestInfo request; |
6606 request.method = "GET"; | 6688 request.method = "GET"; |
6607 request.url = GURL("https://www.google.com/"); | 6689 request.url = GURL("https://www.google.com/"); |
6608 request.load_flags = 0; | 6690 request.load_flags = 0; |
6609 | 6691 |
6610 // Attempt to fetch the URL from a server with a bad cert | 6692 // Attempt to fetch the URL from a server with a bad cert |
6611 MockWrite bad_cert_writes[] = { | 6693 MockWrite bad_cert_writes[] = { |
6612 MockWrite("CONNECT www.google.com:443 HTTP/1.1\r\n" | 6694 MockWrite( |
6613 "Host: www.google.com\r\n" | 6695 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
6614 "Proxy-Connection: keep-alive\r\n\r\n"), | 6696 "Host: www.google.com\r\n" |
| 6697 "Proxy-Connection: keep-alive\r\n\r\n"), |
6615 }; | 6698 }; |
6616 | 6699 |
6617 MockRead bad_cert_reads[] = { | 6700 MockRead bad_cert_reads[] = {MockRead("HTTP/1.0 200 Connected\r\n\r\n"), |
6618 MockRead("HTTP/1.0 200 Connected\r\n\r\n"), | 6701 MockRead(SYNCHRONOUS, OK)}; |
6619 MockRead(SYNCHRONOUS, OK) | |
6620 }; | |
6621 | 6702 |
6622 // Attempt to fetch the URL with a good cert | 6703 // Attempt to fetch the URL with a good cert |
6623 MockWrite good_data_writes[] = { | 6704 MockWrite good_data_writes[] = { |
6624 MockWrite("CONNECT www.google.com:443 HTTP/1.1\r\n" | 6705 MockWrite( |
6625 "Host: www.google.com\r\n" | 6706 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
6626 "Proxy-Connection: keep-alive\r\n\r\n"), | 6707 "Host: www.google.com\r\n" |
6627 MockWrite("GET / HTTP/1.1\r\n" | 6708 "Proxy-Connection: keep-alive\r\n\r\n"), |
6628 "Host: www.google.com\r\n" | 6709 MockWrite( |
6629 "Connection: keep-alive\r\n\r\n"), | 6710 "GET / HTTP/1.1\r\n" |
| 6711 "Host: www.google.com\r\n" |
| 6712 "Connection: keep-alive\r\n\r\n"), |
6630 }; | 6713 }; |
6631 | 6714 |
6632 MockRead good_cert_reads[] = { | 6715 MockRead good_cert_reads[] = { |
6633 MockRead("HTTP/1.0 200 Connected\r\n\r\n"), | 6716 MockRead("HTTP/1.0 200 Connected\r\n\r\n"), |
6634 MockRead("HTTP/1.0 200 OK\r\n"), | 6717 MockRead("HTTP/1.0 200 OK\r\n"), |
6635 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 6718 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
6636 MockRead("Content-Length: 100\r\n\r\n"), | 6719 MockRead("Content-Length: 100\r\n\r\n"), |
6637 MockRead(SYNCHRONOUS, OK), | 6720 MockRead(SYNCHRONOUS, OK), |
6638 }; | 6721 }; |
6639 | 6722 |
6640 StaticSocketDataProvider ssl_bad_certificate( | 6723 StaticSocketDataProvider ssl_bad_certificate(bad_cert_reads, |
6641 bad_cert_reads, arraysize(bad_cert_reads), | 6724 arraysize(bad_cert_reads), |
6642 bad_cert_writes, arraysize(bad_cert_writes)); | 6725 bad_cert_writes, |
6643 StaticSocketDataProvider data(good_cert_reads, arraysize(good_cert_reads), | 6726 arraysize(bad_cert_writes)); |
6644 good_data_writes, arraysize(good_data_writes)); | 6727 StaticSocketDataProvider data(good_cert_reads, |
| 6728 arraysize(good_cert_reads), |
| 6729 good_data_writes, |
| 6730 arraysize(good_data_writes)); |
6645 SSLSocketDataProvider ssl_bad(ASYNC, ERR_CERT_AUTHORITY_INVALID); | 6731 SSLSocketDataProvider ssl_bad(ASYNC, ERR_CERT_AUTHORITY_INVALID); |
6646 SSLSocketDataProvider ssl(ASYNC, OK); | 6732 SSLSocketDataProvider ssl(ASYNC, OK); |
6647 | 6733 |
6648 // SSL to the proxy, then CONNECT request, then SSL with bad certificate | 6734 // SSL to the proxy, then CONNECT request, then SSL with bad certificate |
6649 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 6735 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
6650 session_deps_.socket_factory->AddSocketDataProvider(&ssl_bad_certificate); | 6736 session_deps_.socket_factory->AddSocketDataProvider(&ssl_bad_certificate); |
6651 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_bad); | 6737 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_bad); |
6652 | 6738 |
6653 // SSL to the proxy, then CONNECT request, then valid SSL certificate | 6739 // SSL to the proxy, then CONNECT request, then valid SSL certificate |
6654 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 6740 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
(...skipping 29 matching lines...) Expand all Loading... |
6684 request.method = "GET"; | 6770 request.method = "GET"; |
6685 request.url = GURL("http://www.google.com/"); | 6771 request.url = GURL("http://www.google.com/"); |
6686 request.extra_headers.SetHeader(HttpRequestHeaders::kUserAgent, | 6772 request.extra_headers.SetHeader(HttpRequestHeaders::kUserAgent, |
6687 "Chromium Ultra Awesome X Edition"); | 6773 "Chromium Ultra Awesome X Edition"); |
6688 | 6774 |
6689 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 6775 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
6690 scoped_ptr<HttpTransaction> trans( | 6776 scoped_ptr<HttpTransaction> trans( |
6691 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 6777 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
6692 | 6778 |
6693 MockWrite data_writes[] = { | 6779 MockWrite data_writes[] = { |
6694 MockWrite("GET / HTTP/1.1\r\n" | 6780 MockWrite( |
6695 "Host: www.google.com\r\n" | 6781 "GET / HTTP/1.1\r\n" |
6696 "Connection: keep-alive\r\n" | 6782 "Host: www.google.com\r\n" |
6697 "User-Agent: Chromium Ultra Awesome X Edition\r\n\r\n"), | 6783 "Connection: keep-alive\r\n" |
| 6784 "User-Agent: Chromium Ultra Awesome X Edition\r\n\r\n"), |
6698 }; | 6785 }; |
6699 | 6786 |
6700 // Lastly, the server responds with the actual content. | 6787 // Lastly, the server responds with the actual content. |
6701 MockRead data_reads[] = { | 6788 MockRead data_reads[] = { |
6702 MockRead("HTTP/1.0 200 OK\r\n"), | 6789 MockRead("HTTP/1.0 200 OK\r\n"), |
6703 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 6790 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
6704 MockRead("Content-Length: 100\r\n\r\n"), | 6791 MockRead("Content-Length: 100\r\n\r\n"), MockRead(SYNCHRONOUS, OK), |
6705 MockRead(SYNCHRONOUS, OK), | |
6706 }; | 6792 }; |
6707 | 6793 |
6708 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 6794 StaticSocketDataProvider data( |
6709 data_writes, arraysize(data_writes)); | 6795 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
6710 session_deps_.socket_factory->AddSocketDataProvider(&data); | 6796 session_deps_.socket_factory->AddSocketDataProvider(&data); |
6711 | 6797 |
6712 TestCompletionCallback callback; | 6798 TestCompletionCallback callback; |
6713 | 6799 |
6714 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 6800 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
6715 EXPECT_EQ(ERR_IO_PENDING, rv); | 6801 EXPECT_EQ(ERR_IO_PENDING, rv); |
6716 | 6802 |
6717 rv = callback.WaitForResult(); | 6803 rv = callback.WaitForResult(); |
6718 EXPECT_EQ(OK, rv); | 6804 EXPECT_EQ(OK, rv); |
6719 } | 6805 } |
6720 | 6806 |
6721 TEST_P(HttpNetworkTransactionTest, BuildRequest_UserAgentOverTunnel) { | 6807 TEST_P(HttpNetworkTransactionTest, BuildRequest_UserAgentOverTunnel) { |
6722 HttpRequestInfo request; | 6808 HttpRequestInfo request; |
6723 request.method = "GET"; | 6809 request.method = "GET"; |
6724 request.url = GURL("https://www.google.com/"); | 6810 request.url = GURL("https://www.google.com/"); |
6725 request.extra_headers.SetHeader(HttpRequestHeaders::kUserAgent, | 6811 request.extra_headers.SetHeader(HttpRequestHeaders::kUserAgent, |
6726 "Chromium Ultra Awesome X Edition"); | 6812 "Chromium Ultra Awesome X Edition"); |
6727 | 6813 |
6728 session_deps_.proxy_service.reset(ProxyService::CreateFixed("myproxy:70")); | 6814 session_deps_.proxy_service.reset(ProxyService::CreateFixed("myproxy:70")); |
6729 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 6815 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
6730 scoped_ptr<HttpTransaction> trans( | 6816 scoped_ptr<HttpTransaction> trans( |
6731 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 6817 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
6732 | 6818 |
6733 MockWrite data_writes[] = { | 6819 MockWrite data_writes[] = { |
6734 MockWrite("CONNECT www.google.com:443 HTTP/1.1\r\n" | 6820 MockWrite( |
6735 "Host: www.google.com\r\n" | 6821 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
6736 "Proxy-Connection: keep-alive\r\n" | 6822 "Host: www.google.com\r\n" |
6737 "User-Agent: Chromium Ultra Awesome X Edition\r\n\r\n"), | 6823 "Proxy-Connection: keep-alive\r\n" |
| 6824 "User-Agent: Chromium Ultra Awesome X Edition\r\n\r\n"), |
6738 }; | 6825 }; |
6739 MockRead data_reads[] = { | 6826 MockRead data_reads[] = { |
6740 // Return an error, so the transaction stops here (this test isn't | 6827 // Return an error, so the transaction stops here (this test isn't |
6741 // interested in the rest). | 6828 // interested in the rest). |
6742 MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"), | 6829 MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"), |
6743 MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | 6830 MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
6744 MockRead("Proxy-Connection: close\r\n\r\n"), | 6831 MockRead("Proxy-Connection: close\r\n\r\n"), |
6745 }; | 6832 }; |
6746 | 6833 |
6747 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 6834 StaticSocketDataProvider data( |
6748 data_writes, arraysize(data_writes)); | 6835 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
6749 session_deps_.socket_factory->AddSocketDataProvider(&data); | 6836 session_deps_.socket_factory->AddSocketDataProvider(&data); |
6750 | 6837 |
6751 TestCompletionCallback callback; | 6838 TestCompletionCallback callback; |
6752 | 6839 |
6753 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 6840 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
6754 EXPECT_EQ(ERR_IO_PENDING, rv); | 6841 EXPECT_EQ(ERR_IO_PENDING, rv); |
6755 | 6842 |
6756 rv = callback.WaitForResult(); | 6843 rv = callback.WaitForResult(); |
6757 EXPECT_EQ(OK, rv); | 6844 EXPECT_EQ(OK, rv); |
6758 } | 6845 } |
6759 | 6846 |
6760 TEST_P(HttpNetworkTransactionTest, BuildRequest_Referer) { | 6847 TEST_P(HttpNetworkTransactionTest, BuildRequest_Referer) { |
6761 HttpRequestInfo request; | 6848 HttpRequestInfo request; |
6762 request.method = "GET"; | 6849 request.method = "GET"; |
6763 request.url = GURL("http://www.google.com/"); | 6850 request.url = GURL("http://www.google.com/"); |
6764 request.load_flags = 0; | 6851 request.load_flags = 0; |
6765 request.extra_headers.SetHeader(HttpRequestHeaders::kReferer, | 6852 request.extra_headers.SetHeader(HttpRequestHeaders::kReferer, |
6766 "http://the.previous.site.com/"); | 6853 "http://the.previous.site.com/"); |
6767 | 6854 |
6768 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 6855 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
6769 scoped_ptr<HttpTransaction> trans( | 6856 scoped_ptr<HttpTransaction> trans( |
6770 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 6857 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
6771 | 6858 |
6772 MockWrite data_writes[] = { | 6859 MockWrite data_writes[] = { |
6773 MockWrite("GET / HTTP/1.1\r\n" | 6860 MockWrite( |
6774 "Host: www.google.com\r\n" | 6861 "GET / HTTP/1.1\r\n" |
6775 "Connection: keep-alive\r\n" | 6862 "Host: www.google.com\r\n" |
6776 "Referer: http://the.previous.site.com/\r\n\r\n"), | 6863 "Connection: keep-alive\r\n" |
| 6864 "Referer: http://the.previous.site.com/\r\n\r\n"), |
6777 }; | 6865 }; |
6778 | 6866 |
6779 // Lastly, the server responds with the actual content. | 6867 // Lastly, the server responds with the actual content. |
6780 MockRead data_reads[] = { | 6868 MockRead data_reads[] = { |
6781 MockRead("HTTP/1.0 200 OK\r\n"), | 6869 MockRead("HTTP/1.0 200 OK\r\n"), |
6782 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 6870 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
6783 MockRead("Content-Length: 100\r\n\r\n"), | 6871 MockRead("Content-Length: 100\r\n\r\n"), MockRead(SYNCHRONOUS, OK), |
6784 MockRead(SYNCHRONOUS, OK), | |
6785 }; | 6872 }; |
6786 | 6873 |
6787 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 6874 StaticSocketDataProvider data( |
6788 data_writes, arraysize(data_writes)); | 6875 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
6789 session_deps_.socket_factory->AddSocketDataProvider(&data); | 6876 session_deps_.socket_factory->AddSocketDataProvider(&data); |
6790 | 6877 |
6791 TestCompletionCallback callback; | 6878 TestCompletionCallback callback; |
6792 | 6879 |
6793 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 6880 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
6794 EXPECT_EQ(ERR_IO_PENDING, rv); | 6881 EXPECT_EQ(ERR_IO_PENDING, rv); |
6795 | 6882 |
6796 rv = callback.WaitForResult(); | 6883 rv = callback.WaitForResult(); |
6797 EXPECT_EQ(OK, rv); | 6884 EXPECT_EQ(OK, rv); |
6798 } | 6885 } |
6799 | 6886 |
6800 TEST_P(HttpNetworkTransactionTest, BuildRequest_PostContentLengthZero) { | 6887 TEST_P(HttpNetworkTransactionTest, BuildRequest_PostContentLengthZero) { |
6801 HttpRequestInfo request; | 6888 HttpRequestInfo request; |
6802 request.method = "POST"; | 6889 request.method = "POST"; |
6803 request.url = GURL("http://www.google.com/"); | 6890 request.url = GURL("http://www.google.com/"); |
6804 | 6891 |
6805 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 6892 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
6806 scoped_ptr<HttpTransaction> trans( | 6893 scoped_ptr<HttpTransaction> trans( |
6807 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 6894 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
6808 | 6895 |
6809 MockWrite data_writes[] = { | 6896 MockWrite data_writes[] = { |
6810 MockWrite("POST / HTTP/1.1\r\n" | 6897 MockWrite( |
6811 "Host: www.google.com\r\n" | 6898 "POST / HTTP/1.1\r\n" |
6812 "Connection: keep-alive\r\n" | 6899 "Host: www.google.com\r\n" |
6813 "Content-Length: 0\r\n\r\n"), | 6900 "Connection: keep-alive\r\n" |
| 6901 "Content-Length: 0\r\n\r\n"), |
6814 }; | 6902 }; |
6815 | 6903 |
6816 // Lastly, the server responds with the actual content. | 6904 // Lastly, the server responds with the actual content. |
6817 MockRead data_reads[] = { | 6905 MockRead data_reads[] = { |
6818 MockRead("HTTP/1.0 200 OK\r\n"), | 6906 MockRead("HTTP/1.0 200 OK\r\n"), |
6819 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 6907 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
6820 MockRead("Content-Length: 100\r\n\r\n"), | 6908 MockRead("Content-Length: 100\r\n\r\n"), MockRead(SYNCHRONOUS, OK), |
6821 MockRead(SYNCHRONOUS, OK), | |
6822 }; | 6909 }; |
6823 | 6910 |
6824 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 6911 StaticSocketDataProvider data( |
6825 data_writes, arraysize(data_writes)); | 6912 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
6826 session_deps_.socket_factory->AddSocketDataProvider(&data); | 6913 session_deps_.socket_factory->AddSocketDataProvider(&data); |
6827 | 6914 |
6828 TestCompletionCallback callback; | 6915 TestCompletionCallback callback; |
6829 | 6916 |
6830 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 6917 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
6831 EXPECT_EQ(ERR_IO_PENDING, rv); | 6918 EXPECT_EQ(ERR_IO_PENDING, rv); |
6832 | 6919 |
6833 rv = callback.WaitForResult(); | 6920 rv = callback.WaitForResult(); |
6834 EXPECT_EQ(OK, rv); | 6921 EXPECT_EQ(OK, rv); |
6835 } | 6922 } |
6836 | 6923 |
6837 TEST_P(HttpNetworkTransactionTest, BuildRequest_PutContentLengthZero) { | 6924 TEST_P(HttpNetworkTransactionTest, BuildRequest_PutContentLengthZero) { |
6838 HttpRequestInfo request; | 6925 HttpRequestInfo request; |
6839 request.method = "PUT"; | 6926 request.method = "PUT"; |
6840 request.url = GURL("http://www.google.com/"); | 6927 request.url = GURL("http://www.google.com/"); |
6841 | 6928 |
6842 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 6929 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
6843 scoped_ptr<HttpTransaction> trans( | 6930 scoped_ptr<HttpTransaction> trans( |
6844 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 6931 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
6845 | 6932 |
6846 MockWrite data_writes[] = { | 6933 MockWrite data_writes[] = { |
6847 MockWrite("PUT / HTTP/1.1\r\n" | 6934 MockWrite( |
6848 "Host: www.google.com\r\n" | 6935 "PUT / HTTP/1.1\r\n" |
6849 "Connection: keep-alive\r\n" | 6936 "Host: www.google.com\r\n" |
6850 "Content-Length: 0\r\n\r\n"), | 6937 "Connection: keep-alive\r\n" |
| 6938 "Content-Length: 0\r\n\r\n"), |
6851 }; | 6939 }; |
6852 | 6940 |
6853 // Lastly, the server responds with the actual content. | 6941 // Lastly, the server responds with the actual content. |
6854 MockRead data_reads[] = { | 6942 MockRead data_reads[] = { |
6855 MockRead("HTTP/1.0 200 OK\r\n"), | 6943 MockRead("HTTP/1.0 200 OK\r\n"), |
6856 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 6944 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
6857 MockRead("Content-Length: 100\r\n\r\n"), | 6945 MockRead("Content-Length: 100\r\n\r\n"), MockRead(SYNCHRONOUS, OK), |
6858 MockRead(SYNCHRONOUS, OK), | |
6859 }; | 6946 }; |
6860 | 6947 |
6861 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 6948 StaticSocketDataProvider data( |
6862 data_writes, arraysize(data_writes)); | 6949 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
6863 session_deps_.socket_factory->AddSocketDataProvider(&data); | 6950 session_deps_.socket_factory->AddSocketDataProvider(&data); |
6864 | 6951 |
6865 TestCompletionCallback callback; | 6952 TestCompletionCallback callback; |
6866 | 6953 |
6867 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 6954 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
6868 EXPECT_EQ(ERR_IO_PENDING, rv); | 6955 EXPECT_EQ(ERR_IO_PENDING, rv); |
6869 | 6956 |
6870 rv = callback.WaitForResult(); | 6957 rv = callback.WaitForResult(); |
6871 EXPECT_EQ(OK, rv); | 6958 EXPECT_EQ(OK, rv); |
6872 } | 6959 } |
6873 | 6960 |
6874 TEST_P(HttpNetworkTransactionTest, BuildRequest_HeadContentLengthZero) { | 6961 TEST_P(HttpNetworkTransactionTest, BuildRequest_HeadContentLengthZero) { |
6875 HttpRequestInfo request; | 6962 HttpRequestInfo request; |
6876 request.method = "HEAD"; | 6963 request.method = "HEAD"; |
6877 request.url = GURL("http://www.google.com/"); | 6964 request.url = GURL("http://www.google.com/"); |
6878 | 6965 |
6879 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 6966 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
6880 scoped_ptr<HttpTransaction> trans( | 6967 scoped_ptr<HttpTransaction> trans( |
6881 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 6968 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
6882 | 6969 |
6883 MockWrite data_writes[] = { | 6970 MockWrite data_writes[] = { |
6884 MockWrite("HEAD / HTTP/1.1\r\n" | 6971 MockWrite( |
6885 "Host: www.google.com\r\n" | 6972 "HEAD / HTTP/1.1\r\n" |
6886 "Connection: keep-alive\r\n" | 6973 "Host: www.google.com\r\n" |
6887 "Content-Length: 0\r\n\r\n"), | 6974 "Connection: keep-alive\r\n" |
| 6975 "Content-Length: 0\r\n\r\n"), |
6888 }; | 6976 }; |
6889 | 6977 |
6890 // Lastly, the server responds with the actual content. | 6978 // Lastly, the server responds with the actual content. |
6891 MockRead data_reads[] = { | 6979 MockRead data_reads[] = { |
6892 MockRead("HTTP/1.0 200 OK\r\n"), | 6980 MockRead("HTTP/1.0 200 OK\r\n"), |
6893 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 6981 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
6894 MockRead("Content-Length: 100\r\n\r\n"), | 6982 MockRead("Content-Length: 100\r\n\r\n"), MockRead(SYNCHRONOUS, OK), |
6895 MockRead(SYNCHRONOUS, OK), | |
6896 }; | 6983 }; |
6897 | 6984 |
6898 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 6985 StaticSocketDataProvider data( |
6899 data_writes, arraysize(data_writes)); | 6986 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
6900 session_deps_.socket_factory->AddSocketDataProvider(&data); | 6987 session_deps_.socket_factory->AddSocketDataProvider(&data); |
6901 | 6988 |
6902 TestCompletionCallback callback; | 6989 TestCompletionCallback callback; |
6903 | 6990 |
6904 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 6991 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
6905 EXPECT_EQ(ERR_IO_PENDING, rv); | 6992 EXPECT_EQ(ERR_IO_PENDING, rv); |
6906 | 6993 |
6907 rv = callback.WaitForResult(); | 6994 rv = callback.WaitForResult(); |
6908 EXPECT_EQ(OK, rv); | 6995 EXPECT_EQ(OK, rv); |
6909 } | 6996 } |
6910 | 6997 |
6911 TEST_P(HttpNetworkTransactionTest, BuildRequest_CacheControlNoCache) { | 6998 TEST_P(HttpNetworkTransactionTest, BuildRequest_CacheControlNoCache) { |
6912 HttpRequestInfo request; | 6999 HttpRequestInfo request; |
6913 request.method = "GET"; | 7000 request.method = "GET"; |
6914 request.url = GURL("http://www.google.com/"); | 7001 request.url = GURL("http://www.google.com/"); |
6915 request.load_flags = LOAD_BYPASS_CACHE; | 7002 request.load_flags = LOAD_BYPASS_CACHE; |
6916 | 7003 |
6917 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 7004 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
6918 scoped_ptr<HttpTransaction> trans( | 7005 scoped_ptr<HttpTransaction> trans( |
6919 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 7006 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
6920 | 7007 |
6921 MockWrite data_writes[] = { | 7008 MockWrite data_writes[] = { |
6922 MockWrite("GET / HTTP/1.1\r\n" | 7009 MockWrite( |
6923 "Host: www.google.com\r\n" | 7010 "GET / HTTP/1.1\r\n" |
6924 "Connection: keep-alive\r\n" | 7011 "Host: www.google.com\r\n" |
6925 "Pragma: no-cache\r\n" | 7012 "Connection: keep-alive\r\n" |
6926 "Cache-Control: no-cache\r\n\r\n"), | 7013 "Pragma: no-cache\r\n" |
| 7014 "Cache-Control: no-cache\r\n\r\n"), |
6927 }; | 7015 }; |
6928 | 7016 |
6929 // Lastly, the server responds with the actual content. | 7017 // Lastly, the server responds with the actual content. |
6930 MockRead data_reads[] = { | 7018 MockRead data_reads[] = { |
6931 MockRead("HTTP/1.0 200 OK\r\n"), | 7019 MockRead("HTTP/1.0 200 OK\r\n"), |
6932 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 7020 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
6933 MockRead("Content-Length: 100\r\n\r\n"), | 7021 MockRead("Content-Length: 100\r\n\r\n"), MockRead(SYNCHRONOUS, OK), |
6934 MockRead(SYNCHRONOUS, OK), | |
6935 }; | 7022 }; |
6936 | 7023 |
6937 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 7024 StaticSocketDataProvider data( |
6938 data_writes, arraysize(data_writes)); | 7025 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
6939 session_deps_.socket_factory->AddSocketDataProvider(&data); | 7026 session_deps_.socket_factory->AddSocketDataProvider(&data); |
6940 | 7027 |
6941 TestCompletionCallback callback; | 7028 TestCompletionCallback callback; |
6942 | 7029 |
6943 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 7030 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
6944 EXPECT_EQ(ERR_IO_PENDING, rv); | 7031 EXPECT_EQ(ERR_IO_PENDING, rv); |
6945 | 7032 |
6946 rv = callback.WaitForResult(); | 7033 rv = callback.WaitForResult(); |
6947 EXPECT_EQ(OK, rv); | 7034 EXPECT_EQ(OK, rv); |
6948 } | 7035 } |
6949 | 7036 |
6950 TEST_P(HttpNetworkTransactionTest, | 7037 TEST_P(HttpNetworkTransactionTest, BuildRequest_CacheControlValidateCache) { |
6951 BuildRequest_CacheControlValidateCache) { | |
6952 HttpRequestInfo request; | 7038 HttpRequestInfo request; |
6953 request.method = "GET"; | 7039 request.method = "GET"; |
6954 request.url = GURL("http://www.google.com/"); | 7040 request.url = GURL("http://www.google.com/"); |
6955 request.load_flags = LOAD_VALIDATE_CACHE; | 7041 request.load_flags = LOAD_VALIDATE_CACHE; |
6956 | 7042 |
6957 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 7043 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
6958 scoped_ptr<HttpTransaction> trans( | 7044 scoped_ptr<HttpTransaction> trans( |
6959 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 7045 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
6960 | 7046 |
6961 MockWrite data_writes[] = { | 7047 MockWrite data_writes[] = { |
6962 MockWrite("GET / HTTP/1.1\r\n" | 7048 MockWrite( |
6963 "Host: www.google.com\r\n" | 7049 "GET / HTTP/1.1\r\n" |
6964 "Connection: keep-alive\r\n" | 7050 "Host: www.google.com\r\n" |
6965 "Cache-Control: max-age=0\r\n\r\n"), | 7051 "Connection: keep-alive\r\n" |
| 7052 "Cache-Control: max-age=0\r\n\r\n"), |
6966 }; | 7053 }; |
6967 | 7054 |
6968 // Lastly, the server responds with the actual content. | 7055 // Lastly, the server responds with the actual content. |
6969 MockRead data_reads[] = { | 7056 MockRead data_reads[] = { |
6970 MockRead("HTTP/1.0 200 OK\r\n"), | 7057 MockRead("HTTP/1.0 200 OK\r\n"), |
6971 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 7058 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
6972 MockRead("Content-Length: 100\r\n\r\n"), | 7059 MockRead("Content-Length: 100\r\n\r\n"), MockRead(SYNCHRONOUS, OK), |
6973 MockRead(SYNCHRONOUS, OK), | |
6974 }; | 7060 }; |
6975 | 7061 |
6976 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 7062 StaticSocketDataProvider data( |
6977 data_writes, arraysize(data_writes)); | 7063 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
6978 session_deps_.socket_factory->AddSocketDataProvider(&data); | 7064 session_deps_.socket_factory->AddSocketDataProvider(&data); |
6979 | 7065 |
6980 TestCompletionCallback callback; | 7066 TestCompletionCallback callback; |
6981 | 7067 |
6982 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 7068 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
6983 EXPECT_EQ(ERR_IO_PENDING, rv); | 7069 EXPECT_EQ(ERR_IO_PENDING, rv); |
6984 | 7070 |
6985 rv = callback.WaitForResult(); | 7071 rv = callback.WaitForResult(); |
6986 EXPECT_EQ(OK, rv); | 7072 EXPECT_EQ(OK, rv); |
6987 } | 7073 } |
6988 | 7074 |
6989 TEST_P(HttpNetworkTransactionTest, BuildRequest_ExtraHeaders) { | 7075 TEST_P(HttpNetworkTransactionTest, BuildRequest_ExtraHeaders) { |
6990 HttpRequestInfo request; | 7076 HttpRequestInfo request; |
6991 request.method = "GET"; | 7077 request.method = "GET"; |
6992 request.url = GURL("http://www.google.com/"); | 7078 request.url = GURL("http://www.google.com/"); |
6993 request.extra_headers.SetHeader("FooHeader", "Bar"); | 7079 request.extra_headers.SetHeader("FooHeader", "Bar"); |
6994 | 7080 |
6995 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 7081 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
6996 scoped_ptr<HttpTransaction> trans( | 7082 scoped_ptr<HttpTransaction> trans( |
6997 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 7083 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
6998 | 7084 |
6999 MockWrite data_writes[] = { | 7085 MockWrite data_writes[] = { |
7000 MockWrite("GET / HTTP/1.1\r\n" | 7086 MockWrite( |
7001 "Host: www.google.com\r\n" | 7087 "GET / HTTP/1.1\r\n" |
7002 "Connection: keep-alive\r\n" | 7088 "Host: www.google.com\r\n" |
7003 "FooHeader: Bar\r\n\r\n"), | 7089 "Connection: keep-alive\r\n" |
| 7090 "FooHeader: Bar\r\n\r\n"), |
7004 }; | 7091 }; |
7005 | 7092 |
7006 // Lastly, the server responds with the actual content. | 7093 // Lastly, the server responds with the actual content. |
7007 MockRead data_reads[] = { | 7094 MockRead data_reads[] = { |
7008 MockRead("HTTP/1.0 200 OK\r\n"), | 7095 MockRead("HTTP/1.0 200 OK\r\n"), |
7009 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 7096 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
7010 MockRead("Content-Length: 100\r\n\r\n"), | 7097 MockRead("Content-Length: 100\r\n\r\n"), MockRead(SYNCHRONOUS, OK), |
7011 MockRead(SYNCHRONOUS, OK), | |
7012 }; | 7098 }; |
7013 | 7099 |
7014 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 7100 StaticSocketDataProvider data( |
7015 data_writes, arraysize(data_writes)); | 7101 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
7016 session_deps_.socket_factory->AddSocketDataProvider(&data); | 7102 session_deps_.socket_factory->AddSocketDataProvider(&data); |
7017 | 7103 |
7018 TestCompletionCallback callback; | 7104 TestCompletionCallback callback; |
7019 | 7105 |
7020 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 7106 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
7021 EXPECT_EQ(ERR_IO_PENDING, rv); | 7107 EXPECT_EQ(ERR_IO_PENDING, rv); |
7022 | 7108 |
7023 rv = callback.WaitForResult(); | 7109 rv = callback.WaitForResult(); |
7024 EXPECT_EQ(OK, rv); | 7110 EXPECT_EQ(OK, rv); |
7025 } | 7111 } |
7026 | 7112 |
7027 TEST_P(HttpNetworkTransactionTest, BuildRequest_ExtraHeadersStripped) { | 7113 TEST_P(HttpNetworkTransactionTest, BuildRequest_ExtraHeadersStripped) { |
7028 HttpRequestInfo request; | 7114 HttpRequestInfo request; |
7029 request.method = "GET"; | 7115 request.method = "GET"; |
7030 request.url = GURL("http://www.google.com/"); | 7116 request.url = GURL("http://www.google.com/"); |
7031 request.extra_headers.SetHeader("referer", "www.foo.com"); | 7117 request.extra_headers.SetHeader("referer", "www.foo.com"); |
7032 request.extra_headers.SetHeader("hEllo", "Kitty"); | 7118 request.extra_headers.SetHeader("hEllo", "Kitty"); |
7033 request.extra_headers.SetHeader("FoO", "bar"); | 7119 request.extra_headers.SetHeader("FoO", "bar"); |
7034 | 7120 |
7035 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 7121 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
7036 scoped_ptr<HttpTransaction> trans( | 7122 scoped_ptr<HttpTransaction> trans( |
7037 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 7123 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
7038 | 7124 |
7039 MockWrite data_writes[] = { | 7125 MockWrite data_writes[] = { |
7040 MockWrite("GET / HTTP/1.1\r\n" | 7126 MockWrite( |
7041 "Host: www.google.com\r\n" | 7127 "GET / HTTP/1.1\r\n" |
7042 "Connection: keep-alive\r\n" | 7128 "Host: www.google.com\r\n" |
7043 "referer: www.foo.com\r\n" | 7129 "Connection: keep-alive\r\n" |
7044 "hEllo: Kitty\r\n" | 7130 "referer: www.foo.com\r\n" |
7045 "FoO: bar\r\n\r\n"), | 7131 "hEllo: Kitty\r\n" |
| 7132 "FoO: bar\r\n\r\n"), |
7046 }; | 7133 }; |
7047 | 7134 |
7048 // Lastly, the server responds with the actual content. | 7135 // Lastly, the server responds with the actual content. |
7049 MockRead data_reads[] = { | 7136 MockRead data_reads[] = { |
7050 MockRead("HTTP/1.0 200 OK\r\n"), | 7137 MockRead("HTTP/1.0 200 OK\r\n"), |
7051 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 7138 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
7052 MockRead("Content-Length: 100\r\n\r\n"), | 7139 MockRead("Content-Length: 100\r\n\r\n"), MockRead(SYNCHRONOUS, OK), |
7053 MockRead(SYNCHRONOUS, OK), | |
7054 }; | 7140 }; |
7055 | 7141 |
7056 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 7142 StaticSocketDataProvider data( |
7057 data_writes, arraysize(data_writes)); | 7143 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
7058 session_deps_.socket_factory->AddSocketDataProvider(&data); | 7144 session_deps_.socket_factory->AddSocketDataProvider(&data); |
7059 | 7145 |
7060 TestCompletionCallback callback; | 7146 TestCompletionCallback callback; |
7061 | 7147 |
7062 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 7148 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
7063 EXPECT_EQ(ERR_IO_PENDING, rv); | 7149 EXPECT_EQ(ERR_IO_PENDING, rv); |
7064 | 7150 |
7065 rv = callback.WaitForResult(); | 7151 rv = callback.WaitForResult(); |
7066 EXPECT_EQ(OK, rv); | 7152 EXPECT_EQ(OK, rv); |
7067 } | 7153 } |
7068 | 7154 |
7069 TEST_P(HttpNetworkTransactionTest, SOCKS4_HTTP_GET) { | 7155 TEST_P(HttpNetworkTransactionTest, SOCKS4_HTTP_GET) { |
7070 HttpRequestInfo request; | 7156 HttpRequestInfo request; |
7071 request.method = "GET"; | 7157 request.method = "GET"; |
7072 request.url = GURL("http://www.google.com/"); | 7158 request.url = GURL("http://www.google.com/"); |
7073 request.load_flags = 0; | 7159 request.load_flags = 0; |
7074 | 7160 |
7075 session_deps_.proxy_service.reset( | 7161 session_deps_.proxy_service.reset( |
7076 ProxyService::CreateFixedFromPacResult("SOCKS myproxy:1080")); | 7162 ProxyService::CreateFixedFromPacResult("SOCKS myproxy:1080")); |
7077 CapturingNetLog net_log; | 7163 CapturingNetLog net_log; |
7078 session_deps_.net_log = &net_log; | 7164 session_deps_.net_log = &net_log; |
7079 | 7165 |
7080 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 7166 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
7081 scoped_ptr<HttpTransaction> trans( | 7167 scoped_ptr<HttpTransaction> trans( |
7082 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 7168 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
7083 | 7169 |
7084 char write_buffer[] = { 0x04, 0x01, 0x00, 0x50, 127, 0, 0, 1, 0 }; | 7170 char write_buffer[] = {0x04, 0x01, 0x00, 0x50, 127, 0, 0, 1, 0}; |
7085 char read_buffer[] = { 0x00, 0x5A, 0x00, 0x00, 0, 0, 0, 0 }; | 7171 char read_buffer[] = {0x00, 0x5A, 0x00, 0x00, 0, 0, 0, 0}; |
7086 | 7172 |
7087 MockWrite data_writes[] = { | 7173 MockWrite data_writes[] = { |
7088 MockWrite(ASYNC, write_buffer, arraysize(write_buffer)), | 7174 MockWrite(ASYNC, write_buffer, arraysize(write_buffer)), |
7089 MockWrite("GET / HTTP/1.1\r\n" | 7175 MockWrite( |
7090 "Host: www.google.com\r\n" | 7176 "GET / HTTP/1.1\r\n" |
7091 "Connection: keep-alive\r\n\r\n") | 7177 "Host: www.google.com\r\n" |
7092 }; | 7178 "Connection: keep-alive\r\n\r\n")}; |
7093 | 7179 |
7094 MockRead data_reads[] = { | 7180 MockRead data_reads[] = { |
7095 MockRead(ASYNC, read_buffer, arraysize(read_buffer)), | 7181 MockRead(ASYNC, read_buffer, arraysize(read_buffer)), |
7096 MockRead("HTTP/1.0 200 OK\r\n"), | 7182 MockRead("HTTP/1.0 200 OK\r\n"), |
7097 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n\r\n"), | 7183 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n\r\n"), |
7098 MockRead("Payload"), | 7184 MockRead("Payload"), MockRead(SYNCHRONOUS, OK)}; |
7099 MockRead(SYNCHRONOUS, OK) | |
7100 }; | |
7101 | 7185 |
7102 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 7186 StaticSocketDataProvider data( |
7103 data_writes, arraysize(data_writes)); | 7187 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
7104 session_deps_.socket_factory->AddSocketDataProvider(&data); | 7188 session_deps_.socket_factory->AddSocketDataProvider(&data); |
7105 | 7189 |
7106 TestCompletionCallback callback; | 7190 TestCompletionCallback callback; |
7107 | 7191 |
7108 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 7192 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
7109 EXPECT_EQ(ERR_IO_PENDING, rv); | 7193 EXPECT_EQ(ERR_IO_PENDING, rv); |
7110 | 7194 |
7111 rv = callback.WaitForResult(); | 7195 rv = callback.WaitForResult(); |
7112 EXPECT_EQ(OK, rv); | 7196 EXPECT_EQ(OK, rv); |
7113 | 7197 |
(...skipping 19 matching lines...) Expand all Loading... |
7133 | 7217 |
7134 session_deps_.proxy_service.reset( | 7218 session_deps_.proxy_service.reset( |
7135 ProxyService::CreateFixedFromPacResult("SOCKS myproxy:1080")); | 7219 ProxyService::CreateFixedFromPacResult("SOCKS myproxy:1080")); |
7136 CapturingNetLog net_log; | 7220 CapturingNetLog net_log; |
7137 session_deps_.net_log = &net_log; | 7221 session_deps_.net_log = &net_log; |
7138 | 7222 |
7139 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 7223 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
7140 scoped_ptr<HttpTransaction> trans( | 7224 scoped_ptr<HttpTransaction> trans( |
7141 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 7225 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
7142 | 7226 |
7143 unsigned char write_buffer[] = { 0x04, 0x01, 0x01, 0xBB, 127, 0, 0, 1, 0 }; | 7227 unsigned char write_buffer[] = {0x04, 0x01, 0x01, 0xBB, 127, 0, 0, 1, 0}; |
7144 unsigned char read_buffer[] = { 0x00, 0x5A, 0x00, 0x00, 0, 0, 0, 0 }; | 7228 unsigned char read_buffer[] = {0x00, 0x5A, 0x00, 0x00, 0, 0, 0, 0}; |
7145 | 7229 |
7146 MockWrite data_writes[] = { | 7230 MockWrite data_writes[] = {MockWrite(ASYNC, |
7147 MockWrite(ASYNC, reinterpret_cast<char*>(write_buffer), | 7231 reinterpret_cast<char*>(write_buffer), |
7148 arraysize(write_buffer)), | 7232 arraysize(write_buffer)), |
7149 MockWrite("GET / HTTP/1.1\r\n" | 7233 MockWrite( |
7150 "Host: www.google.com\r\n" | 7234 "GET / HTTP/1.1\r\n" |
7151 "Connection: keep-alive\r\n\r\n") | 7235 "Host: www.google.com\r\n" |
7152 }; | 7236 "Connection: keep-alive\r\n\r\n")}; |
7153 | 7237 |
7154 MockRead data_reads[] = { | 7238 MockRead data_reads[] = { |
7155 MockRead(ASYNC, reinterpret_cast<char*>(read_buffer), | 7239 MockRead( |
7156 arraysize(read_buffer)), | 7240 ASYNC, reinterpret_cast<char*>(read_buffer), arraysize(read_buffer)), |
7157 MockRead("HTTP/1.0 200 OK\r\n"), | 7241 MockRead("HTTP/1.0 200 OK\r\n"), |
7158 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n\r\n"), | 7242 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n\r\n"), |
7159 MockRead("Payload"), | 7243 MockRead("Payload"), MockRead(SYNCHRONOUS, OK)}; |
7160 MockRead(SYNCHRONOUS, OK) | |
7161 }; | |
7162 | 7244 |
7163 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 7245 StaticSocketDataProvider data( |
7164 data_writes, arraysize(data_writes)); | 7246 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
7165 session_deps_.socket_factory->AddSocketDataProvider(&data); | 7247 session_deps_.socket_factory->AddSocketDataProvider(&data); |
7166 | 7248 |
7167 SSLSocketDataProvider ssl(ASYNC, OK); | 7249 SSLSocketDataProvider ssl(ASYNC, OK); |
7168 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 7250 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
7169 | 7251 |
7170 TestCompletionCallback callback; | 7252 TestCompletionCallback callback; |
7171 | 7253 |
7172 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 7254 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
7173 EXPECT_EQ(ERR_IO_PENDING, rv); | 7255 EXPECT_EQ(ERR_IO_PENDING, rv); |
7174 | 7256 |
(...skipping 22 matching lines...) Expand all Loading... |
7197 | 7279 |
7198 session_deps_.proxy_service.reset( | 7280 session_deps_.proxy_service.reset( |
7199 ProxyService::CreateFixed("socks4://myproxy:1080")); | 7281 ProxyService::CreateFixed("socks4://myproxy:1080")); |
7200 CapturingNetLog net_log; | 7282 CapturingNetLog net_log; |
7201 session_deps_.net_log = &net_log; | 7283 session_deps_.net_log = &net_log; |
7202 | 7284 |
7203 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 7285 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
7204 scoped_ptr<HttpTransaction> trans( | 7286 scoped_ptr<HttpTransaction> trans( |
7205 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 7287 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
7206 | 7288 |
7207 char write_buffer[] = { 0x04, 0x01, 0x00, 0x50, 127, 0, 0, 1, 0 }; | 7289 char write_buffer[] = {0x04, 0x01, 0x00, 0x50, 127, 0, 0, 1, 0}; |
7208 char read_buffer[] = { 0x00, 0x5A, 0x00, 0x00, 0, 0, 0, 0 }; | 7290 char read_buffer[] = {0x00, 0x5A, 0x00, 0x00, 0, 0, 0, 0}; |
7209 | 7291 |
7210 MockWrite data_writes[] = { | 7292 MockWrite data_writes[] = { |
7211 MockWrite(ASYNC, write_buffer, arraysize(write_buffer)), | 7293 MockWrite(ASYNC, write_buffer, arraysize(write_buffer)), |
7212 MockWrite("GET / HTTP/1.1\r\n" | 7294 MockWrite( |
7213 "Host: www.google.com\r\n" | 7295 "GET / HTTP/1.1\r\n" |
7214 "Connection: keep-alive\r\n\r\n") | 7296 "Host: www.google.com\r\n" |
7215 }; | 7297 "Connection: keep-alive\r\n\r\n")}; |
7216 | 7298 |
7217 MockRead data_reads[] = { | 7299 MockRead data_reads[] = { |
7218 MockRead(ASYNC, read_buffer, arraysize(read_buffer)), | 7300 MockRead(ASYNC, read_buffer, arraysize(read_buffer)), |
7219 MockRead("HTTP/1.0 200 OK\r\n"), | 7301 MockRead("HTTP/1.0 200 OK\r\n"), |
7220 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n\r\n"), | 7302 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n\r\n"), |
7221 MockRead("Payload"), | 7303 MockRead("Payload"), MockRead(SYNCHRONOUS, OK)}; |
7222 MockRead(SYNCHRONOUS, OK) | |
7223 }; | |
7224 | 7304 |
7225 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 7305 StaticSocketDataProvider data( |
7226 data_writes, arraysize(data_writes)); | 7306 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
7227 session_deps_.socket_factory->AddSocketDataProvider(&data); | 7307 session_deps_.socket_factory->AddSocketDataProvider(&data); |
7228 | 7308 |
7229 TestCompletionCallback callback; | 7309 TestCompletionCallback callback; |
7230 | 7310 |
7231 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 7311 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
7232 EXPECT_EQ(ERR_IO_PENDING, rv); | 7312 EXPECT_EQ(ERR_IO_PENDING, rv); |
7233 | 7313 |
7234 rv = callback.WaitForResult(); | 7314 rv = callback.WaitForResult(); |
7235 EXPECT_EQ(OK, rv); | 7315 EXPECT_EQ(OK, rv); |
7236 | 7316 |
(...skipping 19 matching lines...) Expand all Loading... |
7256 | 7336 |
7257 session_deps_.proxy_service.reset( | 7337 session_deps_.proxy_service.reset( |
7258 ProxyService::CreateFixedFromPacResult("SOCKS5 myproxy:1080")); | 7338 ProxyService::CreateFixedFromPacResult("SOCKS5 myproxy:1080")); |
7259 CapturingNetLog net_log; | 7339 CapturingNetLog net_log; |
7260 session_deps_.net_log = &net_log; | 7340 session_deps_.net_log = &net_log; |
7261 | 7341 |
7262 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 7342 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
7263 scoped_ptr<HttpTransaction> trans( | 7343 scoped_ptr<HttpTransaction> trans( |
7264 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 7344 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
7265 | 7345 |
7266 const char kSOCKS5GreetRequest[] = { 0x05, 0x01, 0x00 }; | 7346 const char kSOCKS5GreetRequest[] = {0x05, 0x01, 0x00}; |
7267 const char kSOCKS5GreetResponse[] = { 0x05, 0x00 }; | 7347 const char kSOCKS5GreetResponse[] = {0x05, 0x00}; |
7268 const char kSOCKS5OkRequest[] = { | 7348 const char kSOCKS5OkRequest[] = { |
7269 0x05, // Version | 7349 0x05, // Version |
7270 0x01, // Command (CONNECT) | 7350 0x01, // Command (CONNECT) |
7271 0x00, // Reserved. | 7351 0x00, // Reserved. |
7272 0x03, // Address type (DOMAINNAME). | 7352 0x03, // Address type (DOMAINNAME). |
7273 0x0E, // Length of domain (14) | 7353 0x0E, // Length of domain (14) |
7274 // Domain string: | 7354 // Domain string: |
7275 'w', 'w', 'w', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o', 'm', | 7355 'w', 'w', 'w', '.', 'g', 'o', 'o', 'g', |
7276 0x00, 0x50, // 16-bit port (80) | 7356 'l', 'e', '.', 'c', 'o', 'm', 0x00, 0x50, // 16-bit port (80) |
7277 }; | 7357 }; |
7278 const char kSOCKS5OkResponse[] = | 7358 const char kSOCKS5OkResponse[] = {0x05, 0x00, 0x00, 0x01, 127, |
7279 { 0x05, 0x00, 0x00, 0x01, 127, 0, 0, 1, 0x00, 0x50 }; | 7359 0, 0, 1, 0x00, 0x50}; |
7280 | 7360 |
7281 MockWrite data_writes[] = { | 7361 MockWrite data_writes[] = { |
7282 MockWrite(ASYNC, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), | 7362 MockWrite(ASYNC, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), |
7283 MockWrite(ASYNC, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)), | 7363 MockWrite(ASYNC, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)), |
7284 MockWrite("GET / HTTP/1.1\r\n" | 7364 MockWrite( |
7285 "Host: www.google.com\r\n" | 7365 "GET / HTTP/1.1\r\n" |
7286 "Connection: keep-alive\r\n\r\n") | 7366 "Host: www.google.com\r\n" |
7287 }; | 7367 "Connection: keep-alive\r\n\r\n")}; |
7288 | 7368 |
7289 MockRead data_reads[] = { | 7369 MockRead data_reads[] = { |
7290 MockRead(ASYNC, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), | 7370 MockRead(ASYNC, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), |
7291 MockRead(ASYNC, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)), | 7371 MockRead(ASYNC, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)), |
7292 MockRead("HTTP/1.0 200 OK\r\n"), | 7372 MockRead("HTTP/1.0 200 OK\r\n"), |
7293 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n\r\n"), | 7373 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n\r\n"), |
7294 MockRead("Payload"), | 7374 MockRead("Payload"), |
7295 MockRead(SYNCHRONOUS, OK) | 7375 MockRead(SYNCHRONOUS, OK)}; |
7296 }; | |
7297 | 7376 |
7298 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 7377 StaticSocketDataProvider data( |
7299 data_writes, arraysize(data_writes)); | 7378 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
7300 session_deps_.socket_factory->AddSocketDataProvider(&data); | 7379 session_deps_.socket_factory->AddSocketDataProvider(&data); |
7301 | 7380 |
7302 TestCompletionCallback callback; | 7381 TestCompletionCallback callback; |
7303 | 7382 |
7304 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 7383 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
7305 EXPECT_EQ(ERR_IO_PENDING, rv); | 7384 EXPECT_EQ(ERR_IO_PENDING, rv); |
7306 | 7385 |
7307 rv = callback.WaitForResult(); | 7386 rv = callback.WaitForResult(); |
7308 EXPECT_EQ(OK, rv); | 7387 EXPECT_EQ(OK, rv); |
7309 | 7388 |
(...skipping 19 matching lines...) Expand all Loading... |
7329 | 7408 |
7330 session_deps_.proxy_service.reset( | 7409 session_deps_.proxy_service.reset( |
7331 ProxyService::CreateFixedFromPacResult("SOCKS5 myproxy:1080")); | 7410 ProxyService::CreateFixedFromPacResult("SOCKS5 myproxy:1080")); |
7332 CapturingNetLog net_log; | 7411 CapturingNetLog net_log; |
7333 session_deps_.net_log = &net_log; | 7412 session_deps_.net_log = &net_log; |
7334 | 7413 |
7335 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 7414 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
7336 scoped_ptr<HttpTransaction> trans( | 7415 scoped_ptr<HttpTransaction> trans( |
7337 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 7416 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
7338 | 7417 |
7339 const char kSOCKS5GreetRequest[] = { 0x05, 0x01, 0x00 }; | 7418 const char kSOCKS5GreetRequest[] = {0x05, 0x01, 0x00}; |
7340 const char kSOCKS5GreetResponse[] = { 0x05, 0x00 }; | 7419 const char kSOCKS5GreetResponse[] = {0x05, 0x00}; |
7341 const unsigned char kSOCKS5OkRequest[] = { | 7420 const unsigned char kSOCKS5OkRequest[] = { |
7342 0x05, // Version | 7421 0x05, // Version |
7343 0x01, // Command (CONNECT) | 7422 0x01, // Command (CONNECT) |
7344 0x00, // Reserved. | 7423 0x00, // Reserved. |
7345 0x03, // Address type (DOMAINNAME). | 7424 0x03, // Address type (DOMAINNAME). |
7346 0x0E, // Length of domain (14) | 7425 0x0E, // Length of domain (14) |
7347 // Domain string: | 7426 // Domain string: |
7348 'w', 'w', 'w', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o', 'm', | 7427 'w', 'w', 'w', '.', 'g', 'o', 'o', 'g', |
7349 0x01, 0xBB, // 16-bit port (443) | 7428 'l', 'e', '.', 'c', 'o', 'm', 0x01, 0xBB, // 16-bit port (443) |
7350 }; | 7429 }; |
7351 | 7430 |
7352 const char kSOCKS5OkResponse[] = | 7431 const char kSOCKS5OkResponse[] = {0x05, 0x00, 0x00, 0x01, 0, |
7353 { 0x05, 0x00, 0x00, 0x01, 0, 0, 0, 0, 0x00, 0x00 }; | 7432 0, 0, 0, 0x00, 0x00}; |
7354 | 7433 |
7355 MockWrite data_writes[] = { | 7434 MockWrite data_writes[] = { |
7356 MockWrite(ASYNC, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), | 7435 MockWrite(ASYNC, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), |
7357 MockWrite(ASYNC, reinterpret_cast<const char*>(kSOCKS5OkRequest), | 7436 MockWrite(ASYNC, |
7358 arraysize(kSOCKS5OkRequest)), | 7437 reinterpret_cast<const char*>(kSOCKS5OkRequest), |
7359 MockWrite("GET / HTTP/1.1\r\n" | 7438 arraysize(kSOCKS5OkRequest)), |
7360 "Host: www.google.com\r\n" | 7439 MockWrite( |
7361 "Connection: keep-alive\r\n\r\n") | 7440 "GET / HTTP/1.1\r\n" |
7362 }; | 7441 "Host: www.google.com\r\n" |
| 7442 "Connection: keep-alive\r\n\r\n")}; |
7363 | 7443 |
7364 MockRead data_reads[] = { | 7444 MockRead data_reads[] = { |
7365 MockRead(ASYNC, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), | 7445 MockRead(ASYNC, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), |
7366 MockRead(ASYNC, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)), | 7446 MockRead(ASYNC, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)), |
7367 MockRead("HTTP/1.0 200 OK\r\n"), | 7447 MockRead("HTTP/1.0 200 OK\r\n"), |
7368 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n\r\n"), | 7448 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n\r\n"), |
7369 MockRead("Payload"), | 7449 MockRead("Payload"), |
7370 MockRead(SYNCHRONOUS, OK) | 7450 MockRead(SYNCHRONOUS, OK)}; |
7371 }; | |
7372 | 7451 |
7373 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 7452 StaticSocketDataProvider data( |
7374 data_writes, arraysize(data_writes)); | 7453 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
7375 session_deps_.socket_factory->AddSocketDataProvider(&data); | 7454 session_deps_.socket_factory->AddSocketDataProvider(&data); |
7376 | 7455 |
7377 SSLSocketDataProvider ssl(ASYNC, OK); | 7456 SSLSocketDataProvider ssl(ASYNC, OK); |
7378 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 7457 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
7379 | 7458 |
7380 TestCompletionCallback callback; | 7459 TestCompletionCallback callback; |
7381 | 7460 |
7382 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 7461 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
7383 EXPECT_EQ(ERR_IO_PENDING, rv); | 7462 EXPECT_EQ(ERR_IO_PENDING, rv); |
7384 | 7463 |
(...skipping 26 matching lines...) Expand all Loading... |
7411 }; | 7490 }; |
7412 | 7491 |
7413 scoped_refptr<HttpNetworkSession> SetupSessionForGroupNameTests( | 7492 scoped_refptr<HttpNetworkSession> SetupSessionForGroupNameTests( |
7414 NextProto next_proto, | 7493 NextProto next_proto, |
7415 SpdySessionDependencies* session_deps_) { | 7494 SpdySessionDependencies* session_deps_) { |
7416 scoped_refptr<HttpNetworkSession> session(CreateSession(session_deps_)); | 7495 scoped_refptr<HttpNetworkSession> session(CreateSession(session_deps_)); |
7417 | 7496 |
7418 base::WeakPtr<HttpServerProperties> http_server_properties = | 7497 base::WeakPtr<HttpServerProperties> http_server_properties = |
7419 session->http_server_properties(); | 7498 session->http_server_properties(); |
7420 http_server_properties->SetAlternateProtocol( | 7499 http_server_properties->SetAlternateProtocol( |
7421 HostPortPair("host.with.alternate", 80), 443, | 7500 HostPortPair("host.with.alternate", 80), |
| 7501 443, |
7422 AlternateProtocolFromNextProto(next_proto)); | 7502 AlternateProtocolFromNextProto(next_proto)); |
7423 | 7503 |
7424 return session; | 7504 return session; |
7425 } | 7505 } |
7426 | 7506 |
7427 int GroupNameTransactionHelper( | 7507 int GroupNameTransactionHelper( |
7428 const std::string& url, | 7508 const std::string& url, |
7429 const scoped_refptr<HttpNetworkSession>& session) { | 7509 const scoped_refptr<HttpNetworkSession>& session) { |
7430 HttpRequestInfo request; | 7510 HttpRequestInfo request; |
7431 request.method = "GET"; | 7511 request.method = "GET"; |
7432 request.url = GURL(url); | 7512 request.url = GURL(url); |
7433 request.load_flags = 0; | 7513 request.load_flags = 0; |
7434 | 7514 |
7435 scoped_ptr<HttpTransaction> trans( | 7515 scoped_ptr<HttpTransaction> trans( |
7436 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 7516 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
7437 | 7517 |
7438 TestCompletionCallback callback; | 7518 TestCompletionCallback callback; |
7439 | 7519 |
7440 // We do not complete this request, the dtor will clean the transaction up. | 7520 // We do not complete this request, the dtor will clean the transaction up. |
7441 return trans->Start(&request, callback.callback(), BoundNetLog()); | 7521 return trans->Start(&request, callback.callback(), BoundNetLog()); |
7442 } | 7522 } |
7443 | 7523 |
7444 } // namespace | 7524 } // namespace |
7445 | 7525 |
7446 TEST_P(HttpNetworkTransactionTest, GroupNameForDirectConnections) { | 7526 TEST_P(HttpNetworkTransactionTest, GroupNameForDirectConnections) { |
7447 const GroupNameTest tests[] = { | 7527 const GroupNameTest tests[] = { |
7448 { | 7528 { |
7449 "", // unused | 7529 "", // unused |
7450 "http://www.google.com/direct", | 7530 "http://www.google.com/direct", "www.google.com:80", false, |
7451 "www.google.com:80", | 7531 }, |
7452 false, | 7532 { |
7453 }, | 7533 "", // unused |
7454 { | 7534 "http://[2001:1418:13:1::25]/direct", "[2001:1418:13:1::25]:80", false, |
7455 "", // unused | 7535 }, |
7456 "http://[2001:1418:13:1::25]/direct", | |
7457 "[2001:1418:13:1::25]:80", | |
7458 false, | |
7459 }, | |
7460 | 7536 |
7461 // SSL Tests | 7537 // SSL Tests |
7462 { | 7538 { |
7463 "", // unused | 7539 "", // unused |
7464 "https://www.google.com/direct_ssl", | 7540 "https://www.google.com/direct_ssl", "ssl/www.google.com:443", true, |
7465 "ssl/www.google.com:443", | 7541 }, |
7466 true, | 7542 { |
7467 }, | 7543 "", // unused |
7468 { | 7544 "https://[2001:1418:13:1::25]/direct", "ssl/[2001:1418:13:1::25]:443", |
7469 "", // unused | 7545 true, |
7470 "https://[2001:1418:13:1::25]/direct", | 7546 }, |
7471 "ssl/[2001:1418:13:1::25]:443", | 7547 { |
7472 true, | 7548 "", // unused |
7473 }, | 7549 "http://host.with.alternate/direct", "ssl/host.with.alternate:443", true, |
7474 { | 7550 }, |
7475 "", // unused | |
7476 "http://host.with.alternate/direct", | |
7477 "ssl/host.with.alternate:443", | |
7478 true, | |
7479 }, | |
7480 }; | 7551 }; |
7481 | 7552 |
7482 HttpStreamFactory::set_use_alternate_protocols(true); | 7553 HttpStreamFactory::set_use_alternate_protocols(true); |
7483 | 7554 |
7484 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { | 7555 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { |
7485 session_deps_.proxy_service.reset( | 7556 session_deps_.proxy_service.reset( |
7486 ProxyService::CreateFixed(tests[i].proxy_server)); | 7557 ProxyService::CreateFixed(tests[i].proxy_server)); |
7487 scoped_refptr<HttpNetworkSession> session( | 7558 scoped_refptr<HttpNetworkSession> session( |
7488 SetupSessionForGroupNameTests(GetParam(), &session_deps_)); | 7559 SetupSessionForGroupNameTests(GetParam(), &session_deps_)); |
7489 | 7560 |
(...skipping 11 matching lines...) Expand all Loading... |
7501 | 7572 |
7502 EXPECT_EQ(ERR_IO_PENDING, | 7573 EXPECT_EQ(ERR_IO_PENDING, |
7503 GroupNameTransactionHelper(tests[i].url, session)); | 7574 GroupNameTransactionHelper(tests[i].url, session)); |
7504 if (tests[i].ssl) | 7575 if (tests[i].ssl) |
7505 EXPECT_EQ(tests[i].expected_group_name, | 7576 EXPECT_EQ(tests[i].expected_group_name, |
7506 ssl_conn_pool->last_group_name_received()); | 7577 ssl_conn_pool->last_group_name_received()); |
7507 else | 7578 else |
7508 EXPECT_EQ(tests[i].expected_group_name, | 7579 EXPECT_EQ(tests[i].expected_group_name, |
7509 transport_conn_pool->last_group_name_received()); | 7580 transport_conn_pool->last_group_name_received()); |
7510 } | 7581 } |
7511 | |
7512 } | 7582 } |
7513 | 7583 |
7514 TEST_P(HttpNetworkTransactionTest, GroupNameForHTTPProxyConnections) { | 7584 TEST_P(HttpNetworkTransactionTest, GroupNameForHTTPProxyConnections) { |
7515 const GroupNameTest tests[] = { | 7585 const GroupNameTest tests[] = { |
7516 { | 7586 { |
7517 "http_proxy", | 7587 "http_proxy", "http://www.google.com/http_proxy_normal", |
7518 "http://www.google.com/http_proxy_normal", | 7588 "www.google.com:80", false, |
7519 "www.google.com:80", | 7589 }, |
7520 false, | |
7521 }, | |
7522 | 7590 |
7523 // SSL Tests | 7591 // SSL Tests |
7524 { | 7592 { |
7525 "http_proxy", | 7593 "http_proxy", "https://www.google.com/http_connect_ssl", |
7526 "https://www.google.com/http_connect_ssl", | 7594 "ssl/www.google.com:443", true, |
7527 "ssl/www.google.com:443", | 7595 }, |
7528 true, | 7596 { |
7529 }, | 7597 "http_proxy", "http://host.with.alternate/direct", |
7530 | 7598 "ssl/host.with.alternate:443", true, |
7531 { | 7599 }, |
7532 "http_proxy", | 7600 { |
7533 "http://host.with.alternate/direct", | 7601 "http_proxy", "ftp://ftp.google.com/http_proxy_normal", |
7534 "ssl/host.with.alternate:443", | 7602 "ftp/ftp.google.com:21", false, |
7535 true, | 7603 }, |
7536 }, | |
7537 | |
7538 { | |
7539 "http_proxy", | |
7540 "ftp://ftp.google.com/http_proxy_normal", | |
7541 "ftp/ftp.google.com:21", | |
7542 false, | |
7543 }, | |
7544 }; | 7604 }; |
7545 | 7605 |
7546 HttpStreamFactory::set_use_alternate_protocols(true); | 7606 HttpStreamFactory::set_use_alternate_protocols(true); |
7547 | 7607 |
7548 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { | 7608 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { |
7549 session_deps_.proxy_service.reset( | 7609 session_deps_.proxy_service.reset( |
7550 ProxyService::CreateFixed(tests[i].proxy_server)); | 7610 ProxyService::CreateFixed(tests[i].proxy_server)); |
7551 scoped_refptr<HttpNetworkSession> session( | 7611 scoped_refptr<HttpNetworkSession> session( |
7552 SetupSessionForGroupNameTests(GetParam(), &session_deps_)); | 7612 SetupSessionForGroupNameTests(GetParam(), &session_deps_)); |
7553 | 7613 |
(...skipping 18 matching lines...) Expand all Loading... |
7572 EXPECT_EQ(tests[i].expected_group_name, | 7632 EXPECT_EQ(tests[i].expected_group_name, |
7573 ssl_conn_pool->last_group_name_received()); | 7633 ssl_conn_pool->last_group_name_received()); |
7574 else | 7634 else |
7575 EXPECT_EQ(tests[i].expected_group_name, | 7635 EXPECT_EQ(tests[i].expected_group_name, |
7576 http_proxy_pool->last_group_name_received()); | 7636 http_proxy_pool->last_group_name_received()); |
7577 } | 7637 } |
7578 } | 7638 } |
7579 | 7639 |
7580 TEST_P(HttpNetworkTransactionTest, GroupNameForSOCKSConnections) { | 7640 TEST_P(HttpNetworkTransactionTest, GroupNameForSOCKSConnections) { |
7581 const GroupNameTest tests[] = { | 7641 const GroupNameTest tests[] = { |
7582 { | 7642 { |
7583 "socks4://socks_proxy:1080", | 7643 "socks4://socks_proxy:1080", "http://www.google.com/socks4_direct", |
7584 "http://www.google.com/socks4_direct", | 7644 "socks4/www.google.com:80", false, |
7585 "socks4/www.google.com:80", | 7645 }, |
7586 false, | 7646 { |
7587 }, | 7647 "socks5://socks_proxy:1080", "http://www.google.com/socks5_direct", |
7588 { | 7648 "socks5/www.google.com:80", false, |
7589 "socks5://socks_proxy:1080", | 7649 }, |
7590 "http://www.google.com/socks5_direct", | |
7591 "socks5/www.google.com:80", | |
7592 false, | |
7593 }, | |
7594 | 7650 |
7595 // SSL Tests | 7651 // SSL Tests |
7596 { | 7652 { |
7597 "socks4://socks_proxy:1080", | 7653 "socks4://socks_proxy:1080", "https://www.google.com/socks4_ssl", |
7598 "https://www.google.com/socks4_ssl", | 7654 "socks4/ssl/www.google.com:443", true, |
7599 "socks4/ssl/www.google.com:443", | 7655 }, |
7600 true, | 7656 { |
7601 }, | 7657 "socks5://socks_proxy:1080", "https://www.google.com/socks5_ssl", |
7602 { | 7658 "socks5/ssl/www.google.com:443", true, |
7603 "socks5://socks_proxy:1080", | 7659 }, |
7604 "https://www.google.com/socks5_ssl", | 7660 { |
7605 "socks5/ssl/www.google.com:443", | 7661 "socks4://socks_proxy:1080", "http://host.with.alternate/direct", |
7606 true, | 7662 "socks4/ssl/host.with.alternate:443", true, |
7607 }, | 7663 }, |
7608 | |
7609 { | |
7610 "socks4://socks_proxy:1080", | |
7611 "http://host.with.alternate/direct", | |
7612 "socks4/ssl/host.with.alternate:443", | |
7613 true, | |
7614 }, | |
7615 }; | 7664 }; |
7616 | 7665 |
7617 HttpStreamFactory::set_use_alternate_protocols(true); | 7666 HttpStreamFactory::set_use_alternate_protocols(true); |
7618 | 7667 |
7619 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { | 7668 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { |
7620 session_deps_.proxy_service.reset( | 7669 session_deps_.proxy_service.reset( |
7621 ProxyService::CreateFixed(tests[i].proxy_server)); | 7670 ProxyService::CreateFixed(tests[i].proxy_server)); |
7622 scoped_refptr<HttpNetworkSession> session( | 7671 scoped_refptr<HttpNetworkSession> session( |
7623 SetupSessionForGroupNameTests(GetParam(), &session_deps_)); | 7672 SetupSessionForGroupNameTests(GetParam(), &session_deps_)); |
7624 | 7673 |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7718 BoundNetLog()); | 7767 BoundNetLog()); |
7719 ASSERT_EQ(OK, rv); | 7768 ASSERT_EQ(OK, rv); |
7720 | 7769 |
7721 // Inject a failure the next time that "www.google.com" is resolved. This way | 7770 // Inject a failure the next time that "www.google.com" is resolved. This way |
7722 // we can tell if the next lookup hit the cache, or the "network". | 7771 // we can tell if the next lookup hit the cache, or the "network". |
7723 // (cache --> success, "network" --> failure). | 7772 // (cache --> success, "network" --> failure). |
7724 session_deps_.host_resolver->rules()->AddSimulatedFailure("www.google.com"); | 7773 session_deps_.host_resolver->rules()->AddSimulatedFailure("www.google.com"); |
7725 | 7774 |
7726 // Connect up a mock socket which will fail with ERR_UNEXPECTED during the | 7775 // Connect up a mock socket which will fail with ERR_UNEXPECTED during the |
7727 // first read -- this won't be reached as the host resolution will fail first. | 7776 // first read -- this won't be reached as the host resolution will fail first. |
7728 MockRead data_reads[] = { MockRead(SYNCHRONOUS, ERR_UNEXPECTED) }; | 7777 MockRead data_reads[] = {MockRead(SYNCHRONOUS, ERR_UNEXPECTED)}; |
7729 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); | 7778 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); |
7730 session_deps_.socket_factory->AddSocketDataProvider(&data); | 7779 session_deps_.socket_factory->AddSocketDataProvider(&data); |
7731 | 7780 |
7732 // Run the request. | 7781 // Run the request. |
7733 rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 7782 rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
7734 ASSERT_EQ(ERR_IO_PENDING, rv); | 7783 ASSERT_EQ(ERR_IO_PENDING, rv); |
7735 rv = callback.WaitForResult(); | 7784 rv = callback.WaitForResult(); |
7736 | 7785 |
7737 // If we bypassed the cache, we would have gotten a failure while resolving | 7786 // If we bypassed the cache, we would have gotten a failure while resolving |
7738 // "www.google.com". | 7787 // "www.google.com". |
(...skipping 15 matching lines...) Expand all Loading... |
7754 } | 7803 } |
7755 | 7804 |
7756 // Make sure we can handle an error when writing the request. | 7805 // Make sure we can handle an error when writing the request. |
7757 TEST_P(HttpNetworkTransactionTest, RequestWriteError) { | 7806 TEST_P(HttpNetworkTransactionTest, RequestWriteError) { |
7758 HttpRequestInfo request; | 7807 HttpRequestInfo request; |
7759 request.method = "GET"; | 7808 request.method = "GET"; |
7760 request.url = GURL("http://www.foo.com/"); | 7809 request.url = GURL("http://www.foo.com/"); |
7761 request.load_flags = 0; | 7810 request.load_flags = 0; |
7762 | 7811 |
7763 MockWrite write_failure[] = { | 7812 MockWrite write_failure[] = { |
7764 MockWrite(ASYNC, ERR_CONNECTION_RESET), | 7813 MockWrite(ASYNC, ERR_CONNECTION_RESET), |
7765 }; | 7814 }; |
7766 StaticSocketDataProvider data(NULL, 0, | 7815 StaticSocketDataProvider data( |
7767 write_failure, arraysize(write_failure)); | 7816 NULL, 0, write_failure, arraysize(write_failure)); |
7768 session_deps_.socket_factory->AddSocketDataProvider(&data); | 7817 session_deps_.socket_factory->AddSocketDataProvider(&data); |
7769 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 7818 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
7770 | 7819 |
7771 TestCompletionCallback callback; | 7820 TestCompletionCallback callback; |
7772 | 7821 |
7773 scoped_ptr<HttpTransaction> trans( | 7822 scoped_ptr<HttpTransaction> trans( |
7774 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 7823 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
7775 | 7824 |
7776 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 7825 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
7777 EXPECT_EQ(ERR_IO_PENDING, rv); | 7826 EXPECT_EQ(ERR_IO_PENDING, rv); |
7778 | 7827 |
7779 rv = callback.WaitForResult(); | 7828 rv = callback.WaitForResult(); |
7780 EXPECT_EQ(ERR_CONNECTION_RESET, rv); | 7829 EXPECT_EQ(ERR_CONNECTION_RESET, rv); |
7781 } | 7830 } |
7782 | 7831 |
7783 // Check that a connection closed after the start of the headers finishes ok. | 7832 // Check that a connection closed after the start of the headers finishes ok. |
7784 TEST_P(HttpNetworkTransactionTest, ConnectionClosedAfterStartOfHeaders) { | 7833 TEST_P(HttpNetworkTransactionTest, ConnectionClosedAfterStartOfHeaders) { |
7785 HttpRequestInfo request; | 7834 HttpRequestInfo request; |
7786 request.method = "GET"; | 7835 request.method = "GET"; |
7787 request.url = GURL("http://www.foo.com/"); | 7836 request.url = GURL("http://www.foo.com/"); |
7788 request.load_flags = 0; | 7837 request.load_flags = 0; |
7789 | 7838 |
7790 MockRead data_reads[] = { | 7839 MockRead data_reads[] = { |
7791 MockRead("HTTP/1."), | 7840 MockRead("HTTP/1."), MockRead(SYNCHRONOUS, OK), |
7792 MockRead(SYNCHRONOUS, OK), | |
7793 }; | 7841 }; |
7794 | 7842 |
7795 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); | 7843 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); |
7796 session_deps_.socket_factory->AddSocketDataProvider(&data); | 7844 session_deps_.socket_factory->AddSocketDataProvider(&data); |
7797 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 7845 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
7798 | 7846 |
7799 TestCompletionCallback callback; | 7847 TestCompletionCallback callback; |
7800 | 7848 |
7801 scoped_ptr<HttpTransaction> trans( | 7849 scoped_ptr<HttpTransaction> trans( |
7802 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 7850 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
(...skipping 18 matching lines...) Expand all Loading... |
7821 | 7869 |
7822 // Make sure that a dropped connection while draining the body for auth | 7870 // Make sure that a dropped connection while draining the body for auth |
7823 // restart does the right thing. | 7871 // restart does the right thing. |
7824 TEST_P(HttpNetworkTransactionTest, DrainResetOK) { | 7872 TEST_P(HttpNetworkTransactionTest, DrainResetOK) { |
7825 HttpRequestInfo request; | 7873 HttpRequestInfo request; |
7826 request.method = "GET"; | 7874 request.method = "GET"; |
7827 request.url = GURL("http://www.google.com/"); | 7875 request.url = GURL("http://www.google.com/"); |
7828 request.load_flags = 0; | 7876 request.load_flags = 0; |
7829 | 7877 |
7830 MockWrite data_writes1[] = { | 7878 MockWrite data_writes1[] = { |
7831 MockWrite("GET / HTTP/1.1\r\n" | 7879 MockWrite( |
7832 "Host: www.google.com\r\n" | 7880 "GET / HTTP/1.1\r\n" |
7833 "Connection: keep-alive\r\n\r\n"), | 7881 "Host: www.google.com\r\n" |
| 7882 "Connection: keep-alive\r\n\r\n"), |
7834 }; | 7883 }; |
7835 | 7884 |
7836 MockRead data_reads1[] = { | 7885 MockRead data_reads1[] = { |
7837 MockRead("HTTP/1.1 401 Unauthorized\r\n"), | 7886 MockRead("HTTP/1.1 401 Unauthorized\r\n"), |
7838 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | 7887 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
7839 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 7888 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
7840 MockRead("Content-Length: 14\r\n\r\n"), | 7889 MockRead("Content-Length: 14\r\n\r\n"), |
7841 MockRead("Unauth"), | 7890 MockRead("Unauth"), |
7842 MockRead(ASYNC, ERR_CONNECTION_RESET), | 7891 MockRead(ASYNC, ERR_CONNECTION_RESET), |
7843 }; | 7892 }; |
7844 | 7893 |
7845 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 7894 StaticSocketDataProvider data1(data_reads1, |
7846 data_writes1, arraysize(data_writes1)); | 7895 arraysize(data_reads1), |
| 7896 data_writes1, |
| 7897 arraysize(data_writes1)); |
7847 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 7898 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
7848 | 7899 |
7849 // After calling trans->RestartWithAuth(), this is the request we should | 7900 // After calling trans->RestartWithAuth(), this is the request we should |
7850 // be issuing -- the final header line contains the credentials. | 7901 // be issuing -- the final header line contains the credentials. |
7851 MockWrite data_writes2[] = { | 7902 MockWrite data_writes2[] = { |
7852 MockWrite("GET / HTTP/1.1\r\n" | 7903 MockWrite( |
7853 "Host: www.google.com\r\n" | 7904 "GET / HTTP/1.1\r\n" |
7854 "Connection: keep-alive\r\n" | 7905 "Host: www.google.com\r\n" |
7855 "Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 7906 "Connection: keep-alive\r\n" |
| 7907 "Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
7856 }; | 7908 }; |
7857 | 7909 |
7858 // Lastly, the server responds with the actual content. | 7910 // Lastly, the server responds with the actual content. |
7859 MockRead data_reads2[] = { | 7911 MockRead data_reads2[] = { |
7860 MockRead("HTTP/1.1 200 OK\r\n"), | 7912 MockRead("HTTP/1.1 200 OK\r\n"), |
7861 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 7913 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
7862 MockRead("Content-Length: 100\r\n\r\n"), | 7914 MockRead("Content-Length: 100\r\n\r\n"), MockRead(SYNCHRONOUS, OK), |
7863 MockRead(SYNCHRONOUS, OK), | |
7864 }; | 7915 }; |
7865 | 7916 |
7866 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), | 7917 StaticSocketDataProvider data2(data_reads2, |
7867 data_writes2, arraysize(data_writes2)); | 7918 arraysize(data_reads2), |
| 7919 data_writes2, |
| 7920 arraysize(data_writes2)); |
7868 session_deps_.socket_factory->AddSocketDataProvider(&data2); | 7921 session_deps_.socket_factory->AddSocketDataProvider(&data2); |
7869 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 7922 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
7870 | 7923 |
7871 TestCompletionCallback callback1; | 7924 TestCompletionCallback callback1; |
7872 | 7925 |
7873 scoped_ptr<HttpTransaction> trans( | 7926 scoped_ptr<HttpTransaction> trans( |
7874 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 7927 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
7875 | 7928 |
7876 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); | 7929 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); |
7877 EXPECT_EQ(ERR_IO_PENDING, rv); | 7930 EXPECT_EQ(ERR_IO_PENDING, rv); |
7878 | 7931 |
7879 rv = callback1.WaitForResult(); | 7932 rv = callback1.WaitForResult(); |
7880 EXPECT_EQ(OK, rv); | 7933 EXPECT_EQ(OK, rv); |
7881 | 7934 |
7882 const HttpResponseInfo* response = trans->GetResponseInfo(); | 7935 const HttpResponseInfo* response = trans->GetResponseInfo(); |
7883 ASSERT_TRUE(response != NULL); | 7936 ASSERT_TRUE(response != NULL); |
7884 EXPECT_TRUE(CheckBasicServerAuth(response->auth_challenge.get())); | 7937 EXPECT_TRUE(CheckBasicServerAuth(response->auth_challenge.get())); |
7885 | 7938 |
7886 TestCompletionCallback callback2; | 7939 TestCompletionCallback callback2; |
7887 | 7940 |
7888 rv = trans->RestartWithAuth( | 7941 rv = |
7889 AuthCredentials(kFoo, kBar), callback2.callback()); | 7942 trans->RestartWithAuth(AuthCredentials(kFoo, kBar), callback2.callback()); |
7890 EXPECT_EQ(ERR_IO_PENDING, rv); | 7943 EXPECT_EQ(ERR_IO_PENDING, rv); |
7891 | 7944 |
7892 rv = callback2.WaitForResult(); | 7945 rv = callback2.WaitForResult(); |
7893 EXPECT_EQ(OK, rv); | 7946 EXPECT_EQ(OK, rv); |
7894 | 7947 |
7895 response = trans->GetResponseInfo(); | 7948 response = trans->GetResponseInfo(); |
7896 ASSERT_TRUE(response != NULL); | 7949 ASSERT_TRUE(response != NULL); |
7897 EXPECT_TRUE(response->auth_challenge.get() == NULL); | 7950 EXPECT_TRUE(response->auth_challenge.get() == NULL); |
7898 EXPECT_EQ(100, response->headers->GetContentLength()); | 7951 EXPECT_EQ(100, response->headers->GetContentLength()); |
7899 } | 7952 } |
7900 | 7953 |
7901 // Test HTTPS connections going through a proxy that sends extra data. | 7954 // Test HTTPS connections going through a proxy that sends extra data. |
7902 TEST_P(HttpNetworkTransactionTest, HTTPSViaProxyWithExtraData) { | 7955 TEST_P(HttpNetworkTransactionTest, HTTPSViaProxyWithExtraData) { |
7903 session_deps_.proxy_service.reset(ProxyService::CreateFixed("myproxy:70")); | 7956 session_deps_.proxy_service.reset(ProxyService::CreateFixed("myproxy:70")); |
7904 | 7957 |
7905 HttpRequestInfo request; | 7958 HttpRequestInfo request; |
7906 request.method = "GET"; | 7959 request.method = "GET"; |
7907 request.url = GURL("https://www.google.com/"); | 7960 request.url = GURL("https://www.google.com/"); |
7908 request.load_flags = 0; | 7961 request.load_flags = 0; |
7909 | 7962 |
7910 MockRead proxy_reads[] = { | 7963 MockRead proxy_reads[] = { |
7911 MockRead("HTTP/1.0 200 Connected\r\n\r\nExtra data"), | 7964 MockRead("HTTP/1.0 200 Connected\r\n\r\nExtra data"), |
7912 MockRead(SYNCHRONOUS, OK) | 7965 MockRead(SYNCHRONOUS, OK)}; |
7913 }; | |
7914 | 7966 |
7915 StaticSocketDataProvider data(proxy_reads, arraysize(proxy_reads), NULL, 0); | 7967 StaticSocketDataProvider data(proxy_reads, arraysize(proxy_reads), NULL, 0); |
7916 SSLSocketDataProvider ssl(ASYNC, OK); | 7968 SSLSocketDataProvider ssl(ASYNC, OK); |
7917 | 7969 |
7918 session_deps_.socket_factory->AddSocketDataProvider(&data); | 7970 session_deps_.socket_factory->AddSocketDataProvider(&data); |
7919 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 7971 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
7920 | 7972 |
7921 TestCompletionCallback callback; | 7973 TestCompletionCallback callback; |
7922 | 7974 |
7923 session_deps_.socket_factory->ResetNextMockIndexes(); | 7975 session_deps_.socket_factory->ResetNextMockIndexes(); |
(...skipping 13 matching lines...) Expand all Loading... |
7937 HttpRequestInfo request; | 7989 HttpRequestInfo request; |
7938 request.method = "GET"; | 7990 request.method = "GET"; |
7939 request.url = GURL("http://www.google.com/"); | 7991 request.url = GURL("http://www.google.com/"); |
7940 request.load_flags = 0; | 7992 request.load_flags = 0; |
7941 | 7993 |
7942 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 7994 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
7943 scoped_ptr<HttpTransaction> trans( | 7995 scoped_ptr<HttpTransaction> trans( |
7944 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 7996 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
7945 | 7997 |
7946 MockRead data_reads[] = { | 7998 MockRead data_reads[] = { |
7947 MockRead("HTTP/1.0 200 OK\r\nContent-Length:6719476739\r\n\r\n"), | 7999 MockRead("HTTP/1.0 200 OK\r\nContent-Length:6719476739\r\n\r\n"), |
7948 MockRead(SYNCHRONOUS, OK), | 8000 MockRead(SYNCHRONOUS, OK), |
7949 }; | 8001 }; |
7950 | 8002 |
7951 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); | 8003 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); |
7952 session_deps_.socket_factory->AddSocketDataProvider(&data); | 8004 session_deps_.socket_factory->AddSocketDataProvider(&data); |
7953 | 8005 |
7954 TestCompletionCallback callback; | 8006 TestCompletionCallback callback; |
7955 | 8007 |
7956 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 8008 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
7957 EXPECT_EQ(ERR_IO_PENDING, rv); | 8009 EXPECT_EQ(ERR_IO_PENDING, rv); |
7958 | 8010 |
(...skipping 30 matching lines...) Expand all Loading... |
7989 request.method = "POST"; | 8041 request.method = "POST"; |
7990 request.url = GURL("http://www.google.com/upload"); | 8042 request.url = GURL("http://www.google.com/upload"); |
7991 request.upload_data_stream = &upload_data_stream; | 8043 request.upload_data_stream = &upload_data_stream; |
7992 request.load_flags = 0; | 8044 request.load_flags = 0; |
7993 | 8045 |
7994 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 8046 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
7995 scoped_ptr<HttpTransaction> trans( | 8047 scoped_ptr<HttpTransaction> trans( |
7996 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 8048 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
7997 | 8049 |
7998 MockRead data_reads[] = { | 8050 MockRead data_reads[] = { |
7999 MockRead("HTTP/1.0 200 OK\r\n\r\n"), | 8051 MockRead("HTTP/1.0 200 OK\r\n\r\n"), MockRead("hello world"), |
8000 MockRead("hello world"), | 8052 MockRead(SYNCHRONOUS, OK), |
8001 MockRead(SYNCHRONOUS, OK), | |
8002 }; | 8053 }; |
8003 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); | 8054 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); |
8004 session_deps_.socket_factory->AddSocketDataProvider(&data); | 8055 session_deps_.socket_factory->AddSocketDataProvider(&data); |
8005 | 8056 |
8006 TestCompletionCallback callback; | 8057 TestCompletionCallback callback; |
8007 | 8058 |
8008 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 8059 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
8009 EXPECT_EQ(ERR_IO_PENDING, rv); | 8060 EXPECT_EQ(ERR_IO_PENDING, rv); |
8010 | 8061 |
8011 rv = callback.WaitForResult(); | 8062 rv = callback.WaitForResult(); |
(...skipping 10 matching lines...) Expand all Loading... |
8022 EXPECT_EQ(OK, rv); | 8073 EXPECT_EQ(OK, rv); |
8023 EXPECT_EQ("hello world", response_data); | 8074 EXPECT_EQ("hello world", response_data); |
8024 | 8075 |
8025 base::DeleteFile(temp_file_path, false); | 8076 base::DeleteFile(temp_file_path, false); |
8026 } | 8077 } |
8027 | 8078 |
8028 TEST_P(HttpNetworkTransactionTest, UploadUnreadableFile) { | 8079 TEST_P(HttpNetworkTransactionTest, UploadUnreadableFile) { |
8029 base::FilePath temp_file; | 8080 base::FilePath temp_file; |
8030 ASSERT_TRUE(base::CreateTemporaryFile(&temp_file)); | 8081 ASSERT_TRUE(base::CreateTemporaryFile(&temp_file)); |
8031 std::string temp_file_content("Unreadable file."); | 8082 std::string temp_file_content("Unreadable file."); |
8032 ASSERT_TRUE(base::WriteFile(temp_file, temp_file_content.c_str(), | 8083 ASSERT_TRUE(base::WriteFile( |
8033 temp_file_content.length())); | 8084 temp_file, temp_file_content.c_str(), temp_file_content.length())); |
8034 ASSERT_TRUE(file_util::MakeFileUnreadable(temp_file)); | 8085 ASSERT_TRUE(file_util::MakeFileUnreadable(temp_file)); |
8035 | 8086 |
8036 ScopedVector<UploadElementReader> element_readers; | 8087 ScopedVector<UploadElementReader> element_readers; |
8037 element_readers.push_back( | 8088 element_readers.push_back( |
8038 new UploadFileElementReader(base::MessageLoopProxy::current().get(), | 8089 new UploadFileElementReader(base::MessageLoopProxy::current().get(), |
8039 temp_file, | 8090 temp_file, |
8040 0, | 8091 0, |
8041 kuint64max, | 8092 kuint64max, |
8042 base::Time())); | 8093 base::Time())); |
8043 UploadDataStream upload_data_stream(element_readers.Pass(), 0); | 8094 UploadDataStream upload_data_stream(element_readers.Pass(), 0); |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8121 // Transaction is pending on request body initialization. | 8172 // Transaction is pending on request body initialization. |
8122 ASSERT_FALSE(fake_reader->callback().is_null()); | 8173 ASSERT_FALSE(fake_reader->callback().is_null()); |
8123 | 8174 |
8124 // Return Init()'s result after the transaction gets destroyed. | 8175 // Return Init()'s result after the transaction gets destroyed. |
8125 trans.reset(); | 8176 trans.reset(); |
8126 fake_reader->callback().Run(OK); // Should not crash. | 8177 fake_reader->callback().Run(OK); // Should not crash. |
8127 } | 8178 } |
8128 | 8179 |
8129 // Tests that changes to Auth realms are treated like auth rejections. | 8180 // Tests that changes to Auth realms are treated like auth rejections. |
8130 TEST_P(HttpNetworkTransactionTest, ChangeAuthRealms) { | 8181 TEST_P(HttpNetworkTransactionTest, ChangeAuthRealms) { |
8131 | |
8132 HttpRequestInfo request; | 8182 HttpRequestInfo request; |
8133 request.method = "GET"; | 8183 request.method = "GET"; |
8134 request.url = GURL("http://www.google.com/"); | 8184 request.url = GURL("http://www.google.com/"); |
8135 request.load_flags = 0; | 8185 request.load_flags = 0; |
8136 | 8186 |
8137 // First transaction will request a resource and receive a Basic challenge | 8187 // First transaction will request a resource and receive a Basic challenge |
8138 // with realm="first_realm". | 8188 // with realm="first_realm". |
8139 MockWrite data_writes1[] = { | 8189 MockWrite data_writes1[] = { |
8140 MockWrite("GET / HTTP/1.1\r\n" | 8190 MockWrite( |
8141 "Host: www.google.com\r\n" | 8191 "GET / HTTP/1.1\r\n" |
8142 "Connection: keep-alive\r\n" | 8192 "Host: www.google.com\r\n" |
8143 "\r\n"), | 8193 "Connection: keep-alive\r\n" |
| 8194 "\r\n"), |
8144 }; | 8195 }; |
8145 MockRead data_reads1[] = { | 8196 MockRead data_reads1[] = { |
8146 MockRead("HTTP/1.1 401 Unauthorized\r\n" | 8197 MockRead( |
8147 "WWW-Authenticate: Basic realm=\"first_realm\"\r\n" | 8198 "HTTP/1.1 401 Unauthorized\r\n" |
8148 "\r\n"), | 8199 "WWW-Authenticate: Basic realm=\"first_realm\"\r\n" |
| 8200 "\r\n"), |
8149 }; | 8201 }; |
8150 | 8202 |
8151 // After calling trans->RestartWithAuth(), provide an Authentication header | 8203 // After calling trans->RestartWithAuth(), provide an Authentication header |
8152 // for first_realm. The server will reject and provide a challenge with | 8204 // for first_realm. The server will reject and provide a challenge with |
8153 // second_realm. | 8205 // second_realm. |
8154 MockWrite data_writes2[] = { | 8206 MockWrite data_writes2[] = { |
8155 MockWrite("GET / HTTP/1.1\r\n" | 8207 MockWrite( |
8156 "Host: www.google.com\r\n" | 8208 "GET / HTTP/1.1\r\n" |
8157 "Connection: keep-alive\r\n" | 8209 "Host: www.google.com\r\n" |
8158 "Authorization: Basic Zmlyc3Q6YmF6\r\n" | 8210 "Connection: keep-alive\r\n" |
8159 "\r\n"), | 8211 "Authorization: Basic Zmlyc3Q6YmF6\r\n" |
| 8212 "\r\n"), |
8160 }; | 8213 }; |
8161 MockRead data_reads2[] = { | 8214 MockRead data_reads2[] = { |
8162 MockRead("HTTP/1.1 401 Unauthorized\r\n" | 8215 MockRead( |
8163 "WWW-Authenticate: Basic realm=\"second_realm\"\r\n" | 8216 "HTTP/1.1 401 Unauthorized\r\n" |
8164 "\r\n"), | 8217 "WWW-Authenticate: Basic realm=\"second_realm\"\r\n" |
| 8218 "\r\n"), |
8165 }; | 8219 }; |
8166 | 8220 |
8167 // This again fails, and goes back to first_realm. Make sure that the | 8221 // This again fails, and goes back to first_realm. Make sure that the |
8168 // entry is removed from cache. | 8222 // entry is removed from cache. |
8169 MockWrite data_writes3[] = { | 8223 MockWrite data_writes3[] = { |
8170 MockWrite("GET / HTTP/1.1\r\n" | 8224 MockWrite( |
8171 "Host: www.google.com\r\n" | 8225 "GET / HTTP/1.1\r\n" |
8172 "Connection: keep-alive\r\n" | 8226 "Host: www.google.com\r\n" |
8173 "Authorization: Basic c2Vjb25kOmZvdQ==\r\n" | 8227 "Connection: keep-alive\r\n" |
8174 "\r\n"), | 8228 "Authorization: Basic c2Vjb25kOmZvdQ==\r\n" |
| 8229 "\r\n"), |
8175 }; | 8230 }; |
8176 MockRead data_reads3[] = { | 8231 MockRead data_reads3[] = { |
8177 MockRead("HTTP/1.1 401 Unauthorized\r\n" | 8232 MockRead( |
8178 "WWW-Authenticate: Basic realm=\"first_realm\"\r\n" | 8233 "HTTP/1.1 401 Unauthorized\r\n" |
8179 "\r\n"), | 8234 "WWW-Authenticate: Basic realm=\"first_realm\"\r\n" |
| 8235 "\r\n"), |
8180 }; | 8236 }; |
8181 | 8237 |
8182 // Try one last time (with the correct password) and get the resource. | 8238 // Try one last time (with the correct password) and get the resource. |
8183 MockWrite data_writes4[] = { | 8239 MockWrite data_writes4[] = { |
8184 MockWrite("GET / HTTP/1.1\r\n" | 8240 MockWrite( |
8185 "Host: www.google.com\r\n" | 8241 "GET / HTTP/1.1\r\n" |
8186 "Connection: keep-alive\r\n" | 8242 "Host: www.google.com\r\n" |
8187 "Authorization: Basic Zmlyc3Q6YmFy\r\n" | 8243 "Connection: keep-alive\r\n" |
8188 "\r\n"), | 8244 "Authorization: Basic Zmlyc3Q6YmFy\r\n" |
| 8245 "\r\n"), |
8189 }; | 8246 }; |
8190 MockRead data_reads4[] = { | 8247 MockRead data_reads4[] = { |
8191 MockRead("HTTP/1.1 200 OK\r\n" | 8248 MockRead( |
8192 "Content-Type: text/html; charset=iso-8859-1\r\n" | 8249 "HTTP/1.1 200 OK\r\n" |
8193 "Content-Length: 5\r\n" | 8250 "Content-Type: text/html; charset=iso-8859-1\r\n" |
8194 "\r\n" | 8251 "Content-Length: 5\r\n" |
8195 "hello"), | 8252 "\r\n" |
| 8253 "hello"), |
8196 }; | 8254 }; |
8197 | 8255 |
8198 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 8256 StaticSocketDataProvider data1(data_reads1, |
8199 data_writes1, arraysize(data_writes1)); | 8257 arraysize(data_reads1), |
8200 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), | 8258 data_writes1, |
8201 data_writes2, arraysize(data_writes2)); | 8259 arraysize(data_writes1)); |
8202 StaticSocketDataProvider data3(data_reads3, arraysize(data_reads3), | 8260 StaticSocketDataProvider data2(data_reads2, |
8203 data_writes3, arraysize(data_writes3)); | 8261 arraysize(data_reads2), |
8204 StaticSocketDataProvider data4(data_reads4, arraysize(data_reads4), | 8262 data_writes2, |
8205 data_writes4, arraysize(data_writes4)); | 8263 arraysize(data_writes2)); |
| 8264 StaticSocketDataProvider data3(data_reads3, |
| 8265 arraysize(data_reads3), |
| 8266 data_writes3, |
| 8267 arraysize(data_writes3)); |
| 8268 StaticSocketDataProvider data4(data_reads4, |
| 8269 arraysize(data_reads4), |
| 8270 data_writes4, |
| 8271 arraysize(data_writes4)); |
8206 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 8272 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
8207 session_deps_.socket_factory->AddSocketDataProvider(&data2); | 8273 session_deps_.socket_factory->AddSocketDataProvider(&data2); |
8208 session_deps_.socket_factory->AddSocketDataProvider(&data3); | 8274 session_deps_.socket_factory->AddSocketDataProvider(&data3); |
8209 session_deps_.socket_factory->AddSocketDataProvider(&data4); | 8275 session_deps_.socket_factory->AddSocketDataProvider(&data4); |
8210 | 8276 |
8211 TestCompletionCallback callback1; | 8277 TestCompletionCallback callback1; |
8212 | 8278 |
8213 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 8279 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
8214 scoped_ptr<HttpTransaction> trans( | 8280 scoped_ptr<HttpTransaction> trans( |
8215 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 8281 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
(...skipping 11 matching lines...) Expand all Loading... |
8227 ASSERT_FALSE(challenge == NULL); | 8293 ASSERT_FALSE(challenge == NULL); |
8228 EXPECT_FALSE(challenge->is_proxy); | 8294 EXPECT_FALSE(challenge->is_proxy); |
8229 EXPECT_EQ("www.google.com:80", challenge->challenger.ToString()); | 8295 EXPECT_EQ("www.google.com:80", challenge->challenger.ToString()); |
8230 EXPECT_EQ("first_realm", challenge->realm); | 8296 EXPECT_EQ("first_realm", challenge->realm); |
8231 EXPECT_EQ("basic", challenge->scheme); | 8297 EXPECT_EQ("basic", challenge->scheme); |
8232 | 8298 |
8233 // Issue the second request with an incorrect password. There should be a | 8299 // Issue the second request with an incorrect password. There should be a |
8234 // password prompt for second_realm waiting to be filled in after the | 8300 // password prompt for second_realm waiting to be filled in after the |
8235 // transaction completes. | 8301 // transaction completes. |
8236 TestCompletionCallback callback2; | 8302 TestCompletionCallback callback2; |
8237 rv = trans->RestartWithAuth( | 8303 rv = trans->RestartWithAuth(AuthCredentials(kFirst, kBaz), |
8238 AuthCredentials(kFirst, kBaz), callback2.callback()); | 8304 callback2.callback()); |
8239 EXPECT_EQ(ERR_IO_PENDING, rv); | 8305 EXPECT_EQ(ERR_IO_PENDING, rv); |
8240 rv = callback2.WaitForResult(); | 8306 rv = callback2.WaitForResult(); |
8241 EXPECT_EQ(OK, rv); | 8307 EXPECT_EQ(OK, rv); |
8242 response = trans->GetResponseInfo(); | 8308 response = trans->GetResponseInfo(); |
8243 ASSERT_TRUE(response != NULL); | 8309 ASSERT_TRUE(response != NULL); |
8244 challenge = response->auth_challenge.get(); | 8310 challenge = response->auth_challenge.get(); |
8245 ASSERT_FALSE(challenge == NULL); | 8311 ASSERT_FALSE(challenge == NULL); |
8246 EXPECT_FALSE(challenge->is_proxy); | 8312 EXPECT_FALSE(challenge->is_proxy); |
8247 EXPECT_EQ("www.google.com:80", challenge->challenger.ToString()); | 8313 EXPECT_EQ("www.google.com:80", challenge->challenger.ToString()); |
8248 EXPECT_EQ("second_realm", challenge->realm); | 8314 EXPECT_EQ("second_realm", challenge->realm); |
8249 EXPECT_EQ("basic", challenge->scheme); | 8315 EXPECT_EQ("basic", challenge->scheme); |
8250 | 8316 |
8251 // Issue the third request with another incorrect password. There should be | 8317 // Issue the third request with another incorrect password. There should be |
8252 // a password prompt for first_realm waiting to be filled in. If the password | 8318 // a password prompt for first_realm waiting to be filled in. If the password |
8253 // prompt is not present, it indicates that the HttpAuthCacheEntry for | 8319 // prompt is not present, it indicates that the HttpAuthCacheEntry for |
8254 // first_realm was not correctly removed. | 8320 // first_realm was not correctly removed. |
8255 TestCompletionCallback callback3; | 8321 TestCompletionCallback callback3; |
8256 rv = trans->RestartWithAuth( | 8322 rv = trans->RestartWithAuth(AuthCredentials(kSecond, kFou), |
8257 AuthCredentials(kSecond, kFou), callback3.callback()); | 8323 callback3.callback()); |
8258 EXPECT_EQ(ERR_IO_PENDING, rv); | 8324 EXPECT_EQ(ERR_IO_PENDING, rv); |
8259 rv = callback3.WaitForResult(); | 8325 rv = callback3.WaitForResult(); |
8260 EXPECT_EQ(OK, rv); | 8326 EXPECT_EQ(OK, rv); |
8261 response = trans->GetResponseInfo(); | 8327 response = trans->GetResponseInfo(); |
8262 ASSERT_TRUE(response != NULL); | 8328 ASSERT_TRUE(response != NULL); |
8263 challenge = response->auth_challenge.get(); | 8329 challenge = response->auth_challenge.get(); |
8264 ASSERT_FALSE(challenge == NULL); | 8330 ASSERT_FALSE(challenge == NULL); |
8265 EXPECT_FALSE(challenge->is_proxy); | 8331 EXPECT_FALSE(challenge->is_proxy); |
8266 EXPECT_EQ("www.google.com:80", challenge->challenger.ToString()); | 8332 EXPECT_EQ("www.google.com:80", challenge->challenger.ToString()); |
8267 EXPECT_EQ("first_realm", challenge->realm); | 8333 EXPECT_EQ("first_realm", challenge->realm); |
8268 EXPECT_EQ("basic", challenge->scheme); | 8334 EXPECT_EQ("basic", challenge->scheme); |
8269 | 8335 |
8270 // Issue the fourth request with the correct password and username. | 8336 // Issue the fourth request with the correct password and username. |
8271 TestCompletionCallback callback4; | 8337 TestCompletionCallback callback4; |
8272 rv = trans->RestartWithAuth( | 8338 rv = trans->RestartWithAuth(AuthCredentials(kFirst, kBar), |
8273 AuthCredentials(kFirst, kBar), callback4.callback()); | 8339 callback4.callback()); |
8274 EXPECT_EQ(ERR_IO_PENDING, rv); | 8340 EXPECT_EQ(ERR_IO_PENDING, rv); |
8275 rv = callback4.WaitForResult(); | 8341 rv = callback4.WaitForResult(); |
8276 EXPECT_EQ(OK, rv); | 8342 EXPECT_EQ(OK, rv); |
8277 response = trans->GetResponseInfo(); | 8343 response = trans->GetResponseInfo(); |
8278 ASSERT_TRUE(response != NULL); | 8344 ASSERT_TRUE(response != NULL); |
8279 EXPECT_TRUE(response->auth_challenge.get() == NULL); | 8345 EXPECT_TRUE(response->auth_challenge.get() == NULL); |
8280 } | 8346 } |
8281 | 8347 |
8282 TEST_P(HttpNetworkTransactionTest, HonorAlternateProtocolHeader) { | 8348 TEST_P(HttpNetworkTransactionTest, HonorAlternateProtocolHeader) { |
8283 HttpStreamFactory::SetNextProtos(SpdyNextProtos()); | 8349 HttpStreamFactory::SetNextProtos(SpdyNextProtos()); |
8284 HttpStreamFactory::set_use_alternate_protocols(true); | 8350 HttpStreamFactory::set_use_alternate_protocols(true); |
8285 | 8351 |
8286 std::string alternate_protocol_http_header = | 8352 std::string alternate_protocol_http_header = GetAlternateProtocolHttpHeader(); |
8287 GetAlternateProtocolHttpHeader(); | |
8288 | 8353 |
8289 MockRead data_reads[] = { | 8354 MockRead data_reads[] = { |
8290 MockRead("HTTP/1.1 200 OK\r\n"), | 8355 MockRead("HTTP/1.1 200 OK\r\n"), |
8291 MockRead(alternate_protocol_http_header.c_str()), | 8356 MockRead(alternate_protocol_http_header.c_str()), MockRead("hello world"), |
8292 MockRead("hello world"), | 8357 MockRead(SYNCHRONOUS, OK), |
8293 MockRead(SYNCHRONOUS, OK), | |
8294 }; | 8358 }; |
8295 | 8359 |
8296 HttpRequestInfo request; | 8360 HttpRequestInfo request; |
8297 request.method = "GET"; | 8361 request.method = "GET"; |
8298 request.url = GURL("http://www.google.com/"); | 8362 request.url = GURL("http://www.google.com/"); |
8299 request.load_flags = 0; | 8363 request.load_flags = 0; |
8300 | 8364 |
8301 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); | 8365 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); |
8302 | 8366 |
8303 session_deps_.socket_factory->AddSocketDataProvider(&data); | 8367 session_deps_.socket_factory->AddSocketDataProvider(&data); |
(...skipping 28 matching lines...) Expand all Loading... |
8332 | 8396 |
8333 ASSERT_TRUE(http_server_properties.HasAlternateProtocol(http_host_port_pair)); | 8397 ASSERT_TRUE(http_server_properties.HasAlternateProtocol(http_host_port_pair)); |
8334 const PortAlternateProtocolPair alternate = | 8398 const PortAlternateProtocolPair alternate = |
8335 http_server_properties.GetAlternateProtocol(http_host_port_pair); | 8399 http_server_properties.GetAlternateProtocol(http_host_port_pair); |
8336 PortAlternateProtocolPair expected_alternate; | 8400 PortAlternateProtocolPair expected_alternate; |
8337 expected_alternate.port = 443; | 8401 expected_alternate.port = 443; |
8338 expected_alternate.protocol = AlternateProtocolFromNextProto(GetParam()); | 8402 expected_alternate.protocol = AlternateProtocolFromNextProto(GetParam()); |
8339 EXPECT_TRUE(expected_alternate.Equals(alternate)); | 8403 EXPECT_TRUE(expected_alternate.Equals(alternate)); |
8340 } | 8404 } |
8341 | 8405 |
8342 TEST_P(HttpNetworkTransactionTest, | 8406 TEST_P(HttpNetworkTransactionTest, MarkBrokenAlternateProtocolAndFallback) { |
8343 MarkBrokenAlternateProtocolAndFallback) { | |
8344 HttpStreamFactory::set_use_alternate_protocols(true); | 8407 HttpStreamFactory::set_use_alternate_protocols(true); |
8345 | 8408 |
8346 HttpRequestInfo request; | 8409 HttpRequestInfo request; |
8347 request.method = "GET"; | 8410 request.method = "GET"; |
8348 request.url = GURL("http://www.google.com/"); | 8411 request.url = GURL("http://www.google.com/"); |
8349 request.load_flags = 0; | 8412 request.load_flags = 0; |
8350 | 8413 |
8351 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); | 8414 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); |
8352 StaticSocketDataProvider first_data; | 8415 StaticSocketDataProvider first_data; |
8353 first_data.set_connect_data(mock_connect); | 8416 first_data.set_connect_data(mock_connect); |
8354 session_deps_.socket_factory->AddSocketDataProvider(&first_data); | 8417 session_deps_.socket_factory->AddSocketDataProvider(&first_data); |
8355 | 8418 |
8356 MockRead data_reads[] = { | 8419 MockRead data_reads[] = { |
8357 MockRead("HTTP/1.1 200 OK\r\n\r\n"), | 8420 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"), |
8358 MockRead("hello world"), | 8421 MockRead(ASYNC, OK), |
8359 MockRead(ASYNC, OK), | |
8360 }; | 8422 }; |
8361 StaticSocketDataProvider second_data( | 8423 StaticSocketDataProvider second_data( |
8362 data_reads, arraysize(data_reads), NULL, 0); | 8424 data_reads, arraysize(data_reads), NULL, 0); |
8363 session_deps_.socket_factory->AddSocketDataProvider(&second_data); | 8425 session_deps_.socket_factory->AddSocketDataProvider(&second_data); |
8364 | 8426 |
8365 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 8427 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
8366 | 8428 |
8367 base::WeakPtr<HttpServerProperties> http_server_properties = | 8429 base::WeakPtr<HttpServerProperties> http_server_properties = |
8368 session->http_server_properties(); | 8430 session->http_server_properties(); |
8369 // Port must be < 1024, or the header will be ignored (since initial port was | 8431 // Port must be < 1024, or the header will be ignored (since initial port was |
(...skipping 21 matching lines...) Expand all Loading... |
8391 EXPECT_EQ("hello world", response_data); | 8453 EXPECT_EQ("hello world", response_data); |
8392 | 8454 |
8393 ASSERT_TRUE(http_server_properties->HasAlternateProtocol( | 8455 ASSERT_TRUE(http_server_properties->HasAlternateProtocol( |
8394 HostPortPair::FromURL(request.url))); | 8456 HostPortPair::FromURL(request.url))); |
8395 const PortAlternateProtocolPair alternate = | 8457 const PortAlternateProtocolPair alternate = |
8396 http_server_properties->GetAlternateProtocol( | 8458 http_server_properties->GetAlternateProtocol( |
8397 HostPortPair::FromURL(request.url)); | 8459 HostPortPair::FromURL(request.url)); |
8398 EXPECT_EQ(ALTERNATE_PROTOCOL_BROKEN, alternate.protocol); | 8460 EXPECT_EQ(ALTERNATE_PROTOCOL_BROKEN, alternate.protocol); |
8399 } | 8461 } |
8400 | 8462 |
8401 TEST_P(HttpNetworkTransactionTest, | 8463 TEST_P(HttpNetworkTransactionTest, AlternateProtocolPortRestrictedBlocked) { |
8402 AlternateProtocolPortRestrictedBlocked) { | |
8403 // Ensure that we're not allowed to redirect traffic via an alternate | 8464 // Ensure that we're not allowed to redirect traffic via an alternate |
8404 // protocol to an unrestricted (port >= 1024) when the original traffic was | 8465 // protocol to an unrestricted (port >= 1024) when the original traffic was |
8405 // on a restricted port (port < 1024). Ensure that we can redirect in all | 8466 // on a restricted port (port < 1024). Ensure that we can redirect in all |
8406 // other cases. | 8467 // other cases. |
8407 HttpStreamFactory::set_use_alternate_protocols(true); | 8468 HttpStreamFactory::set_use_alternate_protocols(true); |
8408 | 8469 |
8409 HttpRequestInfo restricted_port_request; | 8470 HttpRequestInfo restricted_port_request; |
8410 restricted_port_request.method = "GET"; | 8471 restricted_port_request.method = "GET"; |
8411 restricted_port_request.url = GURL("http://www.google.com:1023/"); | 8472 restricted_port_request.url = GURL("http://www.google.com:1023/"); |
8412 restricted_port_request.load_flags = 0; | 8473 restricted_port_request.load_flags = 0; |
8413 | 8474 |
8414 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); | 8475 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); |
8415 StaticSocketDataProvider first_data; | 8476 StaticSocketDataProvider first_data; |
8416 first_data.set_connect_data(mock_connect); | 8477 first_data.set_connect_data(mock_connect); |
8417 session_deps_.socket_factory->AddSocketDataProvider(&first_data); | 8478 session_deps_.socket_factory->AddSocketDataProvider(&first_data); |
8418 | 8479 |
8419 MockRead data_reads[] = { | 8480 MockRead data_reads[] = { |
8420 MockRead("HTTP/1.1 200 OK\r\n\r\n"), | 8481 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"), |
8421 MockRead("hello world"), | 8482 MockRead(ASYNC, OK), |
8422 MockRead(ASYNC, OK), | |
8423 }; | 8483 }; |
8424 StaticSocketDataProvider second_data( | 8484 StaticSocketDataProvider second_data( |
8425 data_reads, arraysize(data_reads), NULL, 0); | 8485 data_reads, arraysize(data_reads), NULL, 0); |
8426 session_deps_.socket_factory->AddSocketDataProvider(&second_data); | 8486 session_deps_.socket_factory->AddSocketDataProvider(&second_data); |
8427 | 8487 |
8428 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 8488 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
8429 | 8489 |
8430 base::WeakPtr<HttpServerProperties> http_server_properties = | 8490 base::WeakPtr<HttpServerProperties> http_server_properties = |
8431 session->http_server_properties(); | 8491 session->http_server_properties(); |
8432 const int kUnrestrictedAlternatePort = 1024; | 8492 const int kUnrestrictedAlternatePort = 1024; |
8433 http_server_properties->SetAlternateProtocol( | 8493 http_server_properties->SetAlternateProtocol( |
8434 HostPortPair::FromURL(restricted_port_request.url), | 8494 HostPortPair::FromURL(restricted_port_request.url), |
8435 kUnrestrictedAlternatePort, | 8495 kUnrestrictedAlternatePort, |
8436 AlternateProtocolFromNextProto(GetParam())); | 8496 AlternateProtocolFromNextProto(GetParam())); |
8437 | 8497 |
8438 scoped_ptr<HttpTransaction> trans( | 8498 scoped_ptr<HttpTransaction> trans( |
8439 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 8499 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
8440 TestCompletionCallback callback; | 8500 TestCompletionCallback callback; |
8441 | 8501 |
8442 int rv = trans->Start( | 8502 int rv = trans->Start( |
8443 &restricted_port_request, | 8503 &restricted_port_request, callback.callback(), BoundNetLog()); |
8444 callback.callback(), BoundNetLog()); | |
8445 EXPECT_EQ(ERR_IO_PENDING, rv); | 8504 EXPECT_EQ(ERR_IO_PENDING, rv); |
8446 // Invalid change to unrestricted port should fail. | 8505 // Invalid change to unrestricted port should fail. |
8447 EXPECT_EQ(ERR_CONNECTION_REFUSED, callback.WaitForResult()); | 8506 EXPECT_EQ(ERR_CONNECTION_REFUSED, callback.WaitForResult()); |
8448 } | 8507 } |
8449 | 8508 |
8450 TEST_P(HttpNetworkTransactionTest, | 8509 TEST_P(HttpNetworkTransactionTest, AlternateProtocolPortRestrictedPermitted) { |
8451 AlternateProtocolPortRestrictedPermitted) { | |
8452 // Ensure that we're allowed to redirect traffic via an alternate | 8510 // Ensure that we're allowed to redirect traffic via an alternate |
8453 // protocol to an unrestricted (port >= 1024) when the original traffic was | 8511 // protocol to an unrestricted (port >= 1024) when the original traffic was |
8454 // on a restricted port (port < 1024) if we set | 8512 // on a restricted port (port < 1024) if we set |
8455 // enable_user_alternate_protocol_ports. | 8513 // enable_user_alternate_protocol_ports. |
8456 | 8514 |
8457 HttpStreamFactory::set_use_alternate_protocols(true); | 8515 HttpStreamFactory::set_use_alternate_protocols(true); |
8458 session_deps_.enable_user_alternate_protocol_ports = true; | 8516 session_deps_.enable_user_alternate_protocol_ports = true; |
8459 | 8517 |
8460 HttpRequestInfo restricted_port_request; | 8518 HttpRequestInfo restricted_port_request; |
8461 restricted_port_request.method = "GET"; | 8519 restricted_port_request.method = "GET"; |
8462 restricted_port_request.url = GURL("http://www.google.com:1023/"); | 8520 restricted_port_request.url = GURL("http://www.google.com:1023/"); |
8463 restricted_port_request.load_flags = 0; | 8521 restricted_port_request.load_flags = 0; |
8464 | 8522 |
8465 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); | 8523 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); |
8466 StaticSocketDataProvider first_data; | 8524 StaticSocketDataProvider first_data; |
8467 first_data.set_connect_data(mock_connect); | 8525 first_data.set_connect_data(mock_connect); |
8468 session_deps_.socket_factory->AddSocketDataProvider(&first_data); | 8526 session_deps_.socket_factory->AddSocketDataProvider(&first_data); |
8469 | 8527 |
8470 MockRead data_reads[] = { | 8528 MockRead data_reads[] = { |
8471 MockRead("HTTP/1.1 200 OK\r\n\r\n"), | 8529 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"), |
8472 MockRead("hello world"), | 8530 MockRead(ASYNC, OK), |
8473 MockRead(ASYNC, OK), | |
8474 }; | 8531 }; |
8475 StaticSocketDataProvider second_data( | 8532 StaticSocketDataProvider second_data( |
8476 data_reads, arraysize(data_reads), NULL, 0); | 8533 data_reads, arraysize(data_reads), NULL, 0); |
8477 session_deps_.socket_factory->AddSocketDataProvider(&second_data); | 8534 session_deps_.socket_factory->AddSocketDataProvider(&second_data); |
8478 | 8535 |
8479 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 8536 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
8480 | 8537 |
8481 base::WeakPtr<HttpServerProperties> http_server_properties = | 8538 base::WeakPtr<HttpServerProperties> http_server_properties = |
8482 session->http_server_properties(); | 8539 session->http_server_properties(); |
8483 const int kUnrestrictedAlternatePort = 1024; | 8540 const int kUnrestrictedAlternatePort = 1024; |
8484 http_server_properties->SetAlternateProtocol( | 8541 http_server_properties->SetAlternateProtocol( |
8485 HostPortPair::FromURL(restricted_port_request.url), | 8542 HostPortPair::FromURL(restricted_port_request.url), |
8486 kUnrestrictedAlternatePort, | 8543 kUnrestrictedAlternatePort, |
8487 AlternateProtocolFromNextProto(GetParam())); | 8544 AlternateProtocolFromNextProto(GetParam())); |
8488 | 8545 |
8489 scoped_ptr<HttpTransaction> trans( | 8546 scoped_ptr<HttpTransaction> trans( |
8490 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 8547 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
8491 TestCompletionCallback callback; | 8548 TestCompletionCallback callback; |
8492 | 8549 |
8493 EXPECT_EQ(ERR_IO_PENDING, trans->Start( | 8550 EXPECT_EQ(ERR_IO_PENDING, |
8494 &restricted_port_request, | 8551 trans->Start( |
8495 callback.callback(), BoundNetLog())); | 8552 &restricted_port_request, callback.callback(), BoundNetLog())); |
8496 // Change to unrestricted port should succeed. | 8553 // Change to unrestricted port should succeed. |
8497 EXPECT_EQ(OK, callback.WaitForResult()); | 8554 EXPECT_EQ(OK, callback.WaitForResult()); |
8498 } | 8555 } |
8499 | 8556 |
8500 TEST_P(HttpNetworkTransactionTest, | 8557 TEST_P(HttpNetworkTransactionTest, AlternateProtocolPortRestrictedAllowed) { |
8501 AlternateProtocolPortRestrictedAllowed) { | |
8502 // Ensure that we're not allowed to redirect traffic via an alternate | 8558 // Ensure that we're not allowed to redirect traffic via an alternate |
8503 // protocol to an unrestricted (port >= 1024) when the original traffic was | 8559 // protocol to an unrestricted (port >= 1024) when the original traffic was |
8504 // on a restricted port (port < 1024). Ensure that we can redirect in all | 8560 // on a restricted port (port < 1024). Ensure that we can redirect in all |
8505 // other cases. | 8561 // other cases. |
8506 HttpStreamFactory::set_use_alternate_protocols(true); | 8562 HttpStreamFactory::set_use_alternate_protocols(true); |
8507 | 8563 |
8508 HttpRequestInfo restricted_port_request; | 8564 HttpRequestInfo restricted_port_request; |
8509 restricted_port_request.method = "GET"; | 8565 restricted_port_request.method = "GET"; |
8510 restricted_port_request.url = GURL("http://www.google.com:1023/"); | 8566 restricted_port_request.url = GURL("http://www.google.com:1023/"); |
8511 restricted_port_request.load_flags = 0; | 8567 restricted_port_request.load_flags = 0; |
8512 | 8568 |
8513 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); | 8569 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); |
8514 StaticSocketDataProvider first_data; | 8570 StaticSocketDataProvider first_data; |
8515 first_data.set_connect_data(mock_connect); | 8571 first_data.set_connect_data(mock_connect); |
8516 session_deps_.socket_factory->AddSocketDataProvider(&first_data); | 8572 session_deps_.socket_factory->AddSocketDataProvider(&first_data); |
8517 | 8573 |
8518 MockRead data_reads[] = { | 8574 MockRead data_reads[] = { |
8519 MockRead("HTTP/1.1 200 OK\r\n\r\n"), | 8575 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"), |
8520 MockRead("hello world"), | 8576 MockRead(ASYNC, OK), |
8521 MockRead(ASYNC, OK), | |
8522 }; | 8577 }; |
8523 StaticSocketDataProvider second_data( | 8578 StaticSocketDataProvider second_data( |
8524 data_reads, arraysize(data_reads), NULL, 0); | 8579 data_reads, arraysize(data_reads), NULL, 0); |
8525 session_deps_.socket_factory->AddSocketDataProvider(&second_data); | 8580 session_deps_.socket_factory->AddSocketDataProvider(&second_data); |
8526 | 8581 |
8527 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 8582 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
8528 | 8583 |
8529 base::WeakPtr<HttpServerProperties> http_server_properties = | 8584 base::WeakPtr<HttpServerProperties> http_server_properties = |
8530 session->http_server_properties(); | 8585 session->http_server_properties(); |
8531 const int kRestrictedAlternatePort = 80; | 8586 const int kRestrictedAlternatePort = 80; |
8532 http_server_properties->SetAlternateProtocol( | 8587 http_server_properties->SetAlternateProtocol( |
8533 HostPortPair::FromURL(restricted_port_request.url), | 8588 HostPortPair::FromURL(restricted_port_request.url), |
8534 kRestrictedAlternatePort, | 8589 kRestrictedAlternatePort, |
8535 AlternateProtocolFromNextProto(GetParam())); | 8590 AlternateProtocolFromNextProto(GetParam())); |
8536 | 8591 |
8537 scoped_ptr<HttpTransaction> trans( | 8592 scoped_ptr<HttpTransaction> trans( |
8538 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 8593 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
8539 TestCompletionCallback callback; | 8594 TestCompletionCallback callback; |
8540 | 8595 |
8541 int rv = trans->Start( | 8596 int rv = trans->Start( |
8542 &restricted_port_request, | 8597 &restricted_port_request, callback.callback(), BoundNetLog()); |
8543 callback.callback(), BoundNetLog()); | |
8544 EXPECT_EQ(ERR_IO_PENDING, rv); | 8598 EXPECT_EQ(ERR_IO_PENDING, rv); |
8545 // Valid change to restricted port should pass. | 8599 // Valid change to restricted port should pass. |
8546 EXPECT_EQ(OK, callback.WaitForResult()); | 8600 EXPECT_EQ(OK, callback.WaitForResult()); |
8547 } | 8601 } |
8548 | 8602 |
8549 TEST_P(HttpNetworkTransactionTest, | 8603 TEST_P(HttpNetworkTransactionTest, AlternateProtocolPortUnrestrictedAllowed1) { |
8550 AlternateProtocolPortUnrestrictedAllowed1) { | |
8551 // Ensure that we're not allowed to redirect traffic via an alternate | 8604 // Ensure that we're not allowed to redirect traffic via an alternate |
8552 // protocol to an unrestricted (port >= 1024) when the original traffic was | 8605 // protocol to an unrestricted (port >= 1024) when the original traffic was |
8553 // on a restricted port (port < 1024). Ensure that we can redirect in all | 8606 // on a restricted port (port < 1024). Ensure that we can redirect in all |
8554 // other cases. | 8607 // other cases. |
8555 HttpStreamFactory::set_use_alternate_protocols(true); | 8608 HttpStreamFactory::set_use_alternate_protocols(true); |
8556 | 8609 |
8557 HttpRequestInfo unrestricted_port_request; | 8610 HttpRequestInfo unrestricted_port_request; |
8558 unrestricted_port_request.method = "GET"; | 8611 unrestricted_port_request.method = "GET"; |
8559 unrestricted_port_request.url = GURL("http://www.google.com:1024/"); | 8612 unrestricted_port_request.url = GURL("http://www.google.com:1024/"); |
8560 unrestricted_port_request.load_flags = 0; | 8613 unrestricted_port_request.load_flags = 0; |
8561 | 8614 |
8562 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); | 8615 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); |
8563 StaticSocketDataProvider first_data; | 8616 StaticSocketDataProvider first_data; |
8564 first_data.set_connect_data(mock_connect); | 8617 first_data.set_connect_data(mock_connect); |
8565 session_deps_.socket_factory->AddSocketDataProvider(&first_data); | 8618 session_deps_.socket_factory->AddSocketDataProvider(&first_data); |
8566 | 8619 |
8567 MockRead data_reads[] = { | 8620 MockRead data_reads[] = { |
8568 MockRead("HTTP/1.1 200 OK\r\n\r\n"), | 8621 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"), |
8569 MockRead("hello world"), | 8622 MockRead(ASYNC, OK), |
8570 MockRead(ASYNC, OK), | |
8571 }; | 8623 }; |
8572 StaticSocketDataProvider second_data( | 8624 StaticSocketDataProvider second_data( |
8573 data_reads, arraysize(data_reads), NULL, 0); | 8625 data_reads, arraysize(data_reads), NULL, 0); |
8574 session_deps_.socket_factory->AddSocketDataProvider(&second_data); | 8626 session_deps_.socket_factory->AddSocketDataProvider(&second_data); |
8575 | 8627 |
8576 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 8628 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
8577 | 8629 |
8578 base::WeakPtr<HttpServerProperties> http_server_properties = | 8630 base::WeakPtr<HttpServerProperties> http_server_properties = |
8579 session->http_server_properties(); | 8631 session->http_server_properties(); |
8580 const int kRestrictedAlternatePort = 80; | 8632 const int kRestrictedAlternatePort = 80; |
8581 http_server_properties->SetAlternateProtocol( | 8633 http_server_properties->SetAlternateProtocol( |
8582 HostPortPair::FromURL(unrestricted_port_request.url), | 8634 HostPortPair::FromURL(unrestricted_port_request.url), |
8583 kRestrictedAlternatePort, | 8635 kRestrictedAlternatePort, |
8584 AlternateProtocolFromNextProto(GetParam())); | 8636 AlternateProtocolFromNextProto(GetParam())); |
8585 | 8637 |
8586 scoped_ptr<HttpTransaction> trans( | 8638 scoped_ptr<HttpTransaction> trans( |
8587 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 8639 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
8588 TestCompletionCallback callback; | 8640 TestCompletionCallback callback; |
8589 | 8641 |
8590 int rv = trans->Start( | 8642 int rv = trans->Start( |
8591 &unrestricted_port_request, callback.callback(), BoundNetLog()); | 8643 &unrestricted_port_request, callback.callback(), BoundNetLog()); |
8592 EXPECT_EQ(ERR_IO_PENDING, rv); | 8644 EXPECT_EQ(ERR_IO_PENDING, rv); |
8593 // Valid change to restricted port should pass. | 8645 // Valid change to restricted port should pass. |
8594 EXPECT_EQ(OK, callback.WaitForResult()); | 8646 EXPECT_EQ(OK, callback.WaitForResult()); |
8595 } | 8647 } |
8596 | 8648 |
8597 TEST_P(HttpNetworkTransactionTest, | 8649 TEST_P(HttpNetworkTransactionTest, AlternateProtocolPortUnrestrictedAllowed2) { |
8598 AlternateProtocolPortUnrestrictedAllowed2) { | |
8599 // Ensure that we're not allowed to redirect traffic via an alternate | 8650 // Ensure that we're not allowed to redirect traffic via an alternate |
8600 // protocol to an unrestricted (port >= 1024) when the original traffic was | 8651 // protocol to an unrestricted (port >= 1024) when the original traffic was |
8601 // on a restricted port (port < 1024). Ensure that we can redirect in all | 8652 // on a restricted port (port < 1024). Ensure that we can redirect in all |
8602 // other cases. | 8653 // other cases. |
8603 HttpStreamFactory::set_use_alternate_protocols(true); | 8654 HttpStreamFactory::set_use_alternate_protocols(true); |
8604 | 8655 |
8605 HttpRequestInfo unrestricted_port_request; | 8656 HttpRequestInfo unrestricted_port_request; |
8606 unrestricted_port_request.method = "GET"; | 8657 unrestricted_port_request.method = "GET"; |
8607 unrestricted_port_request.url = GURL("http://www.google.com:1024/"); | 8658 unrestricted_port_request.url = GURL("http://www.google.com:1024/"); |
8608 unrestricted_port_request.load_flags = 0; | 8659 unrestricted_port_request.load_flags = 0; |
8609 | 8660 |
8610 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); | 8661 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); |
8611 StaticSocketDataProvider first_data; | 8662 StaticSocketDataProvider first_data; |
8612 first_data.set_connect_data(mock_connect); | 8663 first_data.set_connect_data(mock_connect); |
8613 session_deps_.socket_factory->AddSocketDataProvider(&first_data); | 8664 session_deps_.socket_factory->AddSocketDataProvider(&first_data); |
8614 | 8665 |
8615 MockRead data_reads[] = { | 8666 MockRead data_reads[] = { |
8616 MockRead("HTTP/1.1 200 OK\r\n\r\n"), | 8667 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"), |
8617 MockRead("hello world"), | 8668 MockRead(ASYNC, OK), |
8618 MockRead(ASYNC, OK), | |
8619 }; | 8669 }; |
8620 StaticSocketDataProvider second_data( | 8670 StaticSocketDataProvider second_data( |
8621 data_reads, arraysize(data_reads), NULL, 0); | 8671 data_reads, arraysize(data_reads), NULL, 0); |
8622 session_deps_.socket_factory->AddSocketDataProvider(&second_data); | 8672 session_deps_.socket_factory->AddSocketDataProvider(&second_data); |
8623 | 8673 |
8624 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 8674 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
8625 | 8675 |
8626 base::WeakPtr<HttpServerProperties> http_server_properties = | 8676 base::WeakPtr<HttpServerProperties> http_server_properties = |
8627 session->http_server_properties(); | 8677 session->http_server_properties(); |
8628 const int kUnrestrictedAlternatePort = 1024; | 8678 const int kUnrestrictedAlternatePort = 1024; |
8629 http_server_properties->SetAlternateProtocol( | 8679 http_server_properties->SetAlternateProtocol( |
8630 HostPortPair::FromURL(unrestricted_port_request.url), | 8680 HostPortPair::FromURL(unrestricted_port_request.url), |
8631 kUnrestrictedAlternatePort, | 8681 kUnrestrictedAlternatePort, |
8632 AlternateProtocolFromNextProto(GetParam())); | 8682 AlternateProtocolFromNextProto(GetParam())); |
8633 | 8683 |
8634 scoped_ptr<HttpTransaction> trans( | 8684 scoped_ptr<HttpTransaction> trans( |
8635 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 8685 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
8636 TestCompletionCallback callback; | 8686 TestCompletionCallback callback; |
8637 | 8687 |
8638 int rv = trans->Start( | 8688 int rv = trans->Start( |
8639 &unrestricted_port_request, callback.callback(), BoundNetLog()); | 8689 &unrestricted_port_request, callback.callback(), BoundNetLog()); |
8640 EXPECT_EQ(ERR_IO_PENDING, rv); | 8690 EXPECT_EQ(ERR_IO_PENDING, rv); |
8641 // Valid change to an unrestricted port should pass. | 8691 // Valid change to an unrestricted port should pass. |
8642 EXPECT_EQ(OK, callback.WaitForResult()); | 8692 EXPECT_EQ(OK, callback.WaitForResult()); |
8643 } | 8693 } |
8644 | 8694 |
8645 TEST_P(HttpNetworkTransactionTest, | 8695 TEST_P(HttpNetworkTransactionTest, AlternateProtocolUnsafeBlocked) { |
8646 AlternateProtocolUnsafeBlocked) { | |
8647 // Ensure that we're not allowed to redirect traffic via an alternate | 8696 // Ensure that we're not allowed to redirect traffic via an alternate |
8648 // protocol to an unsafe port, and that we resume the second | 8697 // protocol to an unsafe port, and that we resume the second |
8649 // HttpStreamFactoryImpl::Job once the alternate protocol request fails. | 8698 // HttpStreamFactoryImpl::Job once the alternate protocol request fails. |
8650 HttpStreamFactory::set_use_alternate_protocols(true); | 8699 HttpStreamFactory::set_use_alternate_protocols(true); |
8651 | 8700 |
8652 HttpRequestInfo request; | 8701 HttpRequestInfo request; |
8653 request.method = "GET"; | 8702 request.method = "GET"; |
8654 request.url = GURL("http://www.google.com/"); | 8703 request.url = GURL("http://www.google.com/"); |
8655 request.load_flags = 0; | 8704 request.load_flags = 0; |
8656 | 8705 |
8657 // The alternate protocol request will error out before we attempt to connect, | 8706 // The alternate protocol request will error out before we attempt to connect, |
8658 // so only the standard HTTP request will try to connect. | 8707 // so only the standard HTTP request will try to connect. |
8659 MockRead data_reads[] = { | 8708 MockRead data_reads[] = { |
8660 MockRead("HTTP/1.1 200 OK\r\n\r\n"), | 8709 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"), |
8661 MockRead("hello world"), | 8710 MockRead(ASYNC, OK), |
8662 MockRead(ASYNC, OK), | |
8663 }; | 8711 }; |
8664 StaticSocketDataProvider data( | 8712 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); |
8665 data_reads, arraysize(data_reads), NULL, 0); | |
8666 session_deps_.socket_factory->AddSocketDataProvider(&data); | 8713 session_deps_.socket_factory->AddSocketDataProvider(&data); |
8667 | 8714 |
8668 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 8715 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
8669 | 8716 |
8670 base::WeakPtr<HttpServerProperties> http_server_properties = | 8717 base::WeakPtr<HttpServerProperties> http_server_properties = |
8671 session->http_server_properties(); | 8718 session->http_server_properties(); |
8672 const int kUnsafePort = 7; | 8719 const int kUnsafePort = 7; |
8673 http_server_properties->SetAlternateProtocol( | 8720 http_server_properties->SetAlternateProtocol( |
8674 HostPortPair::FromURL(request.url), | 8721 HostPortPair::FromURL(request.url), |
8675 kUnsafePort, | 8722 kUnsafePort, |
(...skipping 23 matching lines...) Expand all Loading... |
8699 | 8746 |
8700 TEST_P(HttpNetworkTransactionTest, UseAlternateProtocolForNpnSpdy) { | 8747 TEST_P(HttpNetworkTransactionTest, UseAlternateProtocolForNpnSpdy) { |
8701 HttpStreamFactory::set_use_alternate_protocols(true); | 8748 HttpStreamFactory::set_use_alternate_protocols(true); |
8702 HttpStreamFactory::SetNextProtos(SpdyNextProtos()); | 8749 HttpStreamFactory::SetNextProtos(SpdyNextProtos()); |
8703 | 8750 |
8704 HttpRequestInfo request; | 8751 HttpRequestInfo request; |
8705 request.method = "GET"; | 8752 request.method = "GET"; |
8706 request.url = GURL("http://www.google.com/"); | 8753 request.url = GURL("http://www.google.com/"); |
8707 request.load_flags = 0; | 8754 request.load_flags = 0; |
8708 | 8755 |
8709 std::string alternate_protocol_http_header = | 8756 std::string alternate_protocol_http_header = GetAlternateProtocolHttpHeader(); |
8710 GetAlternateProtocolHttpHeader(); | |
8711 | 8757 |
8712 MockRead data_reads[] = { | 8758 MockRead data_reads[] = { |
8713 MockRead("HTTP/1.1 200 OK\r\n"), | 8759 MockRead("HTTP/1.1 200 OK\r\n"), |
8714 MockRead(alternate_protocol_http_header.c_str()), | 8760 MockRead(alternate_protocol_http_header.c_str()), MockRead("hello world"), |
8715 MockRead("hello world"), | 8761 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
8716 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 8762 MockRead(ASYNC, OK)}; |
8717 MockRead(ASYNC, OK) | |
8718 }; | |
8719 | 8763 |
8720 StaticSocketDataProvider first_transaction( | 8764 StaticSocketDataProvider first_transaction( |
8721 data_reads, arraysize(data_reads), NULL, 0); | 8765 data_reads, arraysize(data_reads), NULL, 0); |
8722 session_deps_.socket_factory->AddSocketDataProvider(&first_transaction); | 8766 session_deps_.socket_factory->AddSocketDataProvider(&first_transaction); |
8723 | 8767 |
8724 SSLSocketDataProvider ssl(ASYNC, OK); | 8768 SSLSocketDataProvider ssl(ASYNC, OK); |
8725 ssl.SetNextProto(GetParam()); | 8769 ssl.SetNextProto(GetParam()); |
8726 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 8770 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
8727 | 8771 |
8728 scoped_ptr<SpdyFrame> req( | 8772 scoped_ptr<SpdyFrame> req( |
8729 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); | 8773 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); |
8730 MockWrite spdy_writes[] = { CreateMockWrite(*req) }; | 8774 MockWrite spdy_writes[] = {CreateMockWrite(*req)}; |
8731 | 8775 |
8732 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 8776 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
8733 scoped_ptr<SpdyFrame> data(spdy_util_.ConstructSpdyBodyFrame(1, true)); | 8777 scoped_ptr<SpdyFrame> data(spdy_util_.ConstructSpdyBodyFrame(1, true)); |
8734 MockRead spdy_reads[] = { | 8778 MockRead spdy_reads[] = { |
8735 CreateMockRead(*resp), | 8779 CreateMockRead(*resp), CreateMockRead(*data), MockRead(ASYNC, 0, 0), |
8736 CreateMockRead(*data), | |
8737 MockRead(ASYNC, 0, 0), | |
8738 }; | 8780 }; |
8739 | 8781 |
8740 DelayedSocketData spdy_data( | 8782 DelayedSocketData spdy_data( |
8741 1, // wait for one write to finish before reading. | 8783 1, // wait for one write to finish before reading. |
8742 spdy_reads, arraysize(spdy_reads), | 8784 spdy_reads, |
8743 spdy_writes, arraysize(spdy_writes)); | 8785 arraysize(spdy_reads), |
| 8786 spdy_writes, |
| 8787 arraysize(spdy_writes)); |
8744 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); | 8788 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); |
8745 | 8789 |
8746 MockConnect never_finishing_connect(SYNCHRONOUS, ERR_IO_PENDING); | 8790 MockConnect never_finishing_connect(SYNCHRONOUS, ERR_IO_PENDING); |
8747 StaticSocketDataProvider hanging_non_alternate_protocol_socket( | 8791 StaticSocketDataProvider hanging_non_alternate_protocol_socket( |
8748 NULL, 0, NULL, 0); | 8792 NULL, 0, NULL, 0); |
8749 hanging_non_alternate_protocol_socket.set_connect_data( | 8793 hanging_non_alternate_protocol_socket.set_connect_data( |
8750 never_finishing_connect); | 8794 never_finishing_connect); |
8751 session_deps_.socket_factory->AddSocketDataProvider( | 8795 session_deps_.socket_factory->AddSocketDataProvider( |
8752 &hanging_non_alternate_protocol_socket); | 8796 &hanging_non_alternate_protocol_socket); |
8753 | 8797 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8789 | 8833 |
8790 TEST_P(HttpNetworkTransactionTest, AlternateProtocolWithSpdyLateBinding) { | 8834 TEST_P(HttpNetworkTransactionTest, AlternateProtocolWithSpdyLateBinding) { |
8791 HttpStreamFactory::set_use_alternate_protocols(true); | 8835 HttpStreamFactory::set_use_alternate_protocols(true); |
8792 HttpStreamFactory::SetNextProtos(SpdyNextProtos()); | 8836 HttpStreamFactory::SetNextProtos(SpdyNextProtos()); |
8793 | 8837 |
8794 HttpRequestInfo request; | 8838 HttpRequestInfo request; |
8795 request.method = "GET"; | 8839 request.method = "GET"; |
8796 request.url = GURL("http://www.google.com/"); | 8840 request.url = GURL("http://www.google.com/"); |
8797 request.load_flags = 0; | 8841 request.load_flags = 0; |
8798 | 8842 |
8799 std::string alternate_protocol_http_header = | 8843 std::string alternate_protocol_http_header = GetAlternateProtocolHttpHeader(); |
8800 GetAlternateProtocolHttpHeader(); | |
8801 | 8844 |
8802 MockRead data_reads[] = { | 8845 MockRead data_reads[] = { |
8803 MockRead("HTTP/1.1 200 OK\r\n"), | 8846 MockRead("HTTP/1.1 200 OK\r\n"), |
8804 MockRead(alternate_protocol_http_header.c_str()), | 8847 MockRead(alternate_protocol_http_header.c_str()), |
8805 MockRead("hello world"), | 8848 MockRead("hello world"), |
8806 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 8849 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
8807 MockRead(ASYNC, OK), | 8850 MockRead(ASYNC, OK), |
8808 }; | 8851 }; |
8809 | 8852 |
8810 StaticSocketDataProvider first_transaction( | 8853 StaticSocketDataProvider first_transaction( |
8811 data_reads, arraysize(data_reads), NULL, 0); | 8854 data_reads, arraysize(data_reads), NULL, 0); |
8812 // Socket 1 is the HTTP transaction with the Alternate-Protocol header. | 8855 // Socket 1 is the HTTP transaction with the Alternate-Protocol header. |
8813 session_deps_.socket_factory->AddSocketDataProvider(&first_transaction); | 8856 session_deps_.socket_factory->AddSocketDataProvider(&first_transaction); |
8814 | 8857 |
8815 MockConnect never_finishing_connect(SYNCHRONOUS, ERR_IO_PENDING); | 8858 MockConnect never_finishing_connect(SYNCHRONOUS, ERR_IO_PENDING); |
8816 StaticSocketDataProvider hanging_socket( | 8859 StaticSocketDataProvider hanging_socket(NULL, 0, NULL, 0); |
8817 NULL, 0, NULL, 0); | |
8818 hanging_socket.set_connect_data(never_finishing_connect); | 8860 hanging_socket.set_connect_data(never_finishing_connect); |
8819 // Socket 2 and 3 are the hanging Alternate-Protocol and | 8861 // Socket 2 and 3 are the hanging Alternate-Protocol and |
8820 // non-Alternate-Protocol jobs from the 2nd transaction. | 8862 // non-Alternate-Protocol jobs from the 2nd transaction. |
8821 session_deps_.socket_factory->AddSocketDataProvider(&hanging_socket); | 8863 session_deps_.socket_factory->AddSocketDataProvider(&hanging_socket); |
8822 session_deps_.socket_factory->AddSocketDataProvider(&hanging_socket); | 8864 session_deps_.socket_factory->AddSocketDataProvider(&hanging_socket); |
8823 | 8865 |
8824 SSLSocketDataProvider ssl(ASYNC, OK); | 8866 SSLSocketDataProvider ssl(ASYNC, OK); |
8825 ssl.SetNextProto(GetParam()); | 8867 ssl.SetNextProto(GetParam()); |
8826 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 8868 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
8827 | 8869 |
8828 scoped_ptr<SpdyFrame> req1( | 8870 scoped_ptr<SpdyFrame> req1( |
8829 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); | 8871 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); |
8830 scoped_ptr<SpdyFrame> req2( | 8872 scoped_ptr<SpdyFrame> req2( |
8831 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, LOWEST, true)); | 8873 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, LOWEST, true)); |
8832 MockWrite spdy_writes[] = { | 8874 MockWrite spdy_writes[] = { |
8833 CreateMockWrite(*req1), | 8875 CreateMockWrite(*req1), CreateMockWrite(*req2), |
8834 CreateMockWrite(*req2), | |
8835 }; | 8876 }; |
8836 scoped_ptr<SpdyFrame> resp1(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 8877 scoped_ptr<SpdyFrame> resp1(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
8837 scoped_ptr<SpdyFrame> data1(spdy_util_.ConstructSpdyBodyFrame(1, true)); | 8878 scoped_ptr<SpdyFrame> data1(spdy_util_.ConstructSpdyBodyFrame(1, true)); |
8838 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); | 8879 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); |
8839 scoped_ptr<SpdyFrame> data2(spdy_util_.ConstructSpdyBodyFrame(3, true)); | 8880 scoped_ptr<SpdyFrame> data2(spdy_util_.ConstructSpdyBodyFrame(3, true)); |
8840 MockRead spdy_reads[] = { | 8881 MockRead spdy_reads[] = { |
8841 CreateMockRead(*resp1), | 8882 CreateMockRead(*resp1), CreateMockRead(*data1), CreateMockRead(*resp2), |
8842 CreateMockRead(*data1), | 8883 CreateMockRead(*data2), MockRead(ASYNC, 0, 0), |
8843 CreateMockRead(*resp2), | |
8844 CreateMockRead(*data2), | |
8845 MockRead(ASYNC, 0, 0), | |
8846 }; | 8884 }; |
8847 | 8885 |
8848 DelayedSocketData spdy_data( | 8886 DelayedSocketData spdy_data(2, // wait for writes to finish before reading. |
8849 2, // wait for writes to finish before reading. | 8887 spdy_reads, |
8850 spdy_reads, arraysize(spdy_reads), | 8888 arraysize(spdy_reads), |
8851 spdy_writes, arraysize(spdy_writes)); | 8889 spdy_writes, |
| 8890 arraysize(spdy_writes)); |
8852 // Socket 4 is the successful Alternate-Protocol for transaction 3. | 8891 // Socket 4 is the successful Alternate-Protocol for transaction 3. |
8853 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); | 8892 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); |
8854 | 8893 |
8855 // Socket 5 is the unsuccessful non-Alternate-Protocol for transaction 3. | 8894 // Socket 5 is the unsuccessful non-Alternate-Protocol for transaction 3. |
8856 session_deps_.socket_factory->AddSocketDataProvider(&hanging_socket); | 8895 session_deps_.socket_factory->AddSocketDataProvider(&hanging_socket); |
8857 | 8896 |
8858 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 8897 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
8859 TestCompletionCallback callback1; | 8898 TestCompletionCallback callback1; |
8860 HttpNetworkTransaction trans1(DEFAULT_PRIORITY, session.get()); | 8899 HttpNetworkTransaction trans1(DEFAULT_PRIORITY, session.get()); |
8861 | 8900 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8906 | 8945 |
8907 TEST_P(HttpNetworkTransactionTest, StallAlternateProtocolForNpnSpdy) { | 8946 TEST_P(HttpNetworkTransactionTest, StallAlternateProtocolForNpnSpdy) { |
8908 HttpStreamFactory::set_use_alternate_protocols(true); | 8947 HttpStreamFactory::set_use_alternate_protocols(true); |
8909 HttpStreamFactory::SetNextProtos(SpdyNextProtos()); | 8948 HttpStreamFactory::SetNextProtos(SpdyNextProtos()); |
8910 | 8949 |
8911 HttpRequestInfo request; | 8950 HttpRequestInfo request; |
8912 request.method = "GET"; | 8951 request.method = "GET"; |
8913 request.url = GURL("http://www.google.com/"); | 8952 request.url = GURL("http://www.google.com/"); |
8914 request.load_flags = 0; | 8953 request.load_flags = 0; |
8915 | 8954 |
8916 std::string alternate_protocol_http_header = | 8955 std::string alternate_protocol_http_header = GetAlternateProtocolHttpHeader(); |
8917 GetAlternateProtocolHttpHeader(); | |
8918 | 8956 |
8919 MockRead data_reads[] = { | 8957 MockRead data_reads[] = { |
8920 MockRead("HTTP/1.1 200 OK\r\n"), | 8958 MockRead("HTTP/1.1 200 OK\r\n"), |
8921 MockRead(alternate_protocol_http_header.c_str()), | 8959 MockRead(alternate_protocol_http_header.c_str()), |
8922 MockRead("hello world"), | 8960 MockRead("hello world"), |
8923 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 8961 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
8924 MockRead(ASYNC, OK), | 8962 MockRead(ASYNC, OK), |
8925 }; | 8963 }; |
8926 | 8964 |
8927 StaticSocketDataProvider first_transaction( | 8965 StaticSocketDataProvider first_transaction( |
8928 data_reads, arraysize(data_reads), NULL, 0); | 8966 data_reads, arraysize(data_reads), NULL, 0); |
8929 session_deps_.socket_factory->AddSocketDataProvider(&first_transaction); | 8967 session_deps_.socket_factory->AddSocketDataProvider(&first_transaction); |
8930 | 8968 |
8931 SSLSocketDataProvider ssl(ASYNC, OK); | 8969 SSLSocketDataProvider ssl(ASYNC, OK); |
8932 ssl.SetNextProto(GetParam()); | 8970 ssl.SetNextProto(GetParam()); |
8933 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 8971 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
8934 | 8972 |
8935 MockConnect never_finishing_connect(SYNCHRONOUS, ERR_IO_PENDING); | 8973 MockConnect never_finishing_connect(SYNCHRONOUS, ERR_IO_PENDING); |
8936 StaticSocketDataProvider hanging_alternate_protocol_socket( | 8974 StaticSocketDataProvider hanging_alternate_protocol_socket(NULL, 0, NULL, 0); |
8937 NULL, 0, NULL, 0); | 8975 hanging_alternate_protocol_socket.set_connect_data(never_finishing_connect); |
8938 hanging_alternate_protocol_socket.set_connect_data( | |
8939 never_finishing_connect); | |
8940 session_deps_.socket_factory->AddSocketDataProvider( | 8976 session_deps_.socket_factory->AddSocketDataProvider( |
8941 &hanging_alternate_protocol_socket); | 8977 &hanging_alternate_protocol_socket); |
8942 | 8978 |
8943 // 2nd request is just a copy of the first one, over HTTP again. | 8979 // 2nd request is just a copy of the first one, over HTTP again. |
8944 session_deps_.socket_factory->AddSocketDataProvider(&first_transaction); | 8980 session_deps_.socket_factory->AddSocketDataProvider(&first_transaction); |
8945 | 8981 |
8946 TestCompletionCallback callback; | 8982 TestCompletionCallback callback; |
8947 | 8983 |
8948 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 8984 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
8949 scoped_ptr<HttpTransaction> trans( | 8985 scoped_ptr<HttpTransaction> trans( |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8989 const CompletionCallback& callback, | 9025 const CompletionCallback& callback, |
8990 RequestHandle* request, | 9026 RequestHandle* request, |
8991 const BoundNetLog& net_log) OVERRIDE { | 9027 const BoundNetLog& net_log) OVERRIDE { |
8992 ProxyServer proxy_server(ProxyServer::SCHEME_HTTP, | 9028 ProxyServer proxy_server(ProxyServer::SCHEME_HTTP, |
8993 HostPortPair("myproxy", 80)); | 9029 HostPortPair("myproxy", 80)); |
8994 results->UseProxyServer(proxy_server); | 9030 results->UseProxyServer(proxy_server); |
8995 resolved_.push_back(url); | 9031 resolved_.push_back(url); |
8996 return OK; | 9032 return OK; |
8997 } | 9033 } |
8998 | 9034 |
8999 virtual void CancelRequest(RequestHandle request) OVERRIDE { | 9035 virtual void CancelRequest(RequestHandle request) OVERRIDE { NOTREACHED(); } |
9000 NOTREACHED(); | |
9001 } | |
9002 | 9036 |
9003 virtual LoadState GetLoadState(RequestHandle request) const OVERRIDE { | 9037 virtual LoadState GetLoadState(RequestHandle request) const OVERRIDE { |
9004 NOTREACHED(); | 9038 NOTREACHED(); |
9005 return LOAD_STATE_IDLE; | 9039 return LOAD_STATE_IDLE; |
9006 } | 9040 } |
9007 | 9041 |
9008 virtual void CancelSetPacScript() OVERRIDE { | 9042 virtual void CancelSetPacScript() OVERRIDE { NOTREACHED(); } |
9009 NOTREACHED(); | |
9010 } | |
9011 | 9043 |
9012 virtual int SetPacScript(const scoped_refptr<ProxyResolverScriptData>&, | 9044 virtual int SetPacScript(const scoped_refptr<ProxyResolverScriptData>&, |
9013 const CompletionCallback& /*callback*/) OVERRIDE { | 9045 const CompletionCallback& /*callback*/) OVERRIDE { |
9014 return OK; | 9046 return OK; |
9015 } | 9047 } |
9016 | 9048 |
9017 const std::vector<GURL>& resolved() const { return resolved_; } | 9049 const std::vector<GURL>& resolved() const { return resolved_; } |
9018 | 9050 |
9019 private: | 9051 private: |
9020 std::vector<GURL> resolved_; | 9052 std::vector<GURL> resolved_; |
9021 | 9053 |
9022 DISALLOW_COPY_AND_ASSIGN(CapturingProxyResolver); | 9054 DISALLOW_COPY_AND_ASSIGN(CapturingProxyResolver); |
9023 }; | 9055 }; |
9024 | 9056 |
9025 TEST_P(HttpNetworkTransactionTest, | 9057 TEST_P(HttpNetworkTransactionTest, UseAlternateProtocolForTunneledNpnSpdy) { |
9026 UseAlternateProtocolForTunneledNpnSpdy) { | |
9027 HttpStreamFactory::set_use_alternate_protocols(true); | 9058 HttpStreamFactory::set_use_alternate_protocols(true); |
9028 HttpStreamFactory::SetNextProtos(SpdyNextProtos()); | 9059 HttpStreamFactory::SetNextProtos(SpdyNextProtos()); |
9029 | 9060 |
9030 ProxyConfig proxy_config; | 9061 ProxyConfig proxy_config; |
9031 proxy_config.set_auto_detect(true); | 9062 proxy_config.set_auto_detect(true); |
9032 proxy_config.set_pac_url(GURL("http://fooproxyurl")); | 9063 proxy_config.set_pac_url(GURL("http://fooproxyurl")); |
9033 | 9064 |
9034 CapturingProxyResolver* capturing_proxy_resolver = | 9065 CapturingProxyResolver* capturing_proxy_resolver = |
9035 new CapturingProxyResolver(); | 9066 new CapturingProxyResolver(); |
9036 session_deps_.proxy_service.reset(new ProxyService( | 9067 session_deps_.proxy_service.reset( |
9037 new ProxyConfigServiceFixed(proxy_config), capturing_proxy_resolver, | 9068 new ProxyService(new ProxyConfigServiceFixed(proxy_config), |
9038 NULL)); | 9069 capturing_proxy_resolver, |
| 9070 NULL)); |
9039 CapturingNetLog net_log; | 9071 CapturingNetLog net_log; |
9040 session_deps_.net_log = &net_log; | 9072 session_deps_.net_log = &net_log; |
9041 | 9073 |
9042 HttpRequestInfo request; | 9074 HttpRequestInfo request; |
9043 request.method = "GET"; | 9075 request.method = "GET"; |
9044 request.url = GURL("http://www.google.com/"); | 9076 request.url = GURL("http://www.google.com/"); |
9045 request.load_flags = 0; | 9077 request.load_flags = 0; |
9046 | 9078 |
9047 std::string alternate_protocol_http_header = | 9079 std::string alternate_protocol_http_header = GetAlternateProtocolHttpHeader(); |
9048 GetAlternateProtocolHttpHeader(); | |
9049 | 9080 |
9050 MockRead data_reads[] = { | 9081 MockRead data_reads[] = { |
9051 MockRead("HTTP/1.1 200 OK\r\n"), | 9082 MockRead("HTTP/1.1 200 OK\r\n"), |
9052 MockRead(alternate_protocol_http_header.c_str()), | 9083 MockRead(alternate_protocol_http_header.c_str()), |
9053 MockRead("hello world"), | 9084 MockRead("hello world"), |
9054 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 9085 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
9055 MockRead(ASYNC, OK), | 9086 MockRead(ASYNC, OK), |
9056 }; | 9087 }; |
9057 | 9088 |
9058 StaticSocketDataProvider first_transaction( | 9089 StaticSocketDataProvider first_transaction( |
9059 data_reads, arraysize(data_reads), NULL, 0); | 9090 data_reads, arraysize(data_reads), NULL, 0); |
9060 session_deps_.socket_factory->AddSocketDataProvider(&first_transaction); | 9091 session_deps_.socket_factory->AddSocketDataProvider(&first_transaction); |
9061 | 9092 |
9062 SSLSocketDataProvider ssl(ASYNC, OK); | 9093 SSLSocketDataProvider ssl(ASYNC, OK); |
9063 ssl.SetNextProto(GetParam()); | 9094 ssl.SetNextProto(GetParam()); |
9064 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 9095 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
9065 | 9096 |
9066 scoped_ptr<SpdyFrame> req( | 9097 scoped_ptr<SpdyFrame> req( |
9067 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); | 9098 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); |
9068 MockWrite spdy_writes[] = { | 9099 MockWrite spdy_writes[] = { |
9069 MockWrite("CONNECT www.google.com:443 HTTP/1.1\r\n" | 9100 MockWrite( |
9070 "Host: www.google.com\r\n" | 9101 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
9071 "Proxy-Connection: keep-alive\r\n\r\n"), // 0 | 9102 "Host: www.google.com\r\n" |
9072 CreateMockWrite(*req), // 3 | 9103 "Proxy-Connection: keep-alive\r\n\r\n"), // 0 |
| 9104 CreateMockWrite(*req), // 3 |
9073 }; | 9105 }; |
9074 | 9106 |
9075 const char kCONNECTResponse[] = "HTTP/1.1 200 Connected\r\n\r\n"; | 9107 const char kCONNECTResponse[] = "HTTP/1.1 200 Connected\r\n\r\n"; |
9076 | 9108 |
9077 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 9109 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
9078 scoped_ptr<SpdyFrame> data(spdy_util_.ConstructSpdyBodyFrame(1, true)); | 9110 scoped_ptr<SpdyFrame> data(spdy_util_.ConstructSpdyBodyFrame(1, true)); |
9079 MockRead spdy_reads[] = { | 9111 MockRead spdy_reads[] = { |
9080 MockRead(ASYNC, kCONNECTResponse, arraysize(kCONNECTResponse) - 1, 1), // 1 | 9112 MockRead( |
9081 CreateMockRead(*resp.get(), 4), // 2, 4 | 9113 ASYNC, kCONNECTResponse, arraysize(kCONNECTResponse) - 1, 1), // 1 |
9082 CreateMockRead(*data.get(), 4), // 5 | 9114 CreateMockRead(*resp.get(), 4), // 2, 4 |
9083 MockRead(ASYNC, 0, 0, 4), // 6 | 9115 CreateMockRead(*data.get(), 4), // 5 |
| 9116 MockRead(ASYNC, 0, 0, 4), // 6 |
9084 }; | 9117 }; |
9085 | 9118 |
9086 OrderedSocketData spdy_data( | 9119 OrderedSocketData spdy_data( |
9087 spdy_reads, arraysize(spdy_reads), | 9120 spdy_reads, arraysize(spdy_reads), spdy_writes, arraysize(spdy_writes)); |
9088 spdy_writes, arraysize(spdy_writes)); | |
9089 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); | 9121 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); |
9090 | 9122 |
9091 MockConnect never_finishing_connect(SYNCHRONOUS, ERR_IO_PENDING); | 9123 MockConnect never_finishing_connect(SYNCHRONOUS, ERR_IO_PENDING); |
9092 StaticSocketDataProvider hanging_non_alternate_protocol_socket( | 9124 StaticSocketDataProvider hanging_non_alternate_protocol_socket( |
9093 NULL, 0, NULL, 0); | 9125 NULL, 0, NULL, 0); |
9094 hanging_non_alternate_protocol_socket.set_connect_data( | 9126 hanging_non_alternate_protocol_socket.set_connect_data( |
9095 never_finishing_connect); | 9127 never_finishing_connect); |
9096 session_deps_.socket_factory->AddSocketDataProvider( | 9128 session_deps_.socket_factory->AddSocketDataProvider( |
9097 &hanging_non_alternate_protocol_socket); | 9129 &hanging_non_alternate_protocol_socket); |
9098 | 9130 |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9147 TEST_P(HttpNetworkTransactionTest, | 9179 TEST_P(HttpNetworkTransactionTest, |
9148 UseAlternateProtocolForNpnSpdyWithExistingSpdySession) { | 9180 UseAlternateProtocolForNpnSpdyWithExistingSpdySession) { |
9149 HttpStreamFactory::set_use_alternate_protocols(true); | 9181 HttpStreamFactory::set_use_alternate_protocols(true); |
9150 HttpStreamFactory::SetNextProtos(SpdyNextProtos()); | 9182 HttpStreamFactory::SetNextProtos(SpdyNextProtos()); |
9151 | 9183 |
9152 HttpRequestInfo request; | 9184 HttpRequestInfo request; |
9153 request.method = "GET"; | 9185 request.method = "GET"; |
9154 request.url = GURL("http://www.google.com/"); | 9186 request.url = GURL("http://www.google.com/"); |
9155 request.load_flags = 0; | 9187 request.load_flags = 0; |
9156 | 9188 |
9157 std::string alternate_protocol_http_header = | 9189 std::string alternate_protocol_http_header = GetAlternateProtocolHttpHeader(); |
9158 GetAlternateProtocolHttpHeader(); | |
9159 | 9190 |
9160 MockRead data_reads[] = { | 9191 MockRead data_reads[] = { |
9161 MockRead("HTTP/1.1 200 OK\r\n"), | 9192 MockRead("HTTP/1.1 200 OK\r\n"), |
9162 MockRead(alternate_protocol_http_header.c_str()), | 9193 MockRead(alternate_protocol_http_header.c_str()), MockRead("hello world"), |
9163 MockRead("hello world"), | 9194 MockRead(ASYNC, OK), |
9164 MockRead(ASYNC, OK), | |
9165 }; | 9195 }; |
9166 | 9196 |
9167 StaticSocketDataProvider first_transaction( | 9197 StaticSocketDataProvider first_transaction( |
9168 data_reads, arraysize(data_reads), NULL, 0); | 9198 data_reads, arraysize(data_reads), NULL, 0); |
9169 session_deps_.socket_factory->AddSocketDataProvider(&first_transaction); | 9199 session_deps_.socket_factory->AddSocketDataProvider(&first_transaction); |
9170 | 9200 |
9171 SSLSocketDataProvider ssl(ASYNC, OK); | 9201 SSLSocketDataProvider ssl(ASYNC, OK); |
9172 ssl.SetNextProto(GetParam()); | 9202 ssl.SetNextProto(GetParam()); |
9173 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 9203 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
9174 | 9204 |
9175 scoped_ptr<SpdyFrame> req( | 9205 scoped_ptr<SpdyFrame> req( |
9176 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); | 9206 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); |
9177 MockWrite spdy_writes[] = { CreateMockWrite(*req) }; | 9207 MockWrite spdy_writes[] = {CreateMockWrite(*req)}; |
9178 | 9208 |
9179 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 9209 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
9180 scoped_ptr<SpdyFrame> data(spdy_util_.ConstructSpdyBodyFrame(1, true)); | 9210 scoped_ptr<SpdyFrame> data(spdy_util_.ConstructSpdyBodyFrame(1, true)); |
9181 MockRead spdy_reads[] = { | 9211 MockRead spdy_reads[] = { |
9182 CreateMockRead(*resp), | 9212 CreateMockRead(*resp), CreateMockRead(*data), MockRead(ASYNC, 0, 0), |
9183 CreateMockRead(*data), | |
9184 MockRead(ASYNC, 0, 0), | |
9185 }; | 9213 }; |
9186 | 9214 |
9187 DelayedSocketData spdy_data( | 9215 DelayedSocketData spdy_data( |
9188 1, // wait for one write to finish before reading. | 9216 1, // wait for one write to finish before reading. |
9189 spdy_reads, arraysize(spdy_reads), | 9217 spdy_reads, |
9190 spdy_writes, arraysize(spdy_writes)); | 9218 arraysize(spdy_reads), |
| 9219 spdy_writes, |
| 9220 arraysize(spdy_writes)); |
9191 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); | 9221 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); |
9192 | 9222 |
9193 TestCompletionCallback callback; | 9223 TestCompletionCallback callback; |
9194 | 9224 |
9195 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 9225 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
9196 | 9226 |
9197 scoped_ptr<HttpTransaction> trans( | 9227 scoped_ptr<HttpTransaction> trans( |
9198 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 9228 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
9199 | 9229 |
9200 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 9230 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
9201 EXPECT_EQ(ERR_IO_PENDING, rv); | 9231 EXPECT_EQ(ERR_IO_PENDING, rv); |
9202 EXPECT_EQ(OK, callback.WaitForResult()); | 9232 EXPECT_EQ(OK, callback.WaitForResult()); |
9203 | 9233 |
9204 const HttpResponseInfo* response = trans->GetResponseInfo(); | 9234 const HttpResponseInfo* response = trans->GetResponseInfo(); |
9205 ASSERT_TRUE(response != NULL); | 9235 ASSERT_TRUE(response != NULL); |
9206 ASSERT_TRUE(response->headers.get() != NULL); | 9236 ASSERT_TRUE(response->headers.get() != NULL); |
9207 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); | 9237 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
9208 | 9238 |
9209 std::string response_data; | 9239 std::string response_data; |
9210 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); | 9240 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); |
9211 EXPECT_EQ("hello world", response_data); | 9241 EXPECT_EQ("hello world", response_data); |
9212 | 9242 |
9213 // Set up an initial SpdySession in the pool to reuse. | 9243 // Set up an initial SpdySession in the pool to reuse. |
9214 HostPortPair host_port_pair("www.google.com", 443); | 9244 HostPortPair host_port_pair("www.google.com", 443); |
9215 SpdySessionKey key(host_port_pair, ProxyServer::Direct(), | 9245 SpdySessionKey key( |
9216 PRIVACY_MODE_DISABLED); | 9246 host_port_pair, ProxyServer::Direct(), PRIVACY_MODE_DISABLED); |
9217 base::WeakPtr<SpdySession> spdy_session = | 9247 base::WeakPtr<SpdySession> spdy_session = |
9218 CreateSecureSpdySession(session, key, BoundNetLog()); | 9248 CreateSecureSpdySession(session, key, BoundNetLog()); |
9219 | 9249 |
9220 trans.reset(new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 9250 trans.reset(new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
9221 | 9251 |
9222 rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 9252 rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
9223 EXPECT_EQ(ERR_IO_PENDING, rv); | 9253 EXPECT_EQ(ERR_IO_PENDING, rv); |
9224 EXPECT_EQ(OK, callback.WaitForResult()); | 9254 EXPECT_EQ(OK, callback.WaitForResult()); |
9225 | 9255 |
9226 response = trans->GetResponseInfo(); | 9256 response = trans->GetResponseInfo(); |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9299 "CONNECT www.example.com:443 HTTP/1.1\r\n" | 9329 "CONNECT www.example.com:443 HTTP/1.1\r\n" |
9300 "Host: www.example.com\r\n" | 9330 "Host: www.example.com\r\n" |
9301 "Proxy-Connection: keep-alive\r\n" | 9331 "Proxy-Connection: keep-alive\r\n" |
9302 "Proxy-Authorization: auth_token\r\n\r\n"); | 9332 "Proxy-Authorization: auth_token\r\n\r\n"); |
9303 | 9333 |
9304 const MockRead kSuccess( | 9334 const MockRead kSuccess( |
9305 "HTTP/1.1 200 OK\r\n" | 9335 "HTTP/1.1 200 OK\r\n" |
9306 "Content-Type: text/html; charset=iso-8859-1\r\n" | 9336 "Content-Type: text/html; charset=iso-8859-1\r\n" |
9307 "Content-Length: 3\r\n\r\n" | 9337 "Content-Length: 3\r\n\r\n" |
9308 "Yes"); | 9338 "Yes"); |
9309 const MockRead kFailure( | 9339 const MockRead kFailure("Should not be called."); |
9310 "Should not be called."); | |
9311 const MockRead kServerChallenge( | 9340 const MockRead kServerChallenge( |
9312 "HTTP/1.1 401 Unauthorized\r\n" | 9341 "HTTP/1.1 401 Unauthorized\r\n" |
9313 "WWW-Authenticate: Mock realm=server\r\n" | 9342 "WWW-Authenticate: Mock realm=server\r\n" |
9314 "Content-Type: text/html; charset=iso-8859-1\r\n" | 9343 "Content-Type: text/html; charset=iso-8859-1\r\n" |
9315 "Content-Length: 14\r\n\r\n" | 9344 "Content-Length: 14\r\n\r\n" |
9316 "Unauthorized\r\n"); | 9345 "Unauthorized\r\n"); |
9317 const MockRead kProxyChallenge( | 9346 const MockRead kProxyChallenge( |
9318 "HTTP/1.1 407 Unauthorized\r\n" | 9347 "HTTP/1.1 407 Unauthorized\r\n" |
9319 "Proxy-Authenticate: Mock realm=proxy\r\n" | 9348 "Proxy-Authenticate: Mock realm=proxy\r\n" |
9320 "Proxy-Connection: close\r\n" | 9349 "Proxy-Connection: close\r\n" |
9321 "Content-Type: text/html; charset=iso-8859-1\r\n" | 9350 "Content-Type: text/html; charset=iso-8859-1\r\n" |
9322 "Content-Length: 14\r\n\r\n" | 9351 "Content-Length: 14\r\n\r\n" |
9323 "Unauthorized\r\n"); | 9352 "Unauthorized\r\n"); |
9324 const MockRead kProxyConnected( | 9353 const MockRead kProxyConnected("HTTP/1.1 200 Connection Established\r\n\r\n"); |
9325 "HTTP/1.1 200 Connection Established\r\n\r\n"); | |
9326 | 9354 |
9327 // NOTE(cbentzel): I wanted TestReadWriteRound to be a simple struct with | 9355 // NOTE(cbentzel): I wanted TestReadWriteRound to be a simple struct with |
9328 // no constructors, but the C++ compiler on Windows warns about | 9356 // no constructors, but the C++ compiler on Windows warns about |
9329 // unspecified data in compound literals. So, moved to using constructors, | 9357 // unspecified data in compound literals. So, moved to using constructors, |
9330 // and TestRound's created with the default constructor should not be used. | 9358 // and TestRound's created with the default constructor should not be used. |
9331 struct TestRound { | 9359 struct TestRound { |
9332 TestRound() | 9360 TestRound() |
9333 : expected_rv(ERR_UNEXPECTED), | 9361 : expected_rv(ERR_UNEXPECTED), extra_write(NULL), extra_read(NULL) {} |
9334 extra_write(NULL), | 9362 TestRound(const MockWrite& write_arg, |
9335 extra_read(NULL) { | 9363 const MockRead& read_arg, |
9336 } | |
9337 TestRound(const MockWrite& write_arg, const MockRead& read_arg, | |
9338 int expected_rv_arg) | 9364 int expected_rv_arg) |
9339 : write(write_arg), | 9365 : write(write_arg), |
9340 read(read_arg), | 9366 read(read_arg), |
9341 expected_rv(expected_rv_arg), | 9367 expected_rv(expected_rv_arg), |
9342 extra_write(NULL), | 9368 extra_write(NULL), |
9343 extra_read(NULL) { | 9369 extra_read(NULL) {} |
9344 } | 9370 TestRound(const MockWrite& write_arg, |
9345 TestRound(const MockWrite& write_arg, const MockRead& read_arg, | 9371 const MockRead& read_arg, |
9346 int expected_rv_arg, const MockWrite* extra_write_arg, | 9372 int expected_rv_arg, |
| 9373 const MockWrite* extra_write_arg, |
9347 const MockRead* extra_read_arg) | 9374 const MockRead* extra_read_arg) |
9348 : write(write_arg), | 9375 : write(write_arg), |
9349 read(read_arg), | 9376 read(read_arg), |
9350 expected_rv(expected_rv_arg), | 9377 expected_rv(expected_rv_arg), |
9351 extra_write(extra_write_arg), | 9378 extra_write(extra_write_arg), |
9352 extra_read(extra_read_arg) { | 9379 extra_read(extra_read_arg) {} |
9353 } | |
9354 MockWrite write; | 9380 MockWrite write; |
9355 MockRead read; | 9381 MockRead read; |
9356 int expected_rv; | 9382 int expected_rv; |
9357 const MockWrite* extra_write; | 9383 const MockWrite* extra_write; |
9358 const MockRead* extra_read; | 9384 const MockRead* extra_read; |
9359 }; | 9385 }; |
9360 | 9386 |
9361 static const int kNoSSL = 500; | 9387 static const int kNoSSL = 500; |
9362 | 9388 |
9363 struct TestConfig { | 9389 struct TestConfig { |
9364 const char* proxy_url; | 9390 const char* proxy_url; |
9365 AuthTiming proxy_auth_timing; | 9391 AuthTiming proxy_auth_timing; |
9366 int proxy_auth_rv; | 9392 int proxy_auth_rv; |
9367 const char* server_url; | 9393 const char* server_url; |
9368 AuthTiming server_auth_timing; | 9394 AuthTiming server_auth_timing; |
9369 int server_auth_rv; | 9395 int server_auth_rv; |
9370 int num_auth_rounds; | 9396 int num_auth_rounds; |
9371 int first_ssl_round; | 9397 int first_ssl_round; |
9372 TestRound rounds[3]; | 9398 TestRound rounds[3]; |
9373 } test_configs[] = { | 9399 } test_configs[] = { |
9374 // Non-authenticating HTTP server with a direct connection. | 9400 // Non-authenticating HTTP server with a direct connection. |
9375 { NULL, AUTH_NONE, OK, kServer, AUTH_NONE, OK, 1, kNoSSL, | 9401 {NULL, |
9376 { TestRound(kGet, kSuccess, OK)}}, | 9402 AUTH_NONE, |
9377 // Authenticating HTTP server with a direct connection. | 9403 OK, |
9378 { NULL, AUTH_NONE, OK, kServer, AUTH_SYNC, OK, 2, kNoSSL, | 9404 kServer, |
9379 { TestRound(kGet, kServerChallenge, OK), | 9405 AUTH_NONE, |
9380 TestRound(kGetAuth, kSuccess, OK)}}, | 9406 OK, |
9381 { NULL, AUTH_NONE, OK, kServer, AUTH_SYNC, kAuthErr, 2, kNoSSL, | 9407 1, |
9382 { TestRound(kGet, kServerChallenge, OK), | 9408 kNoSSL, |
9383 TestRound(kGetAuth, kFailure, kAuthErr)}}, | 9409 {TestRound(kGet, kSuccess, OK)}}, |
9384 { NULL, AUTH_NONE, OK, kServer, AUTH_ASYNC, OK, 2, kNoSSL, | 9410 // Authenticating HTTP server with a direct connection. |
9385 { TestRound(kGet, kServerChallenge, OK), | 9411 {NULL, |
9386 TestRound(kGetAuth, kSuccess, OK)}}, | 9412 AUTH_NONE, |
9387 { NULL, AUTH_NONE, OK, kServer, AUTH_ASYNC, kAuthErr, 2, kNoSSL, | 9413 OK, |
9388 { TestRound(kGet, kServerChallenge, OK), | 9414 kServer, |
9389 TestRound(kGetAuth, kFailure, kAuthErr)}}, | 9415 AUTH_SYNC, |
9390 // Non-authenticating HTTP server through a non-authenticating proxy. | 9416 OK, |
9391 { kProxy, AUTH_NONE, OK, kServer, AUTH_NONE, OK, 1, kNoSSL, | 9417 2, |
9392 { TestRound(kGetProxy, kSuccess, OK)}}, | 9418 kNoSSL, |
9393 // Authenticating HTTP server through a non-authenticating proxy. | 9419 {TestRound(kGet, kServerChallenge, OK), |
9394 { kProxy, AUTH_NONE, OK, kServer, AUTH_SYNC, OK, 2, kNoSSL, | 9420 TestRound(kGetAuth, kSuccess, OK)}}, |
9395 { TestRound(kGetProxy, kServerChallenge, OK), | 9421 {NULL, |
9396 TestRound(kGetAuthThroughProxy, kSuccess, OK)}}, | 9422 AUTH_NONE, |
9397 { kProxy, AUTH_NONE, OK, kServer, AUTH_SYNC, kAuthErr, 2, kNoSSL, | 9423 OK, |
9398 { TestRound(kGetProxy, kServerChallenge, OK), | 9424 kServer, |
9399 TestRound(kGetAuthThroughProxy, kFailure, kAuthErr)}}, | 9425 AUTH_SYNC, |
9400 { kProxy, AUTH_NONE, OK, kServer, AUTH_ASYNC, OK, 2, kNoSSL, | 9426 kAuthErr, |
9401 { TestRound(kGetProxy, kServerChallenge, OK), | 9427 2, |
9402 TestRound(kGetAuthThroughProxy, kSuccess, OK)}}, | 9428 kNoSSL, |
9403 { kProxy, AUTH_NONE, OK, kServer, AUTH_ASYNC, kAuthErr, 2, kNoSSL, | 9429 {TestRound(kGet, kServerChallenge, OK), |
9404 { TestRound(kGetProxy, kServerChallenge, OK), | 9430 TestRound(kGetAuth, kFailure, kAuthErr)}}, |
9405 TestRound(kGetAuthThroughProxy, kFailure, kAuthErr)}}, | 9431 {NULL, |
9406 // Non-authenticating HTTP server through an authenticating proxy. | 9432 AUTH_NONE, |
9407 { kProxy, AUTH_SYNC, OK, kServer, AUTH_NONE, OK, 2, kNoSSL, | 9433 OK, |
9408 { TestRound(kGetProxy, kProxyChallenge, OK), | 9434 kServer, |
9409 TestRound(kGetProxyAuth, kSuccess, OK)}}, | 9435 AUTH_ASYNC, |
9410 { kProxy, AUTH_SYNC, kAuthErr, kServer, AUTH_NONE, OK, 2, kNoSSL, | 9436 OK, |
9411 { TestRound(kGetProxy, kProxyChallenge, OK), | 9437 2, |
9412 TestRound(kGetProxyAuth, kFailure, kAuthErr)}}, | 9438 kNoSSL, |
9413 { kProxy, AUTH_ASYNC, OK, kServer, AUTH_NONE, OK, 2, kNoSSL, | 9439 {TestRound(kGet, kServerChallenge, OK), |
9414 { TestRound(kGetProxy, kProxyChallenge, OK), | 9440 TestRound(kGetAuth, kSuccess, OK)}}, |
9415 TestRound(kGetProxyAuth, kSuccess, OK)}}, | 9441 {NULL, |
9416 { kProxy, AUTH_ASYNC, kAuthErr, kServer, AUTH_NONE, OK, 2, kNoSSL, | 9442 AUTH_NONE, |
9417 { TestRound(kGetProxy, kProxyChallenge, OK), | 9443 OK, |
9418 TestRound(kGetProxyAuth, kFailure, kAuthErr)}}, | 9444 kServer, |
9419 // Authenticating HTTP server through an authenticating proxy. | 9445 AUTH_ASYNC, |
9420 { kProxy, AUTH_SYNC, OK, kServer, AUTH_SYNC, OK, 3, kNoSSL, | 9446 kAuthErr, |
9421 { TestRound(kGetProxy, kProxyChallenge, OK), | 9447 2, |
9422 TestRound(kGetProxyAuth, kServerChallenge, OK), | 9448 kNoSSL, |
9423 TestRound(kGetAuthWithProxyAuth, kSuccess, OK)}}, | 9449 {TestRound(kGet, kServerChallenge, OK), |
9424 { kProxy, AUTH_SYNC, OK, kServer, AUTH_SYNC, kAuthErr, 3, kNoSSL, | 9450 TestRound(kGetAuth, kFailure, kAuthErr)}}, |
9425 { TestRound(kGetProxy, kProxyChallenge, OK), | 9451 // Non-authenticating HTTP server through a non-authenticating proxy. |
9426 TestRound(kGetProxyAuth, kServerChallenge, OK), | 9452 {kProxy, |
9427 TestRound(kGetAuthWithProxyAuth, kFailure, kAuthErr)}}, | 9453 AUTH_NONE, |
9428 { kProxy, AUTH_ASYNC, OK, kServer, AUTH_SYNC, OK, 3, kNoSSL, | 9454 OK, |
9429 { TestRound(kGetProxy, kProxyChallenge, OK), | 9455 kServer, |
9430 TestRound(kGetProxyAuth, kServerChallenge, OK), | 9456 AUTH_NONE, |
9431 TestRound(kGetAuthWithProxyAuth, kSuccess, OK)}}, | 9457 OK, |
9432 { kProxy, AUTH_ASYNC, OK, kServer, AUTH_SYNC, kAuthErr, 3, kNoSSL, | 9458 1, |
9433 { TestRound(kGetProxy, kProxyChallenge, OK), | 9459 kNoSSL, |
9434 TestRound(kGetProxyAuth, kServerChallenge, OK), | 9460 {TestRound(kGetProxy, kSuccess, OK)}}, |
9435 TestRound(kGetAuthWithProxyAuth, kFailure, kAuthErr)}}, | 9461 // Authenticating HTTP server through a non-authenticating proxy. |
9436 { kProxy, AUTH_SYNC, OK, kServer, AUTH_ASYNC, OK, 3, kNoSSL, | 9462 {kProxy, |
9437 { TestRound(kGetProxy, kProxyChallenge, OK), | 9463 AUTH_NONE, |
9438 TestRound(kGetProxyAuth, kServerChallenge, OK), | 9464 OK, |
9439 TestRound(kGetAuthWithProxyAuth, kSuccess, OK)}}, | 9465 kServer, |
9440 { kProxy, AUTH_SYNC, OK, kServer, AUTH_ASYNC, kAuthErr, 3, kNoSSL, | 9466 AUTH_SYNC, |
9441 { TestRound(kGetProxy, kProxyChallenge, OK), | 9467 OK, |
9442 TestRound(kGetProxyAuth, kServerChallenge, OK), | 9468 2, |
9443 TestRound(kGetAuthWithProxyAuth, kFailure, kAuthErr)}}, | 9469 kNoSSL, |
9444 { kProxy, AUTH_ASYNC, OK, kServer, AUTH_ASYNC, OK, 3, kNoSSL, | 9470 {TestRound(kGetProxy, kServerChallenge, OK), |
9445 { TestRound(kGetProxy, kProxyChallenge, OK), | 9471 TestRound(kGetAuthThroughProxy, kSuccess, OK)}}, |
9446 TestRound(kGetProxyAuth, kServerChallenge, OK), | 9472 {kProxy, |
9447 TestRound(kGetAuthWithProxyAuth, kSuccess, OK)}}, | 9473 AUTH_NONE, |
9448 { kProxy, AUTH_ASYNC, OK, kServer, AUTH_ASYNC, kAuthErr, 3, kNoSSL, | 9474 OK, |
9449 { TestRound(kGetProxy, kProxyChallenge, OK), | 9475 kServer, |
9450 TestRound(kGetProxyAuth, kServerChallenge, OK), | 9476 AUTH_SYNC, |
9451 TestRound(kGetAuthWithProxyAuth, kFailure, kAuthErr)}}, | 9477 kAuthErr, |
9452 // Non-authenticating HTTPS server with a direct connection. | 9478 2, |
9453 { NULL, AUTH_NONE, OK, kSecureServer, AUTH_NONE, OK, 1, 0, | 9479 kNoSSL, |
9454 { TestRound(kGet, kSuccess, OK)}}, | 9480 {TestRound(kGetProxy, kServerChallenge, OK), |
9455 // Authenticating HTTPS server with a direct connection. | 9481 TestRound(kGetAuthThroughProxy, kFailure, kAuthErr)}}, |
9456 { NULL, AUTH_NONE, OK, kSecureServer, AUTH_SYNC, OK, 2, 0, | 9482 {kProxy, |
9457 { TestRound(kGet, kServerChallenge, OK), | 9483 AUTH_NONE, |
9458 TestRound(kGetAuth, kSuccess, OK)}}, | 9484 OK, |
9459 { NULL, AUTH_NONE, OK, kSecureServer, AUTH_SYNC, kAuthErr, 2, 0, | 9485 kServer, |
9460 { TestRound(kGet, kServerChallenge, OK), | 9486 AUTH_ASYNC, |
9461 TestRound(kGetAuth, kFailure, kAuthErr)}}, | 9487 OK, |
9462 { NULL, AUTH_NONE, OK, kSecureServer, AUTH_ASYNC, OK, 2, 0, | 9488 2, |
9463 { TestRound(kGet, kServerChallenge, OK), | 9489 kNoSSL, |
9464 TestRound(kGetAuth, kSuccess, OK)}}, | 9490 {TestRound(kGetProxy, kServerChallenge, OK), |
9465 { NULL, AUTH_NONE, OK, kSecureServer, AUTH_ASYNC, kAuthErr, 2, 0, | 9491 TestRound(kGetAuthThroughProxy, kSuccess, OK)}}, |
9466 { TestRound(kGet, kServerChallenge, OK), | 9492 {kProxy, |
9467 TestRound(kGetAuth, kFailure, kAuthErr)}}, | 9493 AUTH_NONE, |
9468 // Non-authenticating HTTPS server with a non-authenticating proxy. | 9494 OK, |
9469 { kProxy, AUTH_NONE, OK, kSecureServer, AUTH_NONE, OK, 1, 0, | 9495 kServer, |
9470 { TestRound(kConnect, kProxyConnected, OK, &kGet, &kSuccess)}}, | 9496 AUTH_ASYNC, |
9471 // Authenticating HTTPS server through a non-authenticating proxy. | 9497 kAuthErr, |
9472 { kProxy, AUTH_NONE, OK, kSecureServer, AUTH_SYNC, OK, 2, 0, | 9498 2, |
9473 { TestRound(kConnect, kProxyConnected, OK, &kGet, &kServerChallenge), | 9499 kNoSSL, |
9474 TestRound(kGetAuth, kSuccess, OK)}}, | 9500 {TestRound(kGetProxy, kServerChallenge, OK), |
9475 { kProxy, AUTH_NONE, OK, kSecureServer, AUTH_SYNC, kAuthErr, 2, 0, | 9501 TestRound(kGetAuthThroughProxy, kFailure, kAuthErr)}}, |
9476 { TestRound(kConnect, kProxyConnected, OK, &kGet, &kServerChallenge), | 9502 // Non-authenticating HTTP server through an authenticating proxy. |
9477 TestRound(kGetAuth, kFailure, kAuthErr)}}, | 9503 {kProxy, |
9478 { kProxy, AUTH_NONE, OK, kSecureServer, AUTH_ASYNC, OK, 2, 0, | 9504 AUTH_SYNC, |
9479 { TestRound(kConnect, kProxyConnected, OK, &kGet, &kServerChallenge), | 9505 OK, |
9480 TestRound(kGetAuth, kSuccess, OK)}}, | 9506 kServer, |
9481 { kProxy, AUTH_NONE, OK, kSecureServer, AUTH_ASYNC, kAuthErr, 2, 0, | 9507 AUTH_NONE, |
9482 { TestRound(kConnect, kProxyConnected, OK, &kGet, &kServerChallenge), | 9508 OK, |
9483 TestRound(kGetAuth, kFailure, kAuthErr)}}, | 9509 2, |
9484 // Non-Authenticating HTTPS server through an authenticating proxy. | 9510 kNoSSL, |
9485 { kProxy, AUTH_SYNC, OK, kSecureServer, AUTH_NONE, OK, 2, 1, | 9511 {TestRound(kGetProxy, kProxyChallenge, OK), |
9486 { TestRound(kConnect, kProxyChallenge, OK), | 9512 TestRound(kGetProxyAuth, kSuccess, OK)}}, |
9487 TestRound(kConnectProxyAuth, kProxyConnected, OK, &kGet, &kSuccess)}}, | 9513 {kProxy, |
9488 { kProxy, AUTH_SYNC, kAuthErr, kSecureServer, AUTH_NONE, OK, 2, kNoSSL, | 9514 AUTH_SYNC, |
9489 { TestRound(kConnect, kProxyChallenge, OK), | 9515 kAuthErr, |
9490 TestRound(kConnectProxyAuth, kFailure, kAuthErr)}}, | 9516 kServer, |
9491 { kProxy, AUTH_ASYNC, OK, kSecureServer, AUTH_NONE, OK, 2, 1, | 9517 AUTH_NONE, |
9492 { TestRound(kConnect, kProxyChallenge, OK), | 9518 OK, |
9493 TestRound(kConnectProxyAuth, kProxyConnected, OK, &kGet, &kSuccess)}}, | 9519 2, |
9494 { kProxy, AUTH_ASYNC, kAuthErr, kSecureServer, AUTH_NONE, OK, 2, kNoSSL, | 9520 kNoSSL, |
9495 { TestRound(kConnect, kProxyChallenge, OK), | 9521 {TestRound(kGetProxy, kProxyChallenge, OK), |
9496 TestRound(kConnectProxyAuth, kFailure, kAuthErr)}}, | 9522 TestRound(kGetProxyAuth, kFailure, kAuthErr)}}, |
9497 // Authenticating HTTPS server through an authenticating proxy. | 9523 {kProxy, |
9498 { kProxy, AUTH_SYNC, OK, kSecureServer, AUTH_SYNC, OK, 3, 1, | 9524 AUTH_ASYNC, |
9499 { TestRound(kConnect, kProxyChallenge, OK), | 9525 OK, |
9500 TestRound(kConnectProxyAuth, kProxyConnected, OK, | 9526 kServer, |
9501 &kGet, &kServerChallenge), | 9527 AUTH_NONE, |
9502 TestRound(kGetAuth, kSuccess, OK)}}, | 9528 OK, |
9503 { kProxy, AUTH_SYNC, OK, kSecureServer, AUTH_SYNC, kAuthErr, 3, 1, | 9529 2, |
9504 { TestRound(kConnect, kProxyChallenge, OK), | 9530 kNoSSL, |
9505 TestRound(kConnectProxyAuth, kProxyConnected, OK, | 9531 {TestRound(kGetProxy, kProxyChallenge, OK), |
9506 &kGet, &kServerChallenge), | 9532 TestRound(kGetProxyAuth, kSuccess, OK)}}, |
9507 TestRound(kGetAuth, kFailure, kAuthErr)}}, | 9533 {kProxy, |
9508 { kProxy, AUTH_ASYNC, OK, kSecureServer, AUTH_SYNC, OK, 3, 1, | 9534 AUTH_ASYNC, |
9509 { TestRound(kConnect, kProxyChallenge, OK), | 9535 kAuthErr, |
9510 TestRound(kConnectProxyAuth, kProxyConnected, OK, | 9536 kServer, |
9511 &kGet, &kServerChallenge), | 9537 AUTH_NONE, |
9512 TestRound(kGetAuth, kSuccess, OK)}}, | 9538 OK, |
9513 { kProxy, AUTH_ASYNC, OK, kSecureServer, AUTH_SYNC, kAuthErr, 3, 1, | 9539 2, |
9514 { TestRound(kConnect, kProxyChallenge, OK), | 9540 kNoSSL, |
9515 TestRound(kConnectProxyAuth, kProxyConnected, OK, | 9541 {TestRound(kGetProxy, kProxyChallenge, OK), |
9516 &kGet, &kServerChallenge), | 9542 TestRound(kGetProxyAuth, kFailure, kAuthErr)}}, |
9517 TestRound(kGetAuth, kFailure, kAuthErr)}}, | 9543 // Authenticating HTTP server through an authenticating proxy. |
9518 { kProxy, AUTH_SYNC, OK, kSecureServer, AUTH_ASYNC, OK, 3, 1, | 9544 {kProxy, |
9519 { TestRound(kConnect, kProxyChallenge, OK), | 9545 AUTH_SYNC, |
9520 TestRound(kConnectProxyAuth, kProxyConnected, OK, | 9546 OK, |
9521 &kGet, &kServerChallenge), | 9547 kServer, |
9522 TestRound(kGetAuth, kSuccess, OK)}}, | 9548 AUTH_SYNC, |
9523 { kProxy, AUTH_SYNC, OK, kSecureServer, AUTH_ASYNC, kAuthErr, 3, 1, | 9549 OK, |
9524 { TestRound(kConnect, kProxyChallenge, OK), | 9550 3, |
9525 TestRound(kConnectProxyAuth, kProxyConnected, OK, | 9551 kNoSSL, |
9526 &kGet, &kServerChallenge), | 9552 {TestRound(kGetProxy, kProxyChallenge, OK), |
9527 TestRound(kGetAuth, kFailure, kAuthErr)}}, | 9553 TestRound(kGetProxyAuth, kServerChallenge, OK), |
9528 { kProxy, AUTH_ASYNC, OK, kSecureServer, AUTH_ASYNC, OK, 3, 1, | 9554 TestRound(kGetAuthWithProxyAuth, kSuccess, OK)}}, |
9529 { TestRound(kConnect, kProxyChallenge, OK), | 9555 {kProxy, |
9530 TestRound(kConnectProxyAuth, kProxyConnected, OK, | 9556 AUTH_SYNC, |
9531 &kGet, &kServerChallenge), | 9557 OK, |
9532 TestRound(kGetAuth, kSuccess, OK)}}, | 9558 kServer, |
9533 { kProxy, AUTH_ASYNC, OK, kSecureServer, AUTH_ASYNC, kAuthErr, 3, 1, | 9559 AUTH_SYNC, |
9534 { TestRound(kConnect, kProxyChallenge, OK), | 9560 kAuthErr, |
9535 TestRound(kConnectProxyAuth, kProxyConnected, OK, | 9561 3, |
9536 &kGet, &kServerChallenge), | 9562 kNoSSL, |
9537 TestRound(kGetAuth, kFailure, kAuthErr)}}, | 9563 {TestRound(kGetProxy, kProxyChallenge, OK), |
9538 }; | 9564 TestRound(kGetProxyAuth, kServerChallenge, OK), |
| 9565 TestRound(kGetAuthWithProxyAuth, kFailure, kAuthErr)}}, |
| 9566 {kProxy, |
| 9567 AUTH_ASYNC, |
| 9568 OK, |
| 9569 kServer, |
| 9570 AUTH_SYNC, |
| 9571 OK, |
| 9572 3, |
| 9573 kNoSSL, |
| 9574 {TestRound(kGetProxy, kProxyChallenge, OK), |
| 9575 TestRound(kGetProxyAuth, kServerChallenge, OK), |
| 9576 TestRound(kGetAuthWithProxyAuth, kSuccess, OK)}}, |
| 9577 {kProxy, |
| 9578 AUTH_ASYNC, |
| 9579 OK, |
| 9580 kServer, |
| 9581 AUTH_SYNC, |
| 9582 kAuthErr, |
| 9583 3, |
| 9584 kNoSSL, |
| 9585 {TestRound(kGetProxy, kProxyChallenge, OK), |
| 9586 TestRound(kGetProxyAuth, kServerChallenge, OK), |
| 9587 TestRound(kGetAuthWithProxyAuth, kFailure, kAuthErr)}}, |
| 9588 {kProxy, |
| 9589 AUTH_SYNC, |
| 9590 OK, |
| 9591 kServer, |
| 9592 AUTH_ASYNC, |
| 9593 OK, |
| 9594 3, |
| 9595 kNoSSL, |
| 9596 {TestRound(kGetProxy, kProxyChallenge, OK), |
| 9597 TestRound(kGetProxyAuth, kServerChallenge, OK), |
| 9598 TestRound(kGetAuthWithProxyAuth, kSuccess, OK)}}, |
| 9599 {kProxy, |
| 9600 AUTH_SYNC, |
| 9601 OK, |
| 9602 kServer, |
| 9603 AUTH_ASYNC, |
| 9604 kAuthErr, |
| 9605 3, |
| 9606 kNoSSL, |
| 9607 {TestRound(kGetProxy, kProxyChallenge, OK), |
| 9608 TestRound(kGetProxyAuth, kServerChallenge, OK), |
| 9609 TestRound(kGetAuthWithProxyAuth, kFailure, kAuthErr)}}, |
| 9610 {kProxy, |
| 9611 AUTH_ASYNC, |
| 9612 OK, |
| 9613 kServer, |
| 9614 AUTH_ASYNC, |
| 9615 OK, |
| 9616 3, |
| 9617 kNoSSL, |
| 9618 {TestRound(kGetProxy, kProxyChallenge, OK), |
| 9619 TestRound(kGetProxyAuth, kServerChallenge, OK), |
| 9620 TestRound(kGetAuthWithProxyAuth, kSuccess, OK)}}, |
| 9621 {kProxy, |
| 9622 AUTH_ASYNC, |
| 9623 OK, |
| 9624 kServer, |
| 9625 AUTH_ASYNC, |
| 9626 kAuthErr, |
| 9627 3, |
| 9628 kNoSSL, |
| 9629 {TestRound(kGetProxy, kProxyChallenge, OK), |
| 9630 TestRound(kGetProxyAuth, kServerChallenge, OK), |
| 9631 TestRound(kGetAuthWithProxyAuth, kFailure, kAuthErr)}}, |
| 9632 // Non-authenticating HTTPS server with a direct connection. |
| 9633 {NULL, |
| 9634 AUTH_NONE, |
| 9635 OK, |
| 9636 kSecureServer, |
| 9637 AUTH_NONE, |
| 9638 OK, |
| 9639 1, |
| 9640 0, |
| 9641 {TestRound(kGet, kSuccess, OK)}}, |
| 9642 // Authenticating HTTPS server with a direct connection. |
| 9643 {NULL, |
| 9644 AUTH_NONE, |
| 9645 OK, |
| 9646 kSecureServer, |
| 9647 AUTH_SYNC, |
| 9648 OK, |
| 9649 2, |
| 9650 0, |
| 9651 {TestRound(kGet, kServerChallenge, OK), |
| 9652 TestRound(kGetAuth, kSuccess, OK)}}, |
| 9653 {NULL, |
| 9654 AUTH_NONE, |
| 9655 OK, |
| 9656 kSecureServer, |
| 9657 AUTH_SYNC, |
| 9658 kAuthErr, |
| 9659 2, |
| 9660 0, |
| 9661 {TestRound(kGet, kServerChallenge, OK), |
| 9662 TestRound(kGetAuth, kFailure, kAuthErr)}}, |
| 9663 {NULL, |
| 9664 AUTH_NONE, |
| 9665 OK, |
| 9666 kSecureServer, |
| 9667 AUTH_ASYNC, |
| 9668 OK, |
| 9669 2, |
| 9670 0, |
| 9671 {TestRound(kGet, kServerChallenge, OK), |
| 9672 TestRound(kGetAuth, kSuccess, OK)}}, |
| 9673 {NULL, |
| 9674 AUTH_NONE, |
| 9675 OK, |
| 9676 kSecureServer, |
| 9677 AUTH_ASYNC, |
| 9678 kAuthErr, |
| 9679 2, |
| 9680 0, |
| 9681 {TestRound(kGet, kServerChallenge, OK), |
| 9682 TestRound(kGetAuth, kFailure, kAuthErr)}}, |
| 9683 // Non-authenticating HTTPS server with a non-authenticating proxy. |
| 9684 {kProxy, |
| 9685 AUTH_NONE, |
| 9686 OK, |
| 9687 kSecureServer, |
| 9688 AUTH_NONE, |
| 9689 OK, |
| 9690 1, |
| 9691 0, |
| 9692 {TestRound(kConnect, kProxyConnected, OK, &kGet, &kSuccess)}}, |
| 9693 // Authenticating HTTPS server through a non-authenticating proxy. |
| 9694 {kProxy, |
| 9695 AUTH_NONE, |
| 9696 OK, |
| 9697 kSecureServer, |
| 9698 AUTH_SYNC, |
| 9699 OK, |
| 9700 2, |
| 9701 0, |
| 9702 {TestRound(kConnect, kProxyConnected, OK, &kGet, &kServerChallenge), |
| 9703 TestRound(kGetAuth, kSuccess, OK)}}, |
| 9704 {kProxy, |
| 9705 AUTH_NONE, |
| 9706 OK, |
| 9707 kSecureServer, |
| 9708 AUTH_SYNC, |
| 9709 kAuthErr, |
| 9710 2, |
| 9711 0, |
| 9712 {TestRound(kConnect, kProxyConnected, OK, &kGet, &kServerChallenge), |
| 9713 TestRound(kGetAuth, kFailure, kAuthErr)}}, |
| 9714 {kProxy, |
| 9715 AUTH_NONE, |
| 9716 OK, |
| 9717 kSecureServer, |
| 9718 AUTH_ASYNC, |
| 9719 OK, |
| 9720 2, |
| 9721 0, |
| 9722 {TestRound(kConnect, kProxyConnected, OK, &kGet, &kServerChallenge), |
| 9723 TestRound(kGetAuth, kSuccess, OK)}}, |
| 9724 {kProxy, |
| 9725 AUTH_NONE, |
| 9726 OK, |
| 9727 kSecureServer, |
| 9728 AUTH_ASYNC, |
| 9729 kAuthErr, |
| 9730 2, |
| 9731 0, |
| 9732 {TestRound(kConnect, kProxyConnected, OK, &kGet, &kServerChallenge), |
| 9733 TestRound(kGetAuth, kFailure, kAuthErr)}}, |
| 9734 // Non-Authenticating HTTPS server through an authenticating proxy. |
| 9735 {kProxy, |
| 9736 AUTH_SYNC, |
| 9737 OK, |
| 9738 kSecureServer, |
| 9739 AUTH_NONE, |
| 9740 OK, |
| 9741 2, |
| 9742 1, |
| 9743 {TestRound(kConnect, kProxyChallenge, OK), |
| 9744 TestRound(kConnectProxyAuth, kProxyConnected, OK, &kGet, &kSuccess)}}, |
| 9745 {kProxy, |
| 9746 AUTH_SYNC, |
| 9747 kAuthErr, |
| 9748 kSecureServer, |
| 9749 AUTH_NONE, |
| 9750 OK, |
| 9751 2, |
| 9752 kNoSSL, |
| 9753 {TestRound(kConnect, kProxyChallenge, OK), |
| 9754 TestRound(kConnectProxyAuth, kFailure, kAuthErr)}}, |
| 9755 {kProxy, |
| 9756 AUTH_ASYNC, |
| 9757 OK, |
| 9758 kSecureServer, |
| 9759 AUTH_NONE, |
| 9760 OK, |
| 9761 2, |
| 9762 1, |
| 9763 {TestRound(kConnect, kProxyChallenge, OK), |
| 9764 TestRound(kConnectProxyAuth, kProxyConnected, OK, &kGet, &kSuccess)}}, |
| 9765 {kProxy, |
| 9766 AUTH_ASYNC, |
| 9767 kAuthErr, |
| 9768 kSecureServer, |
| 9769 AUTH_NONE, |
| 9770 OK, |
| 9771 2, |
| 9772 kNoSSL, |
| 9773 {TestRound(kConnect, kProxyChallenge, OK), |
| 9774 TestRound(kConnectProxyAuth, kFailure, kAuthErr)}}, |
| 9775 // Authenticating HTTPS server through an authenticating proxy. |
| 9776 {kProxy, |
| 9777 AUTH_SYNC, |
| 9778 OK, |
| 9779 kSecureServer, |
| 9780 AUTH_SYNC, |
| 9781 OK, |
| 9782 3, |
| 9783 1, |
| 9784 {TestRound(kConnect, kProxyChallenge, OK), |
| 9785 TestRound( |
| 9786 kConnectProxyAuth, kProxyConnected, OK, &kGet, &kServerChallenge), |
| 9787 TestRound(kGetAuth, kSuccess, OK)}}, |
| 9788 {kProxy, |
| 9789 AUTH_SYNC, |
| 9790 OK, |
| 9791 kSecureServer, |
| 9792 AUTH_SYNC, |
| 9793 kAuthErr, |
| 9794 3, |
| 9795 1, |
| 9796 {TestRound(kConnect, kProxyChallenge, OK), |
| 9797 TestRound( |
| 9798 kConnectProxyAuth, kProxyConnected, OK, &kGet, &kServerChallenge), |
| 9799 TestRound(kGetAuth, kFailure, kAuthErr)}}, |
| 9800 {kProxy, |
| 9801 AUTH_ASYNC, |
| 9802 OK, |
| 9803 kSecureServer, |
| 9804 AUTH_SYNC, |
| 9805 OK, |
| 9806 3, |
| 9807 1, |
| 9808 {TestRound(kConnect, kProxyChallenge, OK), |
| 9809 TestRound( |
| 9810 kConnectProxyAuth, kProxyConnected, OK, &kGet, &kServerChallenge), |
| 9811 TestRound(kGetAuth, kSuccess, OK)}}, |
| 9812 {kProxy, |
| 9813 AUTH_ASYNC, |
| 9814 OK, |
| 9815 kSecureServer, |
| 9816 AUTH_SYNC, |
| 9817 kAuthErr, |
| 9818 3, |
| 9819 1, |
| 9820 {TestRound(kConnect, kProxyChallenge, OK), |
| 9821 TestRound( |
| 9822 kConnectProxyAuth, kProxyConnected, OK, &kGet, &kServerChallenge), |
| 9823 TestRound(kGetAuth, kFailure, kAuthErr)}}, |
| 9824 {kProxy, |
| 9825 AUTH_SYNC, |
| 9826 OK, |
| 9827 kSecureServer, |
| 9828 AUTH_ASYNC, |
| 9829 OK, |
| 9830 3, |
| 9831 1, |
| 9832 {TestRound(kConnect, kProxyChallenge, OK), |
| 9833 TestRound( |
| 9834 kConnectProxyAuth, kProxyConnected, OK, &kGet, &kServerChallenge), |
| 9835 TestRound(kGetAuth, kSuccess, OK)}}, |
| 9836 {kProxy, |
| 9837 AUTH_SYNC, |
| 9838 OK, |
| 9839 kSecureServer, |
| 9840 AUTH_ASYNC, |
| 9841 kAuthErr, |
| 9842 3, |
| 9843 1, |
| 9844 {TestRound(kConnect, kProxyChallenge, OK), |
| 9845 TestRound( |
| 9846 kConnectProxyAuth, kProxyConnected, OK, &kGet, &kServerChallenge), |
| 9847 TestRound(kGetAuth, kFailure, kAuthErr)}}, |
| 9848 {kProxy, |
| 9849 AUTH_ASYNC, |
| 9850 OK, |
| 9851 kSecureServer, |
| 9852 AUTH_ASYNC, |
| 9853 OK, |
| 9854 3, |
| 9855 1, |
| 9856 {TestRound(kConnect, kProxyChallenge, OK), |
| 9857 TestRound( |
| 9858 kConnectProxyAuth, kProxyConnected, OK, &kGet, &kServerChallenge), |
| 9859 TestRound(kGetAuth, kSuccess, OK)}}, |
| 9860 {kProxy, |
| 9861 AUTH_ASYNC, |
| 9862 OK, |
| 9863 kSecureServer, |
| 9864 AUTH_ASYNC, |
| 9865 kAuthErr, |
| 9866 3, |
| 9867 1, |
| 9868 {TestRound(kConnect, kProxyChallenge, OK), |
| 9869 TestRound( |
| 9870 kConnectProxyAuth, kProxyConnected, OK, &kGet, &kServerChallenge), |
| 9871 TestRound(kGetAuth, kFailure, kAuthErr)}}, |
| 9872 }; |
9539 | 9873 |
9540 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_configs); ++i) { | 9874 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_configs); ++i) { |
9541 HttpAuthHandlerMock::Factory* auth_factory( | 9875 HttpAuthHandlerMock::Factory* auth_factory( |
9542 new HttpAuthHandlerMock::Factory()); | 9876 new HttpAuthHandlerMock::Factory()); |
9543 session_deps_.http_auth_handler_factory.reset(auth_factory); | 9877 session_deps_.http_auth_handler_factory.reset(auth_factory); |
9544 const TestConfig& test_config = test_configs[i]; | 9878 const TestConfig& test_config = test_configs[i]; |
9545 | 9879 |
9546 // Set up authentication handlers as necessary. | 9880 // Set up authentication handlers as necessary. |
9547 if (test_config.proxy_auth_timing != AUTH_NONE) { | 9881 if (test_config.proxy_auth_timing != AUTH_NONE) { |
9548 for (int n = 0; n < 2; n++) { | 9882 for (int n = 0; n < 2; n++) { |
9549 HttpAuthHandlerMock* auth_handler(new HttpAuthHandlerMock()); | 9883 HttpAuthHandlerMock* auth_handler(new HttpAuthHandlerMock()); |
9550 std::string auth_challenge = "Mock realm=proxy"; | 9884 std::string auth_challenge = "Mock realm=proxy"; |
9551 GURL origin(test_config.proxy_url); | 9885 GURL origin(test_config.proxy_url); |
9552 HttpAuthChallengeTokenizer tokenizer(auth_challenge.begin(), | 9886 HttpAuthChallengeTokenizer tokenizer(auth_challenge.begin(), |
9553 auth_challenge.end()); | 9887 auth_challenge.end()); |
9554 auth_handler->InitFromChallenge(&tokenizer, HttpAuth::AUTH_PROXY, | 9888 auth_handler->InitFromChallenge( |
9555 origin, BoundNetLog()); | 9889 &tokenizer, HttpAuth::AUTH_PROXY, origin, BoundNetLog()); |
9556 auth_handler->SetGenerateExpectation( | 9890 auth_handler->SetGenerateExpectation( |
9557 test_config.proxy_auth_timing == AUTH_ASYNC, | 9891 test_config.proxy_auth_timing == AUTH_ASYNC, |
9558 test_config.proxy_auth_rv); | 9892 test_config.proxy_auth_rv); |
9559 auth_factory->AddMockHandler(auth_handler, HttpAuth::AUTH_PROXY); | 9893 auth_factory->AddMockHandler(auth_handler, HttpAuth::AUTH_PROXY); |
9560 } | 9894 } |
9561 } | 9895 } |
9562 if (test_config.server_auth_timing != AUTH_NONE) { | 9896 if (test_config.server_auth_timing != AUTH_NONE) { |
9563 HttpAuthHandlerMock* auth_handler(new HttpAuthHandlerMock()); | 9897 HttpAuthHandlerMock* auth_handler(new HttpAuthHandlerMock()); |
9564 std::string auth_challenge = "Mock realm=server"; | 9898 std::string auth_challenge = "Mock realm=server"; |
9565 GURL origin(test_config.server_url); | 9899 GURL origin(test_config.server_url); |
9566 HttpAuthChallengeTokenizer tokenizer(auth_challenge.begin(), | 9900 HttpAuthChallengeTokenizer tokenizer(auth_challenge.begin(), |
9567 auth_challenge.end()); | 9901 auth_challenge.end()); |
9568 auth_handler->InitFromChallenge(&tokenizer, HttpAuth::AUTH_SERVER, | 9902 auth_handler->InitFromChallenge( |
9569 origin, BoundNetLog()); | 9903 &tokenizer, HttpAuth::AUTH_SERVER, origin, BoundNetLog()); |
9570 auth_handler->SetGenerateExpectation( | 9904 auth_handler->SetGenerateExpectation( |
9571 test_config.server_auth_timing == AUTH_ASYNC, | 9905 test_config.server_auth_timing == AUTH_ASYNC, |
9572 test_config.server_auth_rv); | 9906 test_config.server_auth_rv); |
9573 auth_factory->AddMockHandler(auth_handler, HttpAuth::AUTH_SERVER); | 9907 auth_factory->AddMockHandler(auth_handler, HttpAuth::AUTH_SERVER); |
9574 } | 9908 } |
9575 if (test_config.proxy_url) { | 9909 if (test_config.proxy_url) { |
9576 session_deps_.proxy_service.reset( | 9910 session_deps_.proxy_service.reset( |
9577 ProxyService::CreateFixed(test_config.proxy_url)); | 9911 ProxyService::CreateFixed(test_config.proxy_url)); |
9578 } else { | 9912 } else { |
9579 session_deps_.proxy_service.reset(ProxyService::CreateDirect()); | 9913 session_deps_.proxy_service.reset(ProxyService::CreateDirect()); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9615 if (round >= test_config.first_ssl_round) | 9949 if (round >= test_config.first_ssl_round) |
9616 session_deps_.socket_factory->AddSSLSocketDataProvider( | 9950 session_deps_.socket_factory->AddSSLSocketDataProvider( |
9617 &ssl_socket_data_provider); | 9951 &ssl_socket_data_provider); |
9618 | 9952 |
9619 // Start or restart the transaction. | 9953 // Start or restart the transaction. |
9620 TestCompletionCallback callback; | 9954 TestCompletionCallback callback; |
9621 int rv; | 9955 int rv; |
9622 if (round == 0) { | 9956 if (round == 0) { |
9623 rv = trans.Start(&request, callback.callback(), BoundNetLog()); | 9957 rv = trans.Start(&request, callback.callback(), BoundNetLog()); |
9624 } else { | 9958 } else { |
9625 rv = trans.RestartWithAuth( | 9959 rv = trans.RestartWithAuth(AuthCredentials(kFoo, kBar), |
9626 AuthCredentials(kFoo, kBar), callback.callback()); | 9960 callback.callback()); |
9627 } | 9961 } |
9628 if (rv == ERR_IO_PENDING) | 9962 if (rv == ERR_IO_PENDING) |
9629 rv = callback.WaitForResult(); | 9963 rv = callback.WaitForResult(); |
9630 | 9964 |
9631 // Compare results with expected data. | 9965 // Compare results with expected data. |
9632 EXPECT_EQ(read_write_round.expected_rv, rv); | 9966 EXPECT_EQ(read_write_round.expected_rv, rv); |
9633 const HttpResponseInfo* response = trans.GetResponseInfo(); | 9967 const HttpResponseInfo* response = trans.GetResponseInfo(); |
9634 if (read_write_round.expected_rv == OK) { | 9968 if (read_write_round.expected_rv == OK) { |
9635 ASSERT_TRUE(response != NULL); | 9969 ASSERT_TRUE(response != NULL); |
9636 } else { | 9970 } else { |
(...skipping 18 matching lines...) Expand all Loading... |
9655 session_deps_.proxy_service.reset(ProxyService::CreateDirect()); | 9989 session_deps_.proxy_service.reset(ProxyService::CreateDirect()); |
9656 session_deps_.host_resolver->rules()->AddRule("www.example.com", "10.0.0.1"); | 9990 session_deps_.host_resolver->rules()->AddRule("www.example.com", "10.0.0.1"); |
9657 session_deps_.host_resolver->set_synchronous_mode(true); | 9991 session_deps_.host_resolver->set_synchronous_mode(true); |
9658 | 9992 |
9659 HttpAuthHandlerMock* auth_handler(new HttpAuthHandlerMock()); | 9993 HttpAuthHandlerMock* auth_handler(new HttpAuthHandlerMock()); |
9660 auth_handler->set_connection_based(true); | 9994 auth_handler->set_connection_based(true); |
9661 std::string auth_challenge = "Mock realm=server"; | 9995 std::string auth_challenge = "Mock realm=server"; |
9662 GURL origin("http://www.example.com"); | 9996 GURL origin("http://www.example.com"); |
9663 HttpAuthChallengeTokenizer tokenizer(auth_challenge.begin(), | 9997 HttpAuthChallengeTokenizer tokenizer(auth_challenge.begin(), |
9664 auth_challenge.end()); | 9998 auth_challenge.end()); |
9665 auth_handler->InitFromChallenge(&tokenizer, HttpAuth::AUTH_SERVER, | 9999 auth_handler->InitFromChallenge( |
9666 origin, BoundNetLog()); | 10000 &tokenizer, HttpAuth::AUTH_SERVER, origin, BoundNetLog()); |
9667 auth_factory->AddMockHandler(auth_handler, HttpAuth::AUTH_SERVER); | 10001 auth_factory->AddMockHandler(auth_handler, HttpAuth::AUTH_SERVER); |
9668 | 10002 |
9669 int rv = OK; | 10003 int rv = OK; |
9670 const HttpResponseInfo* response = NULL; | 10004 const HttpResponseInfo* response = NULL; |
9671 HttpRequestInfo request; | 10005 HttpRequestInfo request; |
9672 request.method = "GET"; | 10006 request.method = "GET"; |
9673 request.url = origin; | 10007 request.url = origin; |
9674 request.load_flags = 0; | 10008 request.load_flags = 0; |
9675 | 10009 |
9676 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 10010 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
9677 | 10011 |
9678 // Use a TCP Socket Pool with only one connection per group. This is used | 10012 // Use a TCP Socket Pool with only one connection per group. This is used |
9679 // to validate that the TCP socket is not released to the pool between | 10013 // to validate that the TCP socket is not released to the pool between |
9680 // each round of multi-round authentication. | 10014 // each round of multi-round authentication. |
9681 HttpNetworkSessionPeer session_peer(session); | 10015 HttpNetworkSessionPeer session_peer(session); |
9682 ClientSocketPoolHistograms transport_pool_histograms("SmallTCP"); | 10016 ClientSocketPoolHistograms transport_pool_histograms("SmallTCP"); |
9683 TransportClientSocketPool* transport_pool = new TransportClientSocketPool( | 10017 TransportClientSocketPool* transport_pool = |
9684 50, // Max sockets for pool | 10018 new TransportClientSocketPool(50, // Max sockets for pool |
9685 1, // Max sockets per group | 10019 1, // Max sockets per group |
9686 &transport_pool_histograms, | 10020 &transport_pool_histograms, |
9687 session_deps_.host_resolver.get(), | 10021 session_deps_.host_resolver.get(), |
9688 session_deps_.socket_factory.get(), | 10022 session_deps_.socket_factory.get(), |
9689 session_deps_.net_log); | 10023 session_deps_.net_log); |
9690 scoped_ptr<MockClientSocketPoolManager> mock_pool_manager( | 10024 scoped_ptr<MockClientSocketPoolManager> mock_pool_manager( |
9691 new MockClientSocketPoolManager); | 10025 new MockClientSocketPoolManager); |
9692 mock_pool_manager->SetTransportSocketPool(transport_pool); | 10026 mock_pool_manager->SetTransportSocketPool(transport_pool); |
9693 session_peer.SetClientSocketPoolManager( | 10027 session_peer.SetClientSocketPoolManager( |
9694 mock_pool_manager.PassAs<ClientSocketPoolManager>()); | 10028 mock_pool_manager.PassAs<ClientSocketPoolManager>()); |
9695 | 10029 |
9696 scoped_ptr<HttpTransaction> trans( | 10030 scoped_ptr<HttpTransaction> trans( |
9697 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 10031 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
9698 TestCompletionCallback callback; | 10032 TestCompletionCallback callback; |
9699 | 10033 |
(...skipping 12 matching lines...) Expand all Loading... |
9712 "WWW-Authenticate: Mock realm=server\r\n" | 10046 "WWW-Authenticate: Mock realm=server\r\n" |
9713 "Content-Type: text/html; charset=iso-8859-1\r\n" | 10047 "Content-Type: text/html; charset=iso-8859-1\r\n" |
9714 "Content-Length: 14\r\n\r\n" | 10048 "Content-Length: 14\r\n\r\n" |
9715 "Unauthorized\r\n"); | 10049 "Unauthorized\r\n"); |
9716 const MockRead kSuccess( | 10050 const MockRead kSuccess( |
9717 "HTTP/1.1 200 OK\r\n" | 10051 "HTTP/1.1 200 OK\r\n" |
9718 "Content-Type: text/html; charset=iso-8859-1\r\n" | 10052 "Content-Type: text/html; charset=iso-8859-1\r\n" |
9719 "Content-Length: 3\r\n\r\n" | 10053 "Content-Length: 3\r\n\r\n" |
9720 "Yes"); | 10054 "Yes"); |
9721 | 10055 |
9722 MockWrite writes[] = { | 10056 MockWrite writes[] = {// First round |
9723 // First round | 10057 kGet, |
9724 kGet, | 10058 // Second round |
9725 // Second round | 10059 kGetAuth, |
9726 kGetAuth, | 10060 // Third round |
9727 // Third round | 10061 kGetAuth, |
9728 kGetAuth, | 10062 // Fourth round |
9729 // Fourth round | 10063 kGetAuth, |
9730 kGetAuth, | 10064 // Competing request |
9731 // Competing request | 10065 kGet, |
9732 kGet, | |
9733 }; | 10066 }; |
9734 MockRead reads[] = { | 10067 MockRead reads[] = {// First round |
9735 // First round | 10068 kServerChallenge, |
9736 kServerChallenge, | 10069 // Second round |
9737 // Second round | 10070 kServerChallenge, |
9738 kServerChallenge, | 10071 // Third round |
9739 // Third round | 10072 kServerChallenge, |
9740 kServerChallenge, | 10073 // Fourth round |
9741 // Fourth round | 10074 kSuccess, |
9742 kSuccess, | 10075 // Competing response |
9743 // Competing response | 10076 kSuccess, |
9744 kSuccess, | |
9745 }; | 10077 }; |
9746 StaticSocketDataProvider data_provider(reads, arraysize(reads), | 10078 StaticSocketDataProvider data_provider( |
9747 writes, arraysize(writes)); | 10079 reads, arraysize(reads), writes, arraysize(writes)); |
9748 session_deps_.socket_factory->AddSocketDataProvider(&data_provider); | 10080 session_deps_.socket_factory->AddSocketDataProvider(&data_provider); |
9749 | 10081 |
9750 const char* const kSocketGroup = "www.example.com:80"; | 10082 const char* const kSocketGroup = "www.example.com:80"; |
9751 | 10083 |
9752 // First round of authentication. | 10084 // First round of authentication. |
9753 auth_handler->SetGenerateExpectation(false, OK); | 10085 auth_handler->SetGenerateExpectation(false, OK); |
9754 rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 10086 rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
9755 if (rv == ERR_IO_PENDING) | 10087 if (rv == ERR_IO_PENDING) |
9756 rv = callback.WaitForResult(); | 10088 rv = callback.WaitForResult(); |
9757 EXPECT_EQ(OK, rv); | 10089 EXPECT_EQ(OK, rv); |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9840 HttpStreamFactory::set_use_alternate_protocols(true); | 10172 HttpStreamFactory::set_use_alternate_protocols(true); |
9841 std::vector<NextProto> next_protos; | 10173 std::vector<NextProto> next_protos; |
9842 next_protos.push_back(kProtoHTTP11); | 10174 next_protos.push_back(kProtoHTTP11); |
9843 HttpStreamFactory::SetNextProtos(next_protos); | 10175 HttpStreamFactory::SetNextProtos(next_protos); |
9844 HttpRequestInfo request; | 10176 HttpRequestInfo request; |
9845 request.method = "GET"; | 10177 request.method = "GET"; |
9846 request.url = GURL("https://www.google.com/"); | 10178 request.url = GURL("https://www.google.com/"); |
9847 request.load_flags = 0; | 10179 request.load_flags = 0; |
9848 | 10180 |
9849 MockWrite data_writes[] = { | 10181 MockWrite data_writes[] = { |
9850 MockWrite("GET / HTTP/1.1\r\n" | 10182 MockWrite( |
9851 "Host: www.google.com\r\n" | 10183 "GET / HTTP/1.1\r\n" |
9852 "Connection: keep-alive\r\n\r\n"), | 10184 "Host: www.google.com\r\n" |
| 10185 "Connection: keep-alive\r\n\r\n"), |
9853 }; | 10186 }; |
9854 | 10187 |
9855 std::string alternate_protocol_http_header = | 10188 std::string alternate_protocol_http_header = GetAlternateProtocolHttpHeader(); |
9856 GetAlternateProtocolHttpHeader(); | |
9857 | 10189 |
9858 MockRead data_reads[] = { | 10190 MockRead data_reads[] = { |
9859 MockRead("HTTP/1.1 200 OK\r\n"), | 10191 MockRead("HTTP/1.1 200 OK\r\n"), |
9860 MockRead(alternate_protocol_http_header.c_str()), | 10192 MockRead(alternate_protocol_http_header.c_str()), MockRead("hello world"), |
9861 MockRead("hello world"), | 10193 MockRead(SYNCHRONOUS, OK), |
9862 MockRead(SYNCHRONOUS, OK), | |
9863 }; | 10194 }; |
9864 | 10195 |
9865 SSLSocketDataProvider ssl(ASYNC, OK); | 10196 SSLSocketDataProvider ssl(ASYNC, OK); |
9866 ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated; | 10197 ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated; |
9867 ssl.next_proto = "http/1.1"; | 10198 ssl.next_proto = "http/1.1"; |
9868 ssl.protocol_negotiated = kProtoHTTP11; | 10199 ssl.protocol_negotiated = kProtoHTTP11; |
9869 | 10200 |
9870 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 10201 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
9871 | 10202 |
9872 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 10203 StaticSocketDataProvider data( |
9873 data_writes, arraysize(data_writes)); | 10204 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
9874 session_deps_.socket_factory->AddSocketDataProvider(&data); | 10205 session_deps_.socket_factory->AddSocketDataProvider(&data); |
9875 | 10206 |
9876 TestCompletionCallback callback; | 10207 TestCompletionCallback callback; |
9877 | 10208 |
9878 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 10209 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
9879 scoped_ptr<HttpTransaction> trans( | 10210 scoped_ptr<HttpTransaction> trans( |
9880 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 10211 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
9881 | 10212 |
9882 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 10213 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
9883 | 10214 |
(...skipping 24 matching lines...) Expand all Loading... |
9908 request.method = "GET"; | 10239 request.method = "GET"; |
9909 request.url = GURL("https://www.google.com/"); | 10240 request.url = GURL("https://www.google.com/"); |
9910 request.load_flags = 0; | 10241 request.load_flags = 0; |
9911 | 10242 |
9912 SSLSocketDataProvider ssl(ASYNC, OK); | 10243 SSLSocketDataProvider ssl(ASYNC, OK); |
9913 ssl.SetNextProto(GetParam()); | 10244 ssl.SetNextProto(GetParam()); |
9914 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 10245 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
9915 | 10246 |
9916 scoped_ptr<SpdyFrame> req( | 10247 scoped_ptr<SpdyFrame> req( |
9917 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); | 10248 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); |
9918 MockWrite spdy_writes[] = { CreateMockWrite(*req) }; | 10249 MockWrite spdy_writes[] = {CreateMockWrite(*req)}; |
9919 | 10250 |
9920 MockRead spdy_reads[] = { | 10251 MockRead spdy_reads[] = { |
9921 MockRead(SYNCHRONOUS, 0, 0) // Not async - return 0 immediately. | 10252 MockRead(SYNCHRONOUS, 0, 0) // Not async - return 0 immediately. |
9922 }; | 10253 }; |
9923 | 10254 |
9924 DelayedSocketData spdy_data( | 10255 DelayedSocketData spdy_data(0, // don't wait in this case, immediate hangup. |
9925 0, // don't wait in this case, immediate hangup. | 10256 spdy_reads, |
9926 spdy_reads, arraysize(spdy_reads), | 10257 arraysize(spdy_reads), |
9927 spdy_writes, arraysize(spdy_writes)); | 10258 spdy_writes, |
| 10259 arraysize(spdy_writes)); |
9928 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); | 10260 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); |
9929 | 10261 |
9930 TestCompletionCallback callback; | 10262 TestCompletionCallback callback; |
9931 | 10263 |
9932 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 10264 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
9933 scoped_ptr<HttpTransaction> trans( | 10265 scoped_ptr<HttpTransaction> trans( |
9934 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 10266 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
9935 | 10267 |
9936 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 10268 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
9937 EXPECT_EQ(ERR_IO_PENDING, rv); | 10269 EXPECT_EQ(ERR_IO_PENDING, rv); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9982 session_deps_.http_auth_handler_factory.reset(auth_factory); | 10314 session_deps_.http_auth_handler_factory.reset(auth_factory); |
9983 } | 10315 } |
9984 | 10316 |
9985 HttpRequestInfo request; | 10317 HttpRequestInfo request; |
9986 request.method = "GET"; | 10318 request.method = "GET"; |
9987 request.url = GURL("http://www.google.com"); | 10319 request.url = GURL("http://www.google.com"); |
9988 request.load_flags = 0; | 10320 request.load_flags = 0; |
9989 | 10321 |
9990 // First round goes unauthenticated through the proxy. | 10322 // First round goes unauthenticated through the proxy. |
9991 MockWrite data_writes_1[] = { | 10323 MockWrite data_writes_1[] = { |
9992 MockWrite("GET http://www.google.com/ HTTP/1.1\r\n" | 10324 MockWrite( |
9993 "Host: www.google.com\r\n" | 10325 "GET http://www.google.com/ HTTP/1.1\r\n" |
9994 "Proxy-Connection: keep-alive\r\n" | 10326 "Host: www.google.com\r\n" |
9995 "\r\n"), | 10327 "Proxy-Connection: keep-alive\r\n" |
| 10328 "\r\n"), |
9996 }; | 10329 }; |
9997 MockRead data_reads_1[] = { | 10330 MockRead data_reads_1[] = { |
9998 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 10331 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
9999 MockRead("HTTP/1.1 200 OK\r\n" | 10332 MockRead( |
10000 "Alternate-Protocol: 443:npn-spdy/2\r\n" | 10333 "HTTP/1.1 200 OK\r\n" |
10001 "Proxy-Connection: close\r\n" | 10334 "Alternate-Protocol: 443:npn-spdy/2\r\n" |
10002 "\r\n"), | 10335 "Proxy-Connection: close\r\n" |
| 10336 "\r\n"), |
10003 }; | 10337 }; |
10004 StaticSocketDataProvider data_1(data_reads_1, arraysize(data_reads_1), | 10338 StaticSocketDataProvider data_1(data_reads_1, |
10005 data_writes_1, arraysize(data_writes_1)); | 10339 arraysize(data_reads_1), |
| 10340 data_writes_1, |
| 10341 arraysize(data_writes_1)); |
10006 | 10342 |
10007 // Second round tries to tunnel to www.google.com due to the | 10343 // Second round tries to tunnel to www.google.com due to the |
10008 // Alternate-Protocol announcement in the first round. It fails due | 10344 // Alternate-Protocol announcement in the first round. It fails due |
10009 // to a proxy authentication challenge. | 10345 // to a proxy authentication challenge. |
10010 // After the failure, a tunnel is established to www.google.com using | 10346 // After the failure, a tunnel is established to www.google.com using |
10011 // Proxy-Authorization headers. There is then a SPDY request round. | 10347 // Proxy-Authorization headers. There is then a SPDY request round. |
10012 // | 10348 // |
10013 // NOTE: Despite the "Proxy-Connection: Close", these are done on the | 10349 // NOTE: Despite the "Proxy-Connection: Close", these are done on the |
10014 // same MockTCPClientSocket since the underlying HttpNetworkClientSocket | 10350 // same MockTCPClientSocket since the underlying HttpNetworkClientSocket |
10015 // does a Disconnect and Connect on the same socket, rather than trying | 10351 // does a Disconnect and Connect on the same socket, rather than trying |
10016 // to obtain a new one. | 10352 // to obtain a new one. |
10017 // | 10353 // |
10018 // NOTE: Originally, the proxy response to the second CONNECT request | 10354 // NOTE: Originally, the proxy response to the second CONNECT request |
10019 // simply returned another 407 so the unit test could skip the SSL connection | 10355 // simply returned another 407 so the unit test could skip the SSL connection |
10020 // establishment and SPDY framing issues. Alas, the | 10356 // establishment and SPDY framing issues. Alas, the |
10021 // retry-http-when-alternate-protocol fails logic kicks in, which was more | 10357 // retry-http-when-alternate-protocol fails logic kicks in, which was more |
10022 // complicated to set up expectations for than the SPDY session. | 10358 // complicated to set up expectations for than the SPDY session. |
10023 | 10359 |
10024 scoped_ptr<SpdyFrame> req( | 10360 scoped_ptr<SpdyFrame> req( |
10025 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); | 10361 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); |
10026 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 10362 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
10027 scoped_ptr<SpdyFrame> data(spdy_util_.ConstructSpdyBodyFrame(1, true)); | 10363 scoped_ptr<SpdyFrame> data(spdy_util_.ConstructSpdyBodyFrame(1, true)); |
10028 | 10364 |
10029 MockWrite data_writes_2[] = { | 10365 MockWrite data_writes_2[] = { |
10030 // First connection attempt without Proxy-Authorization. | 10366 // First connection attempt without Proxy-Authorization. |
10031 MockWrite("CONNECT www.google.com:443 HTTP/1.1\r\n" | 10367 MockWrite( |
10032 "Host: www.google.com\r\n" | 10368 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
10033 "Proxy-Connection: keep-alive\r\n" | 10369 "Host: www.google.com\r\n" |
10034 "\r\n"), | 10370 "Proxy-Connection: keep-alive\r\n" |
| 10371 "\r\n"), |
10035 | 10372 |
10036 // Second connection attempt with Proxy-Authorization. | 10373 // Second connection attempt with Proxy-Authorization. |
10037 MockWrite("CONNECT www.google.com:443 HTTP/1.1\r\n" | 10374 MockWrite( |
10038 "Host: www.google.com\r\n" | 10375 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
10039 "Proxy-Connection: keep-alive\r\n" | 10376 "Host: www.google.com\r\n" |
10040 "Proxy-Authorization: auth_token\r\n" | 10377 "Proxy-Connection: keep-alive\r\n" |
10041 "\r\n"), | 10378 "Proxy-Authorization: auth_token\r\n" |
| 10379 "\r\n"), |
10042 | 10380 |
10043 // SPDY request | 10381 // SPDY request |
10044 CreateMockWrite(*req), | 10382 CreateMockWrite(*req), |
10045 }; | 10383 }; |
10046 const char kRejectConnectResponse[] = ("HTTP/1.1 407 Unauthorized\r\n" | 10384 const char kRejectConnectResponse[] = |
10047 "Proxy-Authenticate: Mock\r\n" | 10385 ("HTTP/1.1 407 Unauthorized\r\n" |
10048 "Proxy-Connection: close\r\n" | 10386 "Proxy-Authenticate: Mock\r\n" |
10049 "\r\n"); | 10387 "Proxy-Connection: close\r\n" |
| 10388 "\r\n"); |
10050 const char kAcceptConnectResponse[] = "HTTP/1.1 200 Connected\r\n\r\n"; | 10389 const char kAcceptConnectResponse[] = "HTTP/1.1 200 Connected\r\n\r\n"; |
10051 MockRead data_reads_2[] = { | 10390 MockRead data_reads_2[] = { |
10052 // First connection attempt fails | 10391 // First connection attempt fails |
10053 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ, 1), | 10392 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ, 1), |
10054 MockRead(ASYNC, kRejectConnectResponse, | 10393 MockRead(ASYNC, |
10055 arraysize(kRejectConnectResponse) - 1, 1), | 10394 kRejectConnectResponse, |
| 10395 arraysize(kRejectConnectResponse) - 1, |
| 10396 1), |
10056 | 10397 |
10057 // Second connection attempt passes | 10398 // Second connection attempt passes |
10058 MockRead(ASYNC, kAcceptConnectResponse, | 10399 MockRead(ASYNC, |
10059 arraysize(kAcceptConnectResponse) -1, 4), | 10400 kAcceptConnectResponse, |
| 10401 arraysize(kAcceptConnectResponse) - 1, |
| 10402 4), |
10060 | 10403 |
10061 // SPDY response | 10404 // SPDY response |
10062 CreateMockRead(*resp.get(), 6), | 10405 CreateMockRead(*resp.get(), 6), CreateMockRead(*data.get(), 6), |
10063 CreateMockRead(*data.get(), 6), | 10406 MockRead(ASYNC, 0, 0, 6), |
10064 MockRead(ASYNC, 0, 0, 6), | |
10065 }; | 10407 }; |
10066 OrderedSocketData data_2( | 10408 OrderedSocketData data_2(data_reads_2, |
10067 data_reads_2, arraysize(data_reads_2), | 10409 arraysize(data_reads_2), |
10068 data_writes_2, arraysize(data_writes_2)); | 10410 data_writes_2, |
| 10411 arraysize(data_writes_2)); |
10069 | 10412 |
10070 SSLSocketDataProvider ssl(ASYNC, OK); | 10413 SSLSocketDataProvider ssl(ASYNC, OK); |
10071 ssl.SetNextProto(GetParam()); | 10414 ssl.SetNextProto(GetParam()); |
10072 | 10415 |
10073 MockConnect never_finishing_connect(SYNCHRONOUS, ERR_IO_PENDING); | 10416 MockConnect never_finishing_connect(SYNCHRONOUS, ERR_IO_PENDING); |
10074 StaticSocketDataProvider hanging_non_alternate_protocol_socket( | 10417 StaticSocketDataProvider hanging_non_alternate_protocol_socket( |
10075 NULL, 0, NULL, 0); | 10418 NULL, 0, NULL, 0); |
10076 hanging_non_alternate_protocol_socket.set_connect_data( | 10419 hanging_non_alternate_protocol_socket.set_connect_data( |
10077 never_finishing_connect); | 10420 never_finishing_connect); |
10078 | 10421 |
(...skipping 18 matching lines...) Expand all Loading... |
10097 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 10440 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
10098 rv = trans_2->Start(&request, callback_2.callback(), BoundNetLog()); | 10441 rv = trans_2->Start(&request, callback_2.callback(), BoundNetLog()); |
10099 EXPECT_EQ(ERR_IO_PENDING, rv); | 10442 EXPECT_EQ(ERR_IO_PENDING, rv); |
10100 EXPECT_EQ(OK, callback_2.WaitForResult()); | 10443 EXPECT_EQ(OK, callback_2.WaitForResult()); |
10101 const HttpResponseInfo* response = trans_2->GetResponseInfo(); | 10444 const HttpResponseInfo* response = trans_2->GetResponseInfo(); |
10102 ASSERT_TRUE(response != NULL); | 10445 ASSERT_TRUE(response != NULL); |
10103 ASSERT_FALSE(response->auth_challenge.get() == NULL); | 10446 ASSERT_FALSE(response->auth_challenge.get() == NULL); |
10104 | 10447 |
10105 // Restart with auth. Tunnel should work and response received. | 10448 // Restart with auth. Tunnel should work and response received. |
10106 TestCompletionCallback callback_3; | 10449 TestCompletionCallback callback_3; |
10107 rv = trans_2->RestartWithAuth( | 10450 rv = trans_2->RestartWithAuth(AuthCredentials(kFoo, kBar), |
10108 AuthCredentials(kFoo, kBar), callback_3.callback()); | 10451 callback_3.callback()); |
10109 EXPECT_EQ(ERR_IO_PENDING, rv); | 10452 EXPECT_EQ(ERR_IO_PENDING, rv); |
10110 EXPECT_EQ(OK, callback_3.WaitForResult()); | 10453 EXPECT_EQ(OK, callback_3.WaitForResult()); |
10111 | 10454 |
10112 // After all that work, these two lines (or actually, just the scheme) are | 10455 // After all that work, these two lines (or actually, just the scheme) are |
10113 // what this test is all about. Make sure it happens correctly. | 10456 // what this test is all about. Make sure it happens correctly. |
10114 EXPECT_EQ("https", request_url.scheme()); | 10457 EXPECT_EQ("https", request_url.scheme()); |
10115 EXPECT_EQ("www.google.com", request_url.host()); | 10458 EXPECT_EQ("www.google.com", request_url.host()); |
10116 | 10459 |
10117 LoadTimingInfo load_timing_info; | 10460 LoadTimingInfo load_timing_info; |
10118 EXPECT_TRUE(trans_2->GetLoadTimingInfo(&load_timing_info)); | 10461 EXPECT_TRUE(trans_2->GetLoadTimingInfo(&load_timing_info)); |
10119 TestLoadTimingNotReusedWithPac(load_timing_info, | 10462 TestLoadTimingNotReusedWithPac(load_timing_info, |
10120 CONNECT_TIMING_HAS_SSL_TIMES); | 10463 CONNECT_TIMING_HAS_SSL_TIMES); |
10121 } | 10464 } |
10122 | 10465 |
10123 // Test that if we cancel the transaction as the connection is completing, that | 10466 // Test that if we cancel the transaction as the connection is completing, that |
10124 // everything tears down correctly. | 10467 // everything tears down correctly. |
10125 TEST_P(HttpNetworkTransactionTest, SimpleCancel) { | 10468 TEST_P(HttpNetworkTransactionTest, SimpleCancel) { |
10126 // Setup everything about the connection to complete synchronously, so that | 10469 // Setup everything about the connection to complete synchronously, so that |
10127 // after calling HttpNetworkTransaction::Start, the only thing we're waiting | 10470 // after calling HttpNetworkTransaction::Start, the only thing we're waiting |
10128 // for is the callback from the HttpStreamRequest. | 10471 // for is the callback from the HttpStreamRequest. |
10129 // Then cancel the transaction. | 10472 // Then cancel the transaction. |
10130 // Verify that we don't crash. | 10473 // Verify that we don't crash. |
10131 MockConnect mock_connect(SYNCHRONOUS, OK); | 10474 MockConnect mock_connect(SYNCHRONOUS, OK); |
10132 MockRead data_reads[] = { | 10475 MockRead data_reads[] = { |
10133 MockRead(SYNCHRONOUS, "HTTP/1.0 200 OK\r\n\r\n"), | 10476 MockRead(SYNCHRONOUS, "HTTP/1.0 200 OK\r\n\r\n"), |
10134 MockRead(SYNCHRONOUS, "hello world"), | 10477 MockRead(SYNCHRONOUS, "hello world"), MockRead(SYNCHRONOUS, OK), |
10135 MockRead(SYNCHRONOUS, OK), | |
10136 }; | 10478 }; |
10137 | 10479 |
10138 HttpRequestInfo request; | 10480 HttpRequestInfo request; |
10139 request.method = "GET"; | 10481 request.method = "GET"; |
10140 request.url = GURL("http://www.google.com/"); | 10482 request.url = GURL("http://www.google.com/"); |
10141 request.load_flags = 0; | 10483 request.load_flags = 0; |
10142 | 10484 |
10143 session_deps_.host_resolver->set_synchronous_mode(true); | 10485 session_deps_.host_resolver->set_synchronous_mode(true); |
10144 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 10486 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
10145 scoped_ptr<HttpTransaction> trans( | 10487 scoped_ptr<HttpTransaction> trans( |
(...skipping 19 matching lines...) Expand all Loading... |
10165 ProxyService::CreateFixedFromPacResult("PROXY myproxy:70")); | 10507 ProxyService::CreateFixedFromPacResult("PROXY myproxy:70")); |
10166 CapturingBoundNetLog log; | 10508 CapturingBoundNetLog log; |
10167 session_deps_.net_log = log.bound().net_log(); | 10509 session_deps_.net_log = log.bound().net_log(); |
10168 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 10510 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
10169 | 10511 |
10170 HttpRequestInfo request; | 10512 HttpRequestInfo request; |
10171 request.method = "GET"; | 10513 request.method = "GET"; |
10172 request.url = GURL("http://www.google.com/"); | 10514 request.url = GURL("http://www.google.com/"); |
10173 | 10515 |
10174 MockWrite data_writes1[] = { | 10516 MockWrite data_writes1[] = { |
10175 MockWrite("GET http://www.google.com/ HTTP/1.1\r\n" | 10517 MockWrite( |
10176 "Host: www.google.com\r\n" | 10518 "GET http://www.google.com/ HTTP/1.1\r\n" |
10177 "Proxy-Connection: keep-alive\r\n\r\n"), | 10519 "Host: www.google.com\r\n" |
| 10520 "Proxy-Connection: keep-alive\r\n\r\n"), |
10178 }; | 10521 }; |
10179 | 10522 |
10180 MockRead data_reads1[] = { | 10523 MockRead data_reads1[] = { |
10181 MockRead("HTTP/1.1 200 OK\r\n"), | 10524 MockRead("HTTP/1.1 200 OK\r\n"), |
10182 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 10525 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
10183 MockRead("Content-Length: 100\r\n\r\n"), | 10526 MockRead("Content-Length: 100\r\n\r\n"), MockRead(SYNCHRONOUS, OK), |
10184 MockRead(SYNCHRONOUS, OK), | |
10185 }; | 10527 }; |
10186 | 10528 |
10187 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 10529 StaticSocketDataProvider data1(data_reads1, |
10188 data_writes1, arraysize(data_writes1)); | 10530 arraysize(data_reads1), |
| 10531 data_writes1, |
| 10532 arraysize(data_writes1)); |
10189 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 10533 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
10190 | 10534 |
10191 TestCompletionCallback callback1; | 10535 TestCompletionCallback callback1; |
10192 | 10536 |
10193 scoped_ptr<HttpTransaction> trans( | 10537 scoped_ptr<HttpTransaction> trans( |
10194 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 10538 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
10195 | 10539 |
10196 int rv = trans->Start(&request, callback1.callback(), log.bound()); | 10540 int rv = trans->Start(&request, callback1.callback(), log.bound()); |
10197 EXPECT_EQ(ERR_IO_PENDING, rv); | 10541 EXPECT_EQ(ERR_IO_PENDING, rv); |
10198 | 10542 |
(...skipping 22 matching lines...) Expand all Loading... |
10221 CapturingBoundNetLog log; | 10565 CapturingBoundNetLog log; |
10222 session_deps_.net_log = log.bound().net_log(); | 10566 session_deps_.net_log = log.bound().net_log(); |
10223 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 10567 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
10224 | 10568 |
10225 HttpRequestInfo request; | 10569 HttpRequestInfo request; |
10226 request.method = "GET"; | 10570 request.method = "GET"; |
10227 request.url = GURL("https://www.google.com/"); | 10571 request.url = GURL("https://www.google.com/"); |
10228 | 10572 |
10229 // Since we have proxy, should try to establish tunnel. | 10573 // Since we have proxy, should try to establish tunnel. |
10230 MockWrite data_writes1[] = { | 10574 MockWrite data_writes1[] = { |
10231 MockWrite("CONNECT www.google.com:443 HTTP/1.1\r\n" | 10575 MockWrite( |
10232 "Host: www.google.com\r\n" | 10576 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
10233 "Proxy-Connection: keep-alive\r\n\r\n"), | 10577 "Host: www.google.com\r\n" |
10234 | 10578 "Proxy-Connection: keep-alive\r\n\r\n"), |
10235 MockWrite("GET / HTTP/1.1\r\n" | 10579 MockWrite( |
10236 "Host: www.google.com\r\n" | 10580 "GET / HTTP/1.1\r\n" |
10237 "Connection: keep-alive\r\n\r\n"), | 10581 "Host: www.google.com\r\n" |
| 10582 "Connection: keep-alive\r\n\r\n"), |
10238 }; | 10583 }; |
10239 | 10584 |
10240 MockRead data_reads1[] = { | 10585 MockRead data_reads1[] = { |
10241 MockRead("HTTP/1.1 200 Connection Established\r\n\r\n"), | 10586 MockRead("HTTP/1.1 200 Connection Established\r\n\r\n"), |
10242 | 10587 MockRead("HTTP/1.1 200 OK\r\n"), |
10243 MockRead("HTTP/1.1 200 OK\r\n"), | 10588 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
10244 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 10589 MockRead("Content-Length: 100\r\n\r\n"), |
10245 MockRead("Content-Length: 100\r\n\r\n"), | 10590 MockRead(SYNCHRONOUS, OK), |
10246 MockRead(SYNCHRONOUS, OK), | |
10247 }; | 10591 }; |
10248 | 10592 |
10249 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 10593 StaticSocketDataProvider data1(data_reads1, |
10250 data_writes1, arraysize(data_writes1)); | 10594 arraysize(data_reads1), |
| 10595 data_writes1, |
| 10596 arraysize(data_writes1)); |
10251 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 10597 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
10252 SSLSocketDataProvider ssl(ASYNC, OK); | 10598 SSLSocketDataProvider ssl(ASYNC, OK); |
10253 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 10599 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
10254 | 10600 |
10255 TestCompletionCallback callback1; | 10601 TestCompletionCallback callback1; |
10256 | 10602 |
10257 scoped_ptr<HttpTransaction> trans( | 10603 scoped_ptr<HttpTransaction> trans( |
10258 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 10604 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
10259 | 10605 |
10260 int rv = trans->Start(&request, callback1.callback(), log.bound()); | 10606 int rv = trans->Start(&request, callback1.callback(), log.bound()); |
10261 EXPECT_EQ(ERR_IO_PENDING, rv); | 10607 EXPECT_EQ(ERR_IO_PENDING, rv); |
10262 | 10608 |
10263 rv = callback1.WaitForResult(); | 10609 rv = callback1.WaitForResult(); |
10264 EXPECT_EQ(OK, rv); | 10610 EXPECT_EQ(OK, rv); |
10265 net::CapturingNetLog::CapturedEntryList entries; | 10611 net::CapturingNetLog::CapturedEntryList entries; |
10266 log.GetEntries(&entries); | 10612 log.GetEntries(&entries); |
10267 size_t pos = ExpectLogContainsSomewhere( | 10613 size_t pos = ExpectLogContainsSomewhere( |
10268 entries, 0, NetLog::TYPE_HTTP_TRANSACTION_SEND_TUNNEL_HEADERS, | 10614 entries, |
| 10615 0, |
| 10616 NetLog::TYPE_HTTP_TRANSACTION_SEND_TUNNEL_HEADERS, |
10269 NetLog::PHASE_NONE); | 10617 NetLog::PHASE_NONE); |
10270 ExpectLogContainsSomewhere( | 10618 ExpectLogContainsSomewhere( |
10271 entries, pos, | 10619 entries, |
| 10620 pos, |
10272 NetLog::TYPE_HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS, | 10621 NetLog::TYPE_HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS, |
10273 NetLog::PHASE_NONE); | 10622 NetLog::PHASE_NONE); |
10274 | 10623 |
10275 const HttpResponseInfo* response = trans->GetResponseInfo(); | 10624 const HttpResponseInfo* response = trans->GetResponseInfo(); |
10276 ASSERT_TRUE(response != NULL); | 10625 ASSERT_TRUE(response != NULL); |
10277 | 10626 |
10278 EXPECT_TRUE(response->headers->IsKeepAlive()); | 10627 EXPECT_TRUE(response->headers->IsKeepAlive()); |
10279 EXPECT_EQ(200, response->headers->response_code()); | 10628 EXPECT_EQ(200, response->headers->response_code()); |
10280 EXPECT_EQ(100, response->headers->GetContentLength()); | 10629 EXPECT_EQ(100, response->headers->GetContentLength()); |
10281 EXPECT_TRUE(HttpVersion(1, 1) == response->headers->GetHttpVersion()); | 10630 EXPECT_TRUE(HttpVersion(1, 1) == response->headers->GetHttpVersion()); |
(...skipping 12 matching lines...) Expand all Loading... |
10294 CapturingBoundNetLog log; | 10643 CapturingBoundNetLog log; |
10295 session_deps_.net_log = log.bound().net_log(); | 10644 session_deps_.net_log = log.bound().net_log(); |
10296 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 10645 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
10297 | 10646 |
10298 HttpRequestInfo request; | 10647 HttpRequestInfo request; |
10299 request.method = "GET"; | 10648 request.method = "GET"; |
10300 request.url = GURL("https://www.google.com/"); | 10649 request.url = GURL("https://www.google.com/"); |
10301 | 10650 |
10302 // Since we have proxy, should try to establish tunnel. | 10651 // Since we have proxy, should try to establish tunnel. |
10303 MockWrite data_writes1[] = { | 10652 MockWrite data_writes1[] = { |
10304 MockWrite("CONNECT www.google.com:443 HTTP/1.1\r\n" | 10653 MockWrite( |
10305 "Host: www.google.com\r\n" | 10654 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
10306 "Proxy-Connection: keep-alive\r\n\r\n"), | 10655 "Host: www.google.com\r\n" |
10307 | 10656 "Proxy-Connection: keep-alive\r\n\r\n"), |
10308 MockWrite("GET / HTTP/1.1\r\n" | 10657 MockWrite( |
10309 "Host: www.google.com\r\n" | 10658 "GET / HTTP/1.1\r\n" |
10310 "Connection: keep-alive\r\n\r\n"), | 10659 "Host: www.google.com\r\n" |
| 10660 "Connection: keep-alive\r\n\r\n"), |
10311 }; | 10661 }; |
10312 | 10662 |
10313 MockRead data_reads1[] = { | 10663 MockRead data_reads1[] = { |
10314 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 10664 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
10315 MockRead("HTTP/1.1 200 Connection Established\r\n\r\n"), | 10665 MockRead("HTTP/1.1 200 Connection Established\r\n\r\n"), |
10316 MockRead(ASYNC, 0, 0), // EOF | 10666 MockRead(ASYNC, 0, 0), // EOF |
10317 }; | 10667 }; |
10318 | 10668 |
10319 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 10669 StaticSocketDataProvider data1(data_reads1, |
10320 data_writes1, arraysize(data_writes1)); | 10670 arraysize(data_reads1), |
| 10671 data_writes1, |
| 10672 arraysize(data_writes1)); |
10321 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 10673 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
10322 SSLSocketDataProvider ssl(ASYNC, OK); | 10674 SSLSocketDataProvider ssl(ASYNC, OK); |
10323 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 10675 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
10324 | 10676 |
10325 TestCompletionCallback callback1; | 10677 TestCompletionCallback callback1; |
10326 | 10678 |
10327 scoped_ptr<HttpTransaction> trans( | 10679 scoped_ptr<HttpTransaction> trans( |
10328 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 10680 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
10329 | 10681 |
10330 int rv = trans->Start(&request, callback1.callback(), log.bound()); | 10682 int rv = trans->Start(&request, callback1.callback(), log.bound()); |
10331 EXPECT_EQ(ERR_IO_PENDING, rv); | 10683 EXPECT_EQ(ERR_IO_PENDING, rv); |
10332 | 10684 |
10333 rv = callback1.WaitForResult(); | 10685 rv = callback1.WaitForResult(); |
10334 EXPECT_EQ(ERR_EMPTY_RESPONSE, rv); | 10686 EXPECT_EQ(ERR_EMPTY_RESPONSE, rv); |
10335 net::CapturingNetLog::CapturedEntryList entries; | 10687 net::CapturingNetLog::CapturedEntryList entries; |
10336 log.GetEntries(&entries); | 10688 log.GetEntries(&entries); |
10337 size_t pos = ExpectLogContainsSomewhere( | 10689 size_t pos = ExpectLogContainsSomewhere( |
10338 entries, 0, NetLog::TYPE_HTTP_TRANSACTION_SEND_TUNNEL_HEADERS, | 10690 entries, |
| 10691 0, |
| 10692 NetLog::TYPE_HTTP_TRANSACTION_SEND_TUNNEL_HEADERS, |
10339 NetLog::PHASE_NONE); | 10693 NetLog::PHASE_NONE); |
10340 ExpectLogContainsSomewhere( | 10694 ExpectLogContainsSomewhere( |
10341 entries, pos, | 10695 entries, |
| 10696 pos, |
10342 NetLog::TYPE_HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS, | 10697 NetLog::TYPE_HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS, |
10343 NetLog::PHASE_NONE); | 10698 NetLog::PHASE_NONE); |
10344 } | 10699 } |
10345 | 10700 |
10346 // Test for crbug.com/55424. | 10701 // Test for crbug.com/55424. |
10347 TEST_P(HttpNetworkTransactionTest, PreconnectWithExistingSpdySession) { | 10702 TEST_P(HttpNetworkTransactionTest, PreconnectWithExistingSpdySession) { |
10348 scoped_ptr<SpdyFrame> req( | 10703 scoped_ptr<SpdyFrame> req( |
10349 spdy_util_.ConstructSpdyGet("https://www.google.com", false, 1, LOWEST)); | 10704 spdy_util_.ConstructSpdyGet("https://www.google.com", false, 1, LOWEST)); |
10350 MockWrite spdy_writes[] = { CreateMockWrite(*req) }; | 10705 MockWrite spdy_writes[] = {CreateMockWrite(*req)}; |
10351 | 10706 |
10352 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 10707 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
10353 scoped_ptr<SpdyFrame> data(spdy_util_.ConstructSpdyBodyFrame(1, true)); | 10708 scoped_ptr<SpdyFrame> data(spdy_util_.ConstructSpdyBodyFrame(1, true)); |
10354 MockRead spdy_reads[] = { | 10709 MockRead spdy_reads[] = { |
10355 CreateMockRead(*resp), | 10710 CreateMockRead(*resp), CreateMockRead(*data), MockRead(ASYNC, 0, 0), |
10356 CreateMockRead(*data), | |
10357 MockRead(ASYNC, 0, 0), | |
10358 }; | 10711 }; |
10359 | 10712 |
10360 DelayedSocketData spdy_data( | 10713 DelayedSocketData spdy_data( |
10361 1, // wait for one write to finish before reading. | 10714 1, // wait for one write to finish before reading. |
10362 spdy_reads, arraysize(spdy_reads), | 10715 spdy_reads, |
10363 spdy_writes, arraysize(spdy_writes)); | 10716 arraysize(spdy_reads), |
| 10717 spdy_writes, |
| 10718 arraysize(spdy_writes)); |
10364 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); | 10719 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); |
10365 | 10720 |
10366 SSLSocketDataProvider ssl(ASYNC, OK); | 10721 SSLSocketDataProvider ssl(ASYNC, OK); |
10367 ssl.SetNextProto(GetParam()); | 10722 ssl.SetNextProto(GetParam()); |
10368 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 10723 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
10369 | 10724 |
10370 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 10725 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
10371 | 10726 |
10372 // Set up an initial SpdySession in the pool to reuse. | 10727 // Set up an initial SpdySession in the pool to reuse. |
10373 HostPortPair host_port_pair("www.google.com", 443); | 10728 HostPortPair host_port_pair("www.google.com", 443); |
10374 SpdySessionKey key(host_port_pair, ProxyServer::Direct(), | 10729 SpdySessionKey key( |
10375 PRIVACY_MODE_DISABLED); | 10730 host_port_pair, ProxyServer::Direct(), PRIVACY_MODE_DISABLED); |
10376 base::WeakPtr<SpdySession> spdy_session = | 10731 base::WeakPtr<SpdySession> spdy_session = |
10377 CreateInsecureSpdySession(session, key, BoundNetLog()); | 10732 CreateInsecureSpdySession(session, key, BoundNetLog()); |
10378 | 10733 |
10379 HttpRequestInfo request; | 10734 HttpRequestInfo request; |
10380 request.method = "GET"; | 10735 request.method = "GET"; |
10381 request.url = GURL("https://www.google.com/"); | 10736 request.url = GURL("https://www.google.com/"); |
10382 request.load_flags = 0; | 10737 request.load_flags = 0; |
10383 | 10738 |
10384 // This is the important line that marks this as a preconnect. | 10739 // This is the important line that marks this as a preconnect. |
10385 request.motivation = HttpRequestInfo::PRECONNECT_MOTIVATED; | 10740 request.motivation = HttpRequestInfo::PRECONNECT_MOTIVATED; |
10386 | 10741 |
10387 scoped_ptr<HttpTransaction> trans( | 10742 scoped_ptr<HttpTransaction> trans( |
10388 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 10743 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
10389 | 10744 |
10390 TestCompletionCallback callback; | 10745 TestCompletionCallback callback; |
10391 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 10746 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
10392 EXPECT_EQ(ERR_IO_PENDING, rv); | 10747 EXPECT_EQ(ERR_IO_PENDING, rv); |
10393 EXPECT_EQ(OK, callback.WaitForResult()); | 10748 EXPECT_EQ(OK, callback.WaitForResult()); |
10394 } | 10749 } |
10395 | 10750 |
10396 // Given a net error, cause that error to be returned from the first Write() | 10751 // Given a net error, cause that error to be returned from the first Write() |
10397 // call and verify that the HttpTransaction fails with that error. | 10752 // call and verify that the HttpTransaction fails with that error. |
10398 void HttpNetworkTransactionTest::CheckErrorIsPassedBack( | 10753 void HttpNetworkTransactionTest::CheckErrorIsPassedBack(int error, |
10399 int error, IoMode mode) { | 10754 IoMode mode) { |
10400 net::HttpRequestInfo request_info; | 10755 net::HttpRequestInfo request_info; |
10401 request_info.url = GURL("https://www.example.com/"); | 10756 request_info.url = GURL("https://www.example.com/"); |
10402 request_info.method = "GET"; | 10757 request_info.method = "GET"; |
10403 request_info.load_flags = net::LOAD_NORMAL; | 10758 request_info.load_flags = net::LOAD_NORMAL; |
10404 | 10759 |
10405 SSLSocketDataProvider ssl_data(mode, OK); | 10760 SSLSocketDataProvider ssl_data(mode, OK); |
10406 net::MockWrite data_writes[] = { | 10761 net::MockWrite data_writes[] = { |
10407 net::MockWrite(mode, error), | 10762 net::MockWrite(mode, error), |
10408 }; | 10763 }; |
10409 net::StaticSocketDataProvider data(NULL, 0, | 10764 net::StaticSocketDataProvider data( |
10410 data_writes, arraysize(data_writes)); | 10765 NULL, 0, data_writes, arraysize(data_writes)); |
10411 session_deps_.socket_factory->AddSocketDataProvider(&data); | 10766 session_deps_.socket_factory->AddSocketDataProvider(&data); |
10412 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_data); | 10767 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_data); |
10413 | 10768 |
10414 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 10769 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
10415 scoped_ptr<HttpTransaction> trans( | 10770 scoped_ptr<HttpTransaction> trans( |
10416 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 10771 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
10417 | 10772 |
10418 TestCompletionCallback callback; | 10773 TestCompletionCallback callback; |
10419 int rv = trans->Start(&request_info, callback.callback(), net::BoundNetLog()); | 10774 int rv = trans->Start(&request_info, callback.callback(), net::BoundNetLog()); |
10420 if (rv == net::ERR_IO_PENDING) | 10775 if (rv == net::ERR_IO_PENDING) |
10421 rv = callback.WaitForResult(); | 10776 rv = callback.WaitForResult(); |
10422 ASSERT_EQ(error, rv); | 10777 ASSERT_EQ(error, rv); |
10423 } | 10778 } |
10424 | 10779 |
10425 TEST_P(HttpNetworkTransactionTest, SSLWriteCertError) { | 10780 TEST_P(HttpNetworkTransactionTest, SSLWriteCertError) { |
10426 // Just check a grab bag of cert errors. | 10781 // Just check a grab bag of cert errors. |
10427 static const int kErrors[] = { | 10782 static const int kErrors[] = { |
10428 ERR_CERT_COMMON_NAME_INVALID, | 10783 ERR_CERT_COMMON_NAME_INVALID, ERR_CERT_AUTHORITY_INVALID, |
10429 ERR_CERT_AUTHORITY_INVALID, | 10784 ERR_CERT_DATE_INVALID, |
10430 ERR_CERT_DATE_INVALID, | |
10431 }; | 10785 }; |
10432 for (size_t i = 0; i < arraysize(kErrors); i++) { | 10786 for (size_t i = 0; i < arraysize(kErrors); i++) { |
10433 CheckErrorIsPassedBack(kErrors[i], ASYNC); | 10787 CheckErrorIsPassedBack(kErrors[i], ASYNC); |
10434 CheckErrorIsPassedBack(kErrors[i], SYNCHRONOUS); | 10788 CheckErrorIsPassedBack(kErrors[i], SYNCHRONOUS); |
10435 } | 10789 } |
10436 } | 10790 } |
10437 | 10791 |
10438 // Ensure that a client certificate is removed from the SSL client auth | 10792 // Ensure that a client certificate is removed from the SSL client auth |
10439 // cache when: | 10793 // cache when: |
10440 // 1) No proxy is involved. | 10794 // 1) No proxy is involved. |
10441 // 2) TLS False Start is disabled. | 10795 // 2) TLS False Start is disabled. |
10442 // 3) The initial TLS handshake requests a client certificate. | 10796 // 3) The initial TLS handshake requests a client certificate. |
10443 // 4) The client supplies an invalid/unacceptable certificate. | 10797 // 4) The client supplies an invalid/unacceptable certificate. |
10444 TEST_P(HttpNetworkTransactionTest, | 10798 TEST_P(HttpNetworkTransactionTest, ClientAuthCertCache_Direct_NoFalseStart) { |
10445 ClientAuthCertCache_Direct_NoFalseStart) { | |
10446 net::HttpRequestInfo request_info; | 10799 net::HttpRequestInfo request_info; |
10447 request_info.url = GURL("https://www.example.com/"); | 10800 request_info.url = GURL("https://www.example.com/"); |
10448 request_info.method = "GET"; | 10801 request_info.method = "GET"; |
10449 request_info.load_flags = net::LOAD_NORMAL; | 10802 request_info.load_flags = net::LOAD_NORMAL; |
10450 | 10803 |
10451 scoped_refptr<SSLCertRequestInfo> cert_request(new SSLCertRequestInfo()); | 10804 scoped_refptr<SSLCertRequestInfo> cert_request(new SSLCertRequestInfo()); |
10452 cert_request->host_and_port = HostPortPair("www.example.com", 443); | 10805 cert_request->host_and_port = HostPortPair("www.example.com", 443); |
10453 | 10806 |
10454 // [ssl_]data1 contains the data for the first SSL handshake. When a | 10807 // [ssl_]data1 contains the data for the first SSL handshake. When a |
10455 // CertificateRequest is received for the first time, the handshake will | 10808 // CertificateRequest is received for the first time, the handshake will |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10544 ASSERT_FALSE(session->ssl_client_auth_cache()->Lookup( | 10897 ASSERT_FALSE(session->ssl_client_auth_cache()->Lookup( |
10545 HostPortPair("www.example.com", 443), &client_cert)); | 10898 HostPortPair("www.example.com", 443), &client_cert)); |
10546 } | 10899 } |
10547 | 10900 |
10548 // Ensure that a client certificate is removed from the SSL client auth | 10901 // Ensure that a client certificate is removed from the SSL client auth |
10549 // cache when: | 10902 // cache when: |
10550 // 1) No proxy is involved. | 10903 // 1) No proxy is involved. |
10551 // 2) TLS False Start is enabled. | 10904 // 2) TLS False Start is enabled. |
10552 // 3) The initial TLS handshake requests a client certificate. | 10905 // 3) The initial TLS handshake requests a client certificate. |
10553 // 4) The client supplies an invalid/unacceptable certificate. | 10906 // 4) The client supplies an invalid/unacceptable certificate. |
10554 TEST_P(HttpNetworkTransactionTest, | 10907 TEST_P(HttpNetworkTransactionTest, ClientAuthCertCache_Direct_FalseStart) { |
10555 ClientAuthCertCache_Direct_FalseStart) { | |
10556 net::HttpRequestInfo request_info; | 10908 net::HttpRequestInfo request_info; |
10557 request_info.url = GURL("https://www.example.com/"); | 10909 request_info.url = GURL("https://www.example.com/"); |
10558 request_info.method = "GET"; | 10910 request_info.method = "GET"; |
10559 request_info.load_flags = net::LOAD_NORMAL; | 10911 request_info.load_flags = net::LOAD_NORMAL; |
10560 | 10912 |
10561 scoped_refptr<SSLCertRequestInfo> cert_request(new SSLCertRequestInfo()); | 10913 scoped_refptr<SSLCertRequestInfo> cert_request(new SSLCertRequestInfo()); |
10562 cert_request->host_and_port = HostPortPair("www.example.com", 443); | 10914 cert_request->host_and_port = HostPortPair("www.example.com", 443); |
10563 | 10915 |
10564 // When TLS False Start is used, SSLClientSocket::Connect() calls will | 10916 // When TLS False Start is used, SSLClientSocket::Connect() calls will |
10565 // return successfully after reading up to the peer's Certificate message. | 10917 // return successfully after reading up to the peer's Certificate message. |
(...skipping 20 matching lines...) Expand all Loading... |
10586 // when the peer requests the certificate. Instead, the handshake will | 10938 // when the peer requests the certificate. Instead, the handshake will |
10587 // artificially succeed, allowing the caller to write the HTTP request to | 10939 // artificially succeed, allowing the caller to write the HTTP request to |
10588 // the socket. The handshake messages are not processed until Read() is | 10940 // the socket. The handshake messages are not processed until Read() is |
10589 // called, which then detects that the handshake was aborted, due to the | 10941 // called, which then detects that the handshake was aborted, due to the |
10590 // peer sending a handshake_failure because it requires a client | 10942 // peer sending a handshake_failure because it requires a client |
10591 // certificate. | 10943 // certificate. |
10592 SSLSocketDataProvider ssl_data2(ASYNC, net::OK); | 10944 SSLSocketDataProvider ssl_data2(ASYNC, net::OK); |
10593 ssl_data2.cert_request_info = cert_request.get(); | 10945 ssl_data2.cert_request_info = cert_request.get(); |
10594 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_data2); | 10946 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_data2); |
10595 net::MockRead data2_reads[] = { | 10947 net::MockRead data2_reads[] = { |
10596 net::MockRead(ASYNC /* async */, net::ERR_SSL_PROTOCOL_ERROR), | 10948 net::MockRead(ASYNC /* async */, net::ERR_SSL_PROTOCOL_ERROR), |
10597 }; | 10949 }; |
10598 net::StaticSocketDataProvider data2( | 10950 net::StaticSocketDataProvider data2( |
10599 data2_reads, arraysize(data2_reads), NULL, 0); | 10951 data2_reads, arraysize(data2_reads), NULL, 0); |
10600 session_deps_.socket_factory->AddSocketDataProvider(&data2); | 10952 session_deps_.socket_factory->AddSocketDataProvider(&data2); |
10601 | 10953 |
10602 // As described in ClientAuthCertCache_Direct_NoFalseStart, [ssl_]data3 is | 10954 // As described in ClientAuthCertCache_Direct_NoFalseStart, [ssl_]data3 is |
10603 // the data for the SSL handshake once the TLSv1.1 connection falls back to | 10955 // the data for the SSL handshake once the TLSv1.1 connection falls back to |
10604 // TLSv1. It has the same behaviour as [ssl_]data2. | 10956 // TLSv1. It has the same behaviour as [ssl_]data2. |
10605 SSLSocketDataProvider ssl_data3(ASYNC, net::OK); | 10957 SSLSocketDataProvider ssl_data3(ASYNC, net::OK); |
10606 ssl_data3.cert_request_info = cert_request.get(); | 10958 ssl_data3.cert_request_info = cert_request.get(); |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10692 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_data1); | 11044 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_data1); |
10693 net::StaticSocketDataProvider data1(NULL, 0, NULL, 0); | 11045 net::StaticSocketDataProvider data1(NULL, 0, NULL, 0); |
10694 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 11046 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
10695 | 11047 |
10696 SSLSocketDataProvider ssl_data2(ASYNC, net::ERR_SSL_PROTOCOL_ERROR); | 11048 SSLSocketDataProvider ssl_data2(ASYNC, net::ERR_SSL_PROTOCOL_ERROR); |
10697 ssl_data2.cert_request_info = cert_request.get(); | 11049 ssl_data2.cert_request_info = cert_request.get(); |
10698 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_data2); | 11050 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_data2); |
10699 net::StaticSocketDataProvider data2(NULL, 0, NULL, 0); | 11051 net::StaticSocketDataProvider data2(NULL, 0, NULL, 0); |
10700 session_deps_.socket_factory->AddSocketDataProvider(&data2); | 11052 session_deps_.socket_factory->AddSocketDataProvider(&data2); |
10701 | 11053 |
10702 // TODO(wtc): find out why this unit test doesn't need [ssl_]data3. | 11054 // TODO(wtc): find out why this unit test doesn't need [ssl_]data3. |
10703 #if 0 | 11055 #if 0 |
10704 SSLSocketDataProvider ssl_data3(ASYNC, net::ERR_SSL_PROTOCOL_ERROR); | 11056 SSLSocketDataProvider ssl_data3(ASYNC, net::ERR_SSL_PROTOCOL_ERROR); |
10705 ssl_data3.cert_request_info = cert_request.get(); | 11057 ssl_data3.cert_request_info = cert_request.get(); |
10706 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_data3); | 11058 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_data3); |
10707 net::StaticSocketDataProvider data3(NULL, 0, NULL, 0); | 11059 net::StaticSocketDataProvider data3(NULL, 0, NULL, 0); |
10708 session_deps_.socket_factory->AddSocketDataProvider(&data3); | 11060 session_deps_.socket_factory->AddSocketDataProvider(&data3); |
10709 #endif | 11061 #endif |
10710 | 11062 |
10711 net::HttpRequestInfo requests[2]; | 11063 net::HttpRequestInfo requests[2]; |
10712 requests[0].url = GURL("https://www.example.com/"); | 11064 requests[0].url = GURL("https://www.example.com/"); |
10713 requests[0].method = "GET"; | 11065 requests[0].method = "GET"; |
10714 requests[0].load_flags = net::LOAD_NORMAL; | 11066 requests[0].load_flags = net::LOAD_NORMAL; |
10715 | 11067 |
10716 requests[1].url = GURL("http://www.example.com/"); | 11068 requests[1].url = GURL("http://www.example.com/"); |
10717 requests[1].method = "GET"; | 11069 requests[1].method = "GET"; |
10718 requests[1].load_flags = net::LOAD_NORMAL; | 11070 requests[1].load_flags = net::LOAD_NORMAL; |
10719 | 11071 |
10720 for (size_t i = 0; i < arraysize(requests); ++i) { | 11072 for (size_t i = 0; i < arraysize(requests); ++i) { |
10721 session_deps_.socket_factory->ResetNextMockIndexes(); | 11073 session_deps_.socket_factory->ResetNextMockIndexes(); |
10722 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 11074 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
10723 scoped_ptr<HttpNetworkTransaction> trans( | 11075 scoped_ptr<HttpNetworkTransaction> trans( |
10724 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 11076 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
10725 | 11077 |
10726 // Begin the SSL handshake with the proxy. | 11078 // Begin the SSL handshake with the proxy. |
10727 TestCompletionCallback callback; | 11079 TestCompletionCallback callback; |
10728 int rv = trans->Start( | 11080 int rv = |
10729 &requests[i], callback.callback(), net::BoundNetLog()); | 11081 trans->Start(&requests[i], callback.callback(), net::BoundNetLog()); |
10730 ASSERT_EQ(net::ERR_IO_PENDING, rv); | 11082 ASSERT_EQ(net::ERR_IO_PENDING, rv); |
10731 | 11083 |
10732 // Complete the SSL handshake, which should abort due to requiring a | 11084 // Complete the SSL handshake, which should abort due to requiring a |
10733 // client certificate. | 11085 // client certificate. |
10734 rv = callback.WaitForResult(); | 11086 rv = callback.WaitForResult(); |
10735 ASSERT_EQ(net::ERR_SSL_CLIENT_AUTH_CERT_NEEDED, rv); | 11087 ASSERT_EQ(net::ERR_SSL_CLIENT_AUTH_CERT_NEEDED, rv); |
10736 | 11088 |
10737 // Indicate that no certificate should be supplied. From the perspective | 11089 // Indicate that no certificate should be supplied. From the perspective |
10738 // of SSLClientCertCache, NULL is just as meaningful as a real | 11090 // of SSLClientCertCache, NULL is just as meaningful as a real |
10739 // certificate, so this is the same as supply a | 11091 // certificate, so this is the same as supply a |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10795 | 11147 |
10796 SSLSocketDataProvider ssl(ASYNC, OK); | 11148 SSLSocketDataProvider ssl(ASYNC, OK); |
10797 ssl.SetNextProto(GetParam()); | 11149 ssl.SetNextProto(GetParam()); |
10798 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 11150 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
10799 | 11151 |
10800 scoped_ptr<SpdyFrame> host1_req( | 11152 scoped_ptr<SpdyFrame> host1_req( |
10801 spdy_util_.ConstructSpdyGet("https://www.google.com", false, 1, LOWEST)); | 11153 spdy_util_.ConstructSpdyGet("https://www.google.com", false, 1, LOWEST)); |
10802 scoped_ptr<SpdyFrame> host2_req( | 11154 scoped_ptr<SpdyFrame> host2_req( |
10803 spdy_util_.ConstructSpdyGet("https://www.gmail.com", false, 3, LOWEST)); | 11155 spdy_util_.ConstructSpdyGet("https://www.gmail.com", false, 3, LOWEST)); |
10804 MockWrite spdy_writes[] = { | 11156 MockWrite spdy_writes[] = { |
10805 CreateMockWrite(*host1_req, 1), | 11157 CreateMockWrite(*host1_req, 1), CreateMockWrite(*host2_req, 4), |
10806 CreateMockWrite(*host2_req, 4), | |
10807 }; | 11158 }; |
10808 scoped_ptr<SpdyFrame> host1_resp( | 11159 scoped_ptr<SpdyFrame> host1_resp( |
10809 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 11160 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
10810 scoped_ptr<SpdyFrame> host1_resp_body( | 11161 scoped_ptr<SpdyFrame> host1_resp_body( |
10811 spdy_util_.ConstructSpdyBodyFrame(1, true)); | 11162 spdy_util_.ConstructSpdyBodyFrame(1, true)); |
10812 scoped_ptr<SpdyFrame> host2_resp( | 11163 scoped_ptr<SpdyFrame> host2_resp( |
10813 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); | 11164 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); |
10814 scoped_ptr<SpdyFrame> host2_resp_body( | 11165 scoped_ptr<SpdyFrame> host2_resp_body( |
10815 spdy_util_.ConstructSpdyBodyFrame(3, true)); | 11166 spdy_util_.ConstructSpdyBodyFrame(3, true)); |
10816 MockRead spdy_reads[] = { | 11167 MockRead spdy_reads[] = { |
10817 CreateMockRead(*host1_resp, 2), | 11168 CreateMockRead(*host1_resp, 2), CreateMockRead(*host1_resp_body, 3), |
10818 CreateMockRead(*host1_resp_body, 3), | 11169 CreateMockRead(*host2_resp, 5), CreateMockRead(*host2_resp_body, 6), |
10819 CreateMockRead(*host2_resp, 5), | 11170 MockRead(ASYNC, 0, 7), |
10820 CreateMockRead(*host2_resp_body, 6), | |
10821 MockRead(ASYNC, 0, 7), | |
10822 }; | 11171 }; |
10823 | 11172 |
10824 IPAddressNumber ip; | 11173 IPAddressNumber ip; |
10825 ASSERT_TRUE(ParseIPLiteralToNumber("127.0.0.1", &ip)); | 11174 ASSERT_TRUE(ParseIPLiteralToNumber("127.0.0.1", &ip)); |
10826 IPEndPoint peer_addr = IPEndPoint(ip, 443); | 11175 IPEndPoint peer_addr = IPEndPoint(ip, 443); |
10827 MockConnect connect(ASYNC, OK, peer_addr); | 11176 MockConnect connect(ASYNC, OK, peer_addr); |
10828 OrderedSocketData spdy_data( | 11177 OrderedSocketData spdy_data(connect, |
10829 connect, | 11178 spdy_reads, |
10830 spdy_reads, arraysize(spdy_reads), | 11179 arraysize(spdy_reads), |
10831 spdy_writes, arraysize(spdy_writes)); | 11180 spdy_writes, |
| 11181 arraysize(spdy_writes)); |
10832 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); | 11182 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); |
10833 | 11183 |
10834 TestCompletionCallback callback; | 11184 TestCompletionCallback callback; |
10835 HttpRequestInfo request1; | 11185 HttpRequestInfo request1; |
10836 request1.method = "GET"; | 11186 request1.method = "GET"; |
10837 request1.url = GURL("https://www.google.com/"); | 11187 request1.url = GURL("https://www.google.com/"); |
10838 request1.load_flags = 0; | 11188 request1.load_flags = 0; |
10839 HttpNetworkTransaction trans1(DEFAULT_PRIORITY, session.get()); | 11189 HttpNetworkTransaction trans1(DEFAULT_PRIORITY, session.get()); |
10840 | 11190 |
10841 int rv = trans1.Start(&request1, callback.callback(), BoundNetLog()); | 11191 int rv = trans1.Start(&request1, callback.callback(), BoundNetLog()); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10898 | 11248 |
10899 SSLSocketDataProvider ssl(ASYNC, OK); | 11249 SSLSocketDataProvider ssl(ASYNC, OK); |
10900 ssl.SetNextProto(GetParam()); | 11250 ssl.SetNextProto(GetParam()); |
10901 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 11251 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
10902 | 11252 |
10903 scoped_ptr<SpdyFrame> host1_req( | 11253 scoped_ptr<SpdyFrame> host1_req( |
10904 spdy_util_.ConstructSpdyGet("https://www.google.com", false, 1, LOWEST)); | 11254 spdy_util_.ConstructSpdyGet("https://www.google.com", false, 1, LOWEST)); |
10905 scoped_ptr<SpdyFrame> host2_req( | 11255 scoped_ptr<SpdyFrame> host2_req( |
10906 spdy_util_.ConstructSpdyGet("https://www.gmail.com", false, 3, LOWEST)); | 11256 spdy_util_.ConstructSpdyGet("https://www.gmail.com", false, 3, LOWEST)); |
10907 MockWrite spdy_writes[] = { | 11257 MockWrite spdy_writes[] = { |
10908 CreateMockWrite(*host1_req, 1), | 11258 CreateMockWrite(*host1_req, 1), CreateMockWrite(*host2_req, 4), |
10909 CreateMockWrite(*host2_req, 4), | |
10910 }; | 11259 }; |
10911 scoped_ptr<SpdyFrame> host1_resp( | 11260 scoped_ptr<SpdyFrame> host1_resp( |
10912 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 11261 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
10913 scoped_ptr<SpdyFrame> host1_resp_body( | 11262 scoped_ptr<SpdyFrame> host1_resp_body( |
10914 spdy_util_.ConstructSpdyBodyFrame(1, true)); | 11263 spdy_util_.ConstructSpdyBodyFrame(1, true)); |
10915 scoped_ptr<SpdyFrame> host2_resp( | 11264 scoped_ptr<SpdyFrame> host2_resp( |
10916 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); | 11265 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); |
10917 scoped_ptr<SpdyFrame> host2_resp_body( | 11266 scoped_ptr<SpdyFrame> host2_resp_body( |
10918 spdy_util_.ConstructSpdyBodyFrame(3, true)); | 11267 spdy_util_.ConstructSpdyBodyFrame(3, true)); |
10919 MockRead spdy_reads[] = { | 11268 MockRead spdy_reads[] = { |
10920 CreateMockRead(*host1_resp, 2), | 11269 CreateMockRead(*host1_resp, 2), CreateMockRead(*host1_resp_body, 3), |
10921 CreateMockRead(*host1_resp_body, 3), | 11270 CreateMockRead(*host2_resp, 5), CreateMockRead(*host2_resp_body, 6), |
10922 CreateMockRead(*host2_resp, 5), | 11271 MockRead(ASYNC, 0, 7), |
10923 CreateMockRead(*host2_resp_body, 6), | |
10924 MockRead(ASYNC, 0, 7), | |
10925 }; | 11272 }; |
10926 | 11273 |
10927 IPAddressNumber ip; | 11274 IPAddressNumber ip; |
10928 ASSERT_TRUE(ParseIPLiteralToNumber("127.0.0.1", &ip)); | 11275 ASSERT_TRUE(ParseIPLiteralToNumber("127.0.0.1", &ip)); |
10929 IPEndPoint peer_addr = IPEndPoint(ip, 443); | 11276 IPEndPoint peer_addr = IPEndPoint(ip, 443); |
10930 MockConnect connect(ASYNC, OK, peer_addr); | 11277 MockConnect connect(ASYNC, OK, peer_addr); |
10931 OrderedSocketData spdy_data( | 11278 OrderedSocketData spdy_data(connect, |
10932 connect, | 11279 spdy_reads, |
10933 spdy_reads, arraysize(spdy_reads), | 11280 arraysize(spdy_reads), |
10934 spdy_writes, arraysize(spdy_writes)); | 11281 spdy_writes, |
| 11282 arraysize(spdy_writes)); |
10935 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); | 11283 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); |
10936 | 11284 |
10937 TestCompletionCallback callback; | 11285 TestCompletionCallback callback; |
10938 HttpRequestInfo request1; | 11286 HttpRequestInfo request1; |
10939 request1.method = "GET"; | 11287 request1.method = "GET"; |
10940 request1.url = GURL("https://www.google.com/"); | 11288 request1.url = GURL("https://www.google.com/"); |
10941 request1.load_flags = 0; | 11289 request1.load_flags = 0; |
10942 HttpNetworkTransaction trans1(DEFAULT_PRIORITY, session.get()); | 11290 HttpNetworkTransaction trans1(DEFAULT_PRIORITY, session.get()); |
10943 | 11291 |
10944 int rv = trans1.Start(&request1, callback.callback(), BoundNetLog()); | 11292 int rv = trans1.Start(&request1, callback.callback(), BoundNetLog()); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10999 int rv = host_resolver_.ResolveFromCache(info, addresses, net_log); | 11347 int rv = host_resolver_.ResolveFromCache(info, addresses, net_log); |
11000 if (rv == OK && info.host_port_pair().Equals(host_port_)) | 11348 if (rv == OK && info.host_port_pair().Equals(host_port_)) |
11001 host_resolver_.GetHostCache()->clear(); | 11349 host_resolver_.GetHostCache()->clear(); |
11002 return rv; | 11350 return rv; |
11003 } | 11351 } |
11004 | 11352 |
11005 virtual void CancelRequest(RequestHandle req) OVERRIDE { | 11353 virtual void CancelRequest(RequestHandle req) OVERRIDE { |
11006 host_resolver_.CancelRequest(req); | 11354 host_resolver_.CancelRequest(req); |
11007 } | 11355 } |
11008 | 11356 |
11009 MockCachingHostResolver* GetMockHostResolver() { | 11357 MockCachingHostResolver* GetMockHostResolver() { return &host_resolver_; } |
11010 return &host_resolver_; | |
11011 } | |
11012 | 11358 |
11013 private: | 11359 private: |
11014 MockCachingHostResolver host_resolver_; | 11360 MockCachingHostResolver host_resolver_; |
11015 const HostPortPair host_port_; | 11361 const HostPortPair host_port_; |
11016 }; | 11362 }; |
11017 | 11363 |
11018 // Times out on Win7 dbg(2) bot. http://crbug.com/124776 | 11364 // Times out on Win7 dbg(2) bot. http://crbug.com/124776 |
11019 #if defined(OS_WIN) | 11365 #if defined(OS_WIN) |
11020 #define MAYBE_UseIPConnectionPoolingWithHostCacheExpiration \ | 11366 #define MAYBE_UseIPConnectionPoolingWithHostCacheExpiration \ |
11021 DISABLED_UseIPConnectionPoolingWithHostCacheExpiration | 11367 DISABLED_UseIPConnectionPoolingWithHostCacheExpiration |
11022 #else | 11368 #else |
11023 #define MAYBE_UseIPConnectionPoolingWithHostCacheExpiration \ | 11369 #define MAYBE_UseIPConnectionPoolingWithHostCacheExpiration \ |
11024 UseIPConnectionPoolingWithHostCacheExpiration | 11370 UseIPConnectionPoolingWithHostCacheExpiration |
11025 #endif | 11371 #endif |
11026 WRAPPED_TEST_P(HttpNetworkTransactionTest, | 11372 WRAPPED_TEST_P(HttpNetworkTransactionTest, |
11027 MAYBE_UseIPConnectionPoolingWithHostCacheExpiration) { | 11373 MAYBE_UseIPConnectionPoolingWithHostCacheExpiration) { |
11028 // Times out on Win7 dbg(2) bot. http://crbug.com/124776 . (MAYBE_ | 11374 // Times out on Win7 dbg(2) bot. http://crbug.com/124776 . (MAYBE_ |
11029 // prefix doesn't work with parametrized tests). | 11375 // prefix doesn't work with parametrized tests). |
11030 #if defined(OS_WIN) | 11376 #if defined(OS_WIN) |
11031 return; | 11377 return; |
11032 #else | 11378 #else |
11033 HttpStreamFactory::set_use_alternate_protocols(true); | 11379 HttpStreamFactory::set_use_alternate_protocols(true); |
11034 HttpStreamFactory::SetNextProtos(SpdyNextProtos()); | 11380 HttpStreamFactory::SetNextProtos(SpdyNextProtos()); |
11035 | 11381 |
11036 // Set up a special HttpNetworkSession with a OneTimeCachingHostResolver. | 11382 // Set up a special HttpNetworkSession with a OneTimeCachingHostResolver. |
11037 OneTimeCachingHostResolver host_resolver(HostPortPair("www.gmail.com", 443)); | 11383 OneTimeCachingHostResolver host_resolver(HostPortPair("www.gmail.com", 443)); |
11038 HttpNetworkSession::Params params = | 11384 HttpNetworkSession::Params params = |
11039 SpdySessionDependencies::CreateSessionParams(&session_deps_); | 11385 SpdySessionDependencies::CreateSessionParams(&session_deps_); |
11040 params.host_resolver = &host_resolver; | 11386 params.host_resolver = &host_resolver; |
11041 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 11387 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
11042 SpdySessionPoolPeer pool_peer(session->spdy_session_pool()); | 11388 SpdySessionPoolPeer pool_peer(session->spdy_session_pool()); |
11043 pool_peer.DisableDomainAuthenticationVerification(); | 11389 pool_peer.DisableDomainAuthenticationVerification(); |
11044 | 11390 |
11045 SSLSocketDataProvider ssl(ASYNC, OK); | 11391 SSLSocketDataProvider ssl(ASYNC, OK); |
11046 ssl.SetNextProto(GetParam()); | 11392 ssl.SetNextProto(GetParam()); |
11047 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 11393 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
11048 | 11394 |
11049 scoped_ptr<SpdyFrame> host1_req( | 11395 scoped_ptr<SpdyFrame> host1_req( |
11050 spdy_util_.ConstructSpdyGet("https://www.google.com", false, 1, LOWEST)); | 11396 spdy_util_.ConstructSpdyGet("https://www.google.com", false, 1, LOWEST)); |
11051 scoped_ptr<SpdyFrame> host2_req( | 11397 scoped_ptr<SpdyFrame> host2_req( |
11052 spdy_util_.ConstructSpdyGet("https://www.gmail.com", false, 3, LOWEST)); | 11398 spdy_util_.ConstructSpdyGet("https://www.gmail.com", false, 3, LOWEST)); |
11053 MockWrite spdy_writes[] = { | 11399 MockWrite spdy_writes[] = { |
11054 CreateMockWrite(*host1_req, 1), | 11400 CreateMockWrite(*host1_req, 1), CreateMockWrite(*host2_req, 4), |
11055 CreateMockWrite(*host2_req, 4), | |
11056 }; | 11401 }; |
11057 scoped_ptr<SpdyFrame> host1_resp( | 11402 scoped_ptr<SpdyFrame> host1_resp( |
11058 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 11403 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
11059 scoped_ptr<SpdyFrame> host1_resp_body( | 11404 scoped_ptr<SpdyFrame> host1_resp_body( |
11060 spdy_util_.ConstructSpdyBodyFrame(1, true)); | 11405 spdy_util_.ConstructSpdyBodyFrame(1, true)); |
11061 scoped_ptr<SpdyFrame> host2_resp( | 11406 scoped_ptr<SpdyFrame> host2_resp( |
11062 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); | 11407 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); |
11063 scoped_ptr<SpdyFrame> host2_resp_body( | 11408 scoped_ptr<SpdyFrame> host2_resp_body( |
11064 spdy_util_.ConstructSpdyBodyFrame(3, true)); | 11409 spdy_util_.ConstructSpdyBodyFrame(3, true)); |
11065 MockRead spdy_reads[] = { | 11410 MockRead spdy_reads[] = { |
11066 CreateMockRead(*host1_resp, 2), | 11411 CreateMockRead(*host1_resp, 2), CreateMockRead(*host1_resp_body, 3), |
11067 CreateMockRead(*host1_resp_body, 3), | 11412 CreateMockRead(*host2_resp, 5), CreateMockRead(*host2_resp_body, 6), |
11068 CreateMockRead(*host2_resp, 5), | 11413 MockRead(ASYNC, 0, 7), |
11069 CreateMockRead(*host2_resp_body, 6), | |
11070 MockRead(ASYNC, 0, 7), | |
11071 }; | 11414 }; |
11072 | 11415 |
11073 IPAddressNumber ip; | 11416 IPAddressNumber ip; |
11074 ASSERT_TRUE(ParseIPLiteralToNumber("127.0.0.1", &ip)); | 11417 ASSERT_TRUE(ParseIPLiteralToNumber("127.0.0.1", &ip)); |
11075 IPEndPoint peer_addr = IPEndPoint(ip, 443); | 11418 IPEndPoint peer_addr = IPEndPoint(ip, 443); |
11076 MockConnect connect(ASYNC, OK, peer_addr); | 11419 MockConnect connect(ASYNC, OK, peer_addr); |
11077 OrderedSocketData spdy_data( | 11420 OrderedSocketData spdy_data(connect, |
11078 connect, | 11421 spdy_reads, |
11079 spdy_reads, arraysize(spdy_reads), | 11422 arraysize(spdy_reads), |
11080 spdy_writes, arraysize(spdy_writes)); | 11423 spdy_writes, |
| 11424 arraysize(spdy_writes)); |
11081 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); | 11425 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); |
11082 | 11426 |
11083 TestCompletionCallback callback; | 11427 TestCompletionCallback callback; |
11084 HttpRequestInfo request1; | 11428 HttpRequestInfo request1; |
11085 request1.method = "GET"; | 11429 request1.method = "GET"; |
11086 request1.url = GURL("https://www.google.com/"); | 11430 request1.url = GURL("https://www.google.com/"); |
11087 request1.load_flags = 0; | 11431 request1.load_flags = 0; |
11088 HttpNetworkTransaction trans1(DEFAULT_PRIORITY, session.get()); | 11432 HttpNetworkTransaction trans1(DEFAULT_PRIORITY, session.get()); |
11089 | 11433 |
11090 int rv = trans1.Start(&request1, callback.callback(), BoundNetLog()); | 11434 int rv = trans1.Start(&request1, callback.callback(), BoundNetLog()); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11130 EXPECT_TRUE(response->was_fetched_via_spdy); | 11474 EXPECT_TRUE(response->was_fetched_via_spdy); |
11131 EXPECT_TRUE(response->was_npn_negotiated); | 11475 EXPECT_TRUE(response->was_npn_negotiated); |
11132 ASSERT_EQ(OK, ReadTransaction(&trans2, &response_data)); | 11476 ASSERT_EQ(OK, ReadTransaction(&trans2, &response_data)); |
11133 EXPECT_EQ("hello!", response_data); | 11477 EXPECT_EQ("hello!", response_data); |
11134 #endif | 11478 #endif |
11135 } | 11479 } |
11136 #undef MAYBE_UseIPConnectionPoolingWithHostCacheExpiration | 11480 #undef MAYBE_UseIPConnectionPoolingWithHostCacheExpiration |
11137 | 11481 |
11138 TEST_P(HttpNetworkTransactionTest, ReadPipelineEvictionFallback) { | 11482 TEST_P(HttpNetworkTransactionTest, ReadPipelineEvictionFallback) { |
11139 MockRead data_reads1[] = { | 11483 MockRead data_reads1[] = { |
11140 MockRead(SYNCHRONOUS, ERR_PIPELINE_EVICTION), | 11484 MockRead(SYNCHRONOUS, ERR_PIPELINE_EVICTION), |
11141 }; | 11485 }; |
11142 MockRead data_reads2[] = { | 11486 MockRead data_reads2[] = { |
11143 MockRead("HTTP/1.0 200 OK\r\n\r\n"), | 11487 MockRead("HTTP/1.0 200 OK\r\n\r\n"), MockRead("hello world"), |
11144 MockRead("hello world"), | 11488 MockRead(SYNCHRONOUS, OK), |
11145 MockRead(SYNCHRONOUS, OK), | |
11146 }; | 11489 }; |
11147 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), NULL, 0); | 11490 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), NULL, 0); |
11148 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), NULL, 0); | 11491 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), NULL, 0); |
11149 StaticSocketDataProvider* data[] = { &data1, &data2 }; | 11492 StaticSocketDataProvider* data[] = {&data1, &data2}; |
11150 | 11493 |
11151 SimpleGetHelperResult out = SimpleGetHelperForData(data, arraysize(data)); | 11494 SimpleGetHelperResult out = SimpleGetHelperForData(data, arraysize(data)); |
11152 | 11495 |
11153 EXPECT_EQ(OK, out.rv); | 11496 EXPECT_EQ(OK, out.rv); |
11154 EXPECT_EQ("HTTP/1.0 200 OK", out.status_line); | 11497 EXPECT_EQ("HTTP/1.0 200 OK", out.status_line); |
11155 EXPECT_EQ("hello world", out.response_data); | 11498 EXPECT_EQ("hello world", out.response_data); |
11156 } | 11499 } |
11157 | 11500 |
11158 TEST_P(HttpNetworkTransactionTest, SendPipelineEvictionFallback) { | 11501 TEST_P(HttpNetworkTransactionTest, SendPipelineEvictionFallback) { |
11159 MockWrite data_writes1[] = { | 11502 MockWrite data_writes1[] = { |
11160 MockWrite(SYNCHRONOUS, ERR_PIPELINE_EVICTION), | 11503 MockWrite(SYNCHRONOUS, ERR_PIPELINE_EVICTION), |
11161 }; | 11504 }; |
11162 MockWrite data_writes2[] = { | 11505 MockWrite data_writes2[] = { |
11163 MockWrite("GET / HTTP/1.1\r\n" | 11506 MockWrite( |
11164 "Host: www.google.com\r\n" | 11507 "GET / HTTP/1.1\r\n" |
11165 "Connection: keep-alive\r\n\r\n"), | 11508 "Host: www.google.com\r\n" |
| 11509 "Connection: keep-alive\r\n\r\n"), |
11166 }; | 11510 }; |
11167 MockRead data_reads2[] = { | 11511 MockRead data_reads2[] = { |
11168 MockRead("HTTP/1.0 200 OK\r\n\r\n"), | 11512 MockRead("HTTP/1.0 200 OK\r\n\r\n"), MockRead("hello world"), |
11169 MockRead("hello world"), | 11513 MockRead(SYNCHRONOUS, OK), |
11170 MockRead(SYNCHRONOUS, OK), | |
11171 }; | 11514 }; |
11172 StaticSocketDataProvider data1(NULL, 0, | 11515 StaticSocketDataProvider data1( |
11173 data_writes1, arraysize(data_writes1)); | 11516 NULL, 0, data_writes1, arraysize(data_writes1)); |
11174 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), | 11517 StaticSocketDataProvider data2(data_reads2, |
11175 data_writes2, arraysize(data_writes2)); | 11518 arraysize(data_reads2), |
11176 StaticSocketDataProvider* data[] = { &data1, &data2 }; | 11519 data_writes2, |
| 11520 arraysize(data_writes2)); |
| 11521 StaticSocketDataProvider* data[] = {&data1, &data2}; |
11177 | 11522 |
11178 SimpleGetHelperResult out = SimpleGetHelperForData(data, arraysize(data)); | 11523 SimpleGetHelperResult out = SimpleGetHelperForData(data, arraysize(data)); |
11179 | 11524 |
11180 EXPECT_EQ(OK, out.rv); | 11525 EXPECT_EQ(OK, out.rv); |
11181 EXPECT_EQ("HTTP/1.0 200 OK", out.status_line); | 11526 EXPECT_EQ("HTTP/1.0 200 OK", out.status_line); |
11182 EXPECT_EQ("hello world", out.response_data); | 11527 EXPECT_EQ("hello world", out.response_data); |
11183 } | 11528 } |
11184 | 11529 |
11185 TEST_P(HttpNetworkTransactionTest, DoNotUseSpdySessionForHttp) { | 11530 TEST_P(HttpNetworkTransactionTest, DoNotUseSpdySessionForHttp) { |
11186 const std::string https_url = "https://www.google.com/"; | 11531 const std::string https_url = "https://www.google.com/"; |
11187 const std::string http_url = "http://www.google.com:443/"; | 11532 const std::string http_url = "http://www.google.com:443/"; |
11188 | 11533 |
11189 // SPDY GET for HTTPS URL | 11534 // SPDY GET for HTTPS URL |
11190 scoped_ptr<SpdyFrame> req1( | 11535 scoped_ptr<SpdyFrame> req1( |
11191 spdy_util_.ConstructSpdyGet(https_url.c_str(), false, 1, LOWEST)); | 11536 spdy_util_.ConstructSpdyGet(https_url.c_str(), false, 1, LOWEST)); |
11192 | 11537 |
11193 MockWrite writes1[] = { | 11538 MockWrite writes1[] = { |
11194 CreateMockWrite(*req1, 0), | 11539 CreateMockWrite(*req1, 0), |
11195 }; | 11540 }; |
11196 | 11541 |
11197 scoped_ptr<SpdyFrame> resp1(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 11542 scoped_ptr<SpdyFrame> resp1(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
11198 scoped_ptr<SpdyFrame> body1(spdy_util_.ConstructSpdyBodyFrame(1, true)); | 11543 scoped_ptr<SpdyFrame> body1(spdy_util_.ConstructSpdyBodyFrame(1, true)); |
11199 MockRead reads1[] = { | 11544 MockRead reads1[] = {CreateMockRead(*resp1, 1), CreateMockRead(*body1, 2), |
11200 CreateMockRead(*resp1, 1), | 11545 MockRead(ASYNC, ERR_IO_PENDING, 3)}; |
11201 CreateMockRead(*body1, 2), | |
11202 MockRead(ASYNC, ERR_IO_PENDING, 3) | |
11203 }; | |
11204 | 11546 |
11205 DelayedSocketData data1( | 11547 DelayedSocketData data1( |
11206 1, reads1, arraysize(reads1), | 11548 1, reads1, arraysize(reads1), writes1, arraysize(writes1)); |
11207 writes1, arraysize(writes1)); | |
11208 MockConnect connect_data1(ASYNC, OK); | 11549 MockConnect connect_data1(ASYNC, OK); |
11209 data1.set_connect_data(connect_data1); | 11550 data1.set_connect_data(connect_data1); |
11210 | 11551 |
11211 // HTTP GET for the HTTP URL | 11552 // HTTP GET for the HTTP URL |
11212 MockWrite writes2[] = { | 11553 MockWrite writes2[] = { |
11213 MockWrite(ASYNC, 4, | 11554 MockWrite(ASYNC, |
11214 "GET / HTTP/1.1\r\n" | 11555 4, |
11215 "Host: www.google.com:443\r\n" | 11556 "GET / HTTP/1.1\r\n" |
11216 "Connection: keep-alive\r\n\r\n"), | 11557 "Host: www.google.com:443\r\n" |
| 11558 "Connection: keep-alive\r\n\r\n"), |
11217 }; | 11559 }; |
11218 | 11560 |
11219 MockRead reads2[] = { | 11561 MockRead reads2[] = { |
11220 MockRead(ASYNC, 5, "HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\n"), | 11562 MockRead(ASYNC, 5, "HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\n"), |
11221 MockRead(ASYNC, 6, "hello"), | 11563 MockRead(ASYNC, 6, "hello"), MockRead(ASYNC, 7, OK), |
11222 MockRead(ASYNC, 7, OK), | |
11223 }; | 11564 }; |
11224 | 11565 |
11225 DelayedSocketData data2( | 11566 DelayedSocketData data2( |
11226 1, reads2, arraysize(reads2), | 11567 1, reads2, arraysize(reads2), writes2, arraysize(writes2)); |
11227 writes2, arraysize(writes2)); | |
11228 | 11568 |
11229 SSLSocketDataProvider ssl(ASYNC, OK); | 11569 SSLSocketDataProvider ssl(ASYNC, OK); |
11230 ssl.SetNextProto(GetParam()); | 11570 ssl.SetNextProto(GetParam()); |
11231 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 11571 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
11232 session_deps_.socket_factory->AddSocketDataProvider(&data1); | 11572 session_deps_.socket_factory->AddSocketDataProvider(&data1); |
11233 session_deps_.socket_factory->AddSocketDataProvider(&data2); | 11573 session_deps_.socket_factory->AddSocketDataProvider(&data2); |
11234 | 11574 |
11235 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 11575 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
11236 | 11576 |
11237 // Start the first transaction to set up the SpdySession | 11577 // Start the first transaction to set up the SpdySession |
(...skipping 23 matching lines...) Expand all Loading... |
11261 | 11601 |
11262 EXPECT_EQ(OK, callback2.WaitForResult()); | 11602 EXPECT_EQ(OK, callback2.WaitForResult()); |
11263 EXPECT_FALSE(trans2.GetResponseInfo()->was_fetched_via_spdy); | 11603 EXPECT_FALSE(trans2.GetResponseInfo()->was_fetched_via_spdy); |
11264 } | 11604 } |
11265 | 11605 |
11266 TEST_P(HttpNetworkTransactionTest, DoNotUseSpdySessionForHttpOverTunnel) { | 11606 TEST_P(HttpNetworkTransactionTest, DoNotUseSpdySessionForHttpOverTunnel) { |
11267 const std::string https_url = "https://www.google.com/"; | 11607 const std::string https_url = "https://www.google.com/"; |
11268 const std::string http_url = "http://www.google.com:443/"; | 11608 const std::string http_url = "http://www.google.com:443/"; |
11269 | 11609 |
11270 // SPDY GET for HTTPS URL (through CONNECT tunnel) | 11610 // SPDY GET for HTTPS URL (through CONNECT tunnel) |
11271 scoped_ptr<SpdyFrame> connect(spdy_util_.ConstructSpdyConnect(NULL, 0, 1, | 11611 scoped_ptr<SpdyFrame> connect( |
11272 LOWEST)); | 11612 spdy_util_.ConstructSpdyConnect(NULL, 0, 1, LOWEST)); |
11273 scoped_ptr<SpdyFrame> req1( | 11613 scoped_ptr<SpdyFrame> req1( |
11274 spdy_util_.ConstructSpdyGet(https_url.c_str(), false, 1, LOWEST)); | 11614 spdy_util_.ConstructSpdyGet(https_url.c_str(), false, 1, LOWEST)); |
11275 scoped_ptr<SpdyFrame> wrapped_req1( | 11615 scoped_ptr<SpdyFrame> wrapped_req1( |
11276 spdy_util_.ConstructWrappedSpdyFrame(req1, 1)); | 11616 spdy_util_.ConstructWrappedSpdyFrame(req1, 1)); |
11277 | 11617 |
11278 // SPDY GET for HTTP URL (through the proxy, but not the tunnel). | 11618 // SPDY GET for HTTP URL (through the proxy, but not the tunnel). |
11279 SpdySynStreamIR req2_ir(3); | 11619 SpdySynStreamIR req2_ir(3); |
11280 spdy_util_.SetPriority(MEDIUM, &req2_ir); | 11620 spdy_util_.SetPriority(MEDIUM, &req2_ir); |
11281 req2_ir.set_fin(true); | 11621 req2_ir.set_fin(true); |
11282 req2_ir.SetHeader(spdy_util_.GetMethodKey(), "GET"); | 11622 req2_ir.SetHeader(spdy_util_.GetMethodKey(), "GET"); |
11283 req2_ir.SetHeader(spdy_util_.GetPathKey(), | 11623 req2_ir.SetHeader(spdy_util_.GetPathKey(), |
11284 spdy_util_.is_spdy2() ? http_url.c_str() : "/"); | 11624 spdy_util_.is_spdy2() ? http_url.c_str() : "/"); |
11285 req2_ir.SetHeader(spdy_util_.GetHostKey(), "www.google.com:443"); | 11625 req2_ir.SetHeader(spdy_util_.GetHostKey(), "www.google.com:443"); |
11286 req2_ir.SetHeader(spdy_util_.GetSchemeKey(), "http"); | 11626 req2_ir.SetHeader(spdy_util_.GetSchemeKey(), "http"); |
11287 spdy_util_.MaybeAddVersionHeader(&req2_ir); | 11627 spdy_util_.MaybeAddVersionHeader(&req2_ir); |
11288 scoped_ptr<SpdyFrame> req2( | 11628 scoped_ptr<SpdyFrame> req2( |
11289 spdy_util_.CreateFramer(false)->SerializeFrame(req2_ir)); | 11629 spdy_util_.CreateFramer(false)->SerializeFrame(req2_ir)); |
11290 | 11630 |
11291 MockWrite writes1[] = { | 11631 MockWrite writes1[] = { |
11292 CreateMockWrite(*connect, 0), | 11632 CreateMockWrite(*connect, 0), CreateMockWrite(*wrapped_req1, 2), |
11293 CreateMockWrite(*wrapped_req1, 2), | 11633 CreateMockWrite(*req2, 5), |
11294 CreateMockWrite(*req2, 5), | |
11295 }; | 11634 }; |
11296 | 11635 |
11297 scoped_ptr<SpdyFrame> conn_resp( | 11636 scoped_ptr<SpdyFrame> conn_resp( |
11298 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 11637 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
11299 scoped_ptr<SpdyFrame> resp1(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 11638 scoped_ptr<SpdyFrame> resp1(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
11300 scoped_ptr<SpdyFrame> body1(spdy_util_.ConstructSpdyBodyFrame(1, true)); | 11639 scoped_ptr<SpdyFrame> body1(spdy_util_.ConstructSpdyBodyFrame(1, true)); |
11301 scoped_ptr<SpdyFrame> wrapped_resp1( | 11640 scoped_ptr<SpdyFrame> wrapped_resp1( |
11302 spdy_util_.ConstructWrappedSpdyFrame(resp1, 1)); | 11641 spdy_util_.ConstructWrappedSpdyFrame(resp1, 1)); |
11303 scoped_ptr<SpdyFrame> wrapped_body1( | 11642 scoped_ptr<SpdyFrame> wrapped_body1( |
11304 spdy_util_.ConstructWrappedSpdyFrame(body1, 1)); | 11643 spdy_util_.ConstructWrappedSpdyFrame(body1, 1)); |
11305 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); | 11644 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); |
11306 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(3, true)); | 11645 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(3, true)); |
11307 MockRead reads1[] = { | 11646 MockRead reads1[] = { |
11308 CreateMockRead(*conn_resp, 1), | 11647 CreateMockRead(*conn_resp, 1), CreateMockRead(*wrapped_resp1, 3), |
11309 CreateMockRead(*wrapped_resp1, 3), | 11648 CreateMockRead(*wrapped_body1, 4), CreateMockRead(*resp2, 6), |
11310 CreateMockRead(*wrapped_body1, 4), | 11649 CreateMockRead(*body2, 7), MockRead(ASYNC, ERR_IO_PENDING, 8)}; |
11311 CreateMockRead(*resp2, 6), | |
11312 CreateMockRead(*body2, 7), | |
11313 MockRead(ASYNC, ERR_IO_PENDING, 8) | |
11314 }; | |
11315 | 11650 |
11316 DeterministicSocketData data1(reads1, arraysize(reads1), | 11651 DeterministicSocketData data1( |
11317 writes1, arraysize(writes1)); | 11652 reads1, arraysize(reads1), writes1, arraysize(writes1)); |
11318 MockConnect connect_data1(ASYNC, OK); | 11653 MockConnect connect_data1(ASYNC, OK); |
11319 data1.set_connect_data(connect_data1); | 11654 data1.set_connect_data(connect_data1); |
11320 | 11655 |
11321 session_deps_.proxy_service.reset( | 11656 session_deps_.proxy_service.reset( |
11322 ProxyService::CreateFixedFromPacResult("HTTPS proxy:70")); | 11657 ProxyService::CreateFixedFromPacResult("HTTPS proxy:70")); |
11323 CapturingNetLog log; | 11658 CapturingNetLog log; |
11324 session_deps_.net_log = &log; | 11659 session_deps_.net_log = &log; |
11325 SSLSocketDataProvider ssl1(ASYNC, OK); // to the proxy | 11660 SSLSocketDataProvider ssl1(ASYNC, OK); // to the proxy |
11326 ssl1.SetNextProto(GetParam()); | 11661 ssl1.SetNextProto(GetParam()); |
11327 session_deps_.deterministic_socket_factory->AddSSLSocketDataProvider(&ssl1); | 11662 session_deps_.deterministic_socket_factory->AddSSLSocketDataProvider(&ssl1); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11383 const std::string http_url = "http://www.google.com:443/"; | 11718 const std::string http_url = "http://www.google.com:443/"; |
11384 | 11719 |
11385 // SPDY GET for HTTPS URL | 11720 // SPDY GET for HTTPS URL |
11386 scoped_ptr<SpdyFrame> req1( | 11721 scoped_ptr<SpdyFrame> req1( |
11387 spdy_util_.ConstructSpdyGet(https_url.c_str(), false, 1, LOWEST)); | 11722 spdy_util_.ConstructSpdyGet(https_url.c_str(), false, 1, LOWEST)); |
11388 // SPDY GET for the HTTP URL | 11723 // SPDY GET for the HTTP URL |
11389 scoped_ptr<SpdyFrame> req2( | 11724 scoped_ptr<SpdyFrame> req2( |
11390 spdy_util_.ConstructSpdyGet(http_url.c_str(), false, 3, MEDIUM)); | 11725 spdy_util_.ConstructSpdyGet(http_url.c_str(), false, 3, MEDIUM)); |
11391 | 11726 |
11392 MockWrite writes[] = { | 11727 MockWrite writes[] = { |
11393 CreateMockWrite(*req1, 1), | 11728 CreateMockWrite(*req1, 1), CreateMockWrite(*req2, 4), |
11394 CreateMockWrite(*req2, 4), | |
11395 }; | 11729 }; |
11396 | 11730 |
11397 scoped_ptr<SpdyFrame> resp1(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 11731 scoped_ptr<SpdyFrame> resp1(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
11398 scoped_ptr<SpdyFrame> body1(spdy_util_.ConstructSpdyBodyFrame(1, true)); | 11732 scoped_ptr<SpdyFrame> body1(spdy_util_.ConstructSpdyBodyFrame(1, true)); |
11399 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); | 11733 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); |
11400 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(3, true)); | 11734 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(3, true)); |
11401 MockRead reads[] = { | 11735 MockRead reads[] = {CreateMockRead(*resp1, 2), CreateMockRead(*body1, 3), |
11402 CreateMockRead(*resp1, 2), | 11736 CreateMockRead(*resp2, 5), CreateMockRead(*body2, 6), |
11403 CreateMockRead(*body1, 3), | 11737 MockRead(ASYNC, ERR_IO_PENDING, 7)}; |
11404 CreateMockRead(*resp2, 5), | |
11405 CreateMockRead(*body2, 6), | |
11406 MockRead(ASYNC, ERR_IO_PENDING, 7) | |
11407 }; | |
11408 | 11738 |
11409 OrderedSocketData data(reads, arraysize(reads), | 11739 OrderedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
11410 writes, arraysize(writes)); | |
11411 | 11740 |
11412 SSLSocketDataProvider ssl(ASYNC, OK); | 11741 SSLSocketDataProvider ssl(ASYNC, OK); |
11413 ssl.SetNextProto(GetParam()); | 11742 ssl.SetNextProto(GetParam()); |
11414 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 11743 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
11415 session_deps_.socket_factory->AddSocketDataProvider(&data); | 11744 session_deps_.socket_factory->AddSocketDataProvider(&data); |
11416 | 11745 |
11417 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 11746 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
11418 | 11747 |
11419 // Start the first transaction to set up the SpdySession | 11748 // Start the first transaction to set up the SpdySession |
11420 HttpRequestInfo request1; | 11749 HttpRequestInfo request1; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11454 const std::string url2 = "https://mail.google.com/"; | 11783 const std::string url2 = "https://mail.google.com/"; |
11455 const std::string ip_addr = "1.2.3.4"; | 11784 const std::string ip_addr = "1.2.3.4"; |
11456 | 11785 |
11457 // SPDY GET for HTTP URL (through SPDY proxy) | 11786 // SPDY GET for HTTP URL (through SPDY proxy) |
11458 scoped_ptr<SpdyHeaderBlock> headers( | 11787 scoped_ptr<SpdyHeaderBlock> headers( |
11459 spdy_util_.ConstructGetHeaderBlockForProxy("http://www.google.com/")); | 11788 spdy_util_.ConstructGetHeaderBlockForProxy("http://www.google.com/")); |
11460 scoped_ptr<SpdyFrame> req1(spdy_util_.ConstructSpdyControlFrame( | 11789 scoped_ptr<SpdyFrame> req1(spdy_util_.ConstructSpdyControlFrame( |
11461 headers.Pass(), false, 1, LOWEST, SYN_STREAM, CONTROL_FLAG_FIN, 0)); | 11790 headers.Pass(), false, 1, LOWEST, SYN_STREAM, CONTROL_FLAG_FIN, 0)); |
11462 | 11791 |
11463 MockWrite writes1[] = { | 11792 MockWrite writes1[] = { |
11464 CreateMockWrite(*req1, 0), | 11793 CreateMockWrite(*req1, 0), |
11465 }; | 11794 }; |
11466 | 11795 |
11467 scoped_ptr<SpdyFrame> resp1(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 11796 scoped_ptr<SpdyFrame> resp1(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
11468 scoped_ptr<SpdyFrame> body1(spdy_util_.ConstructSpdyBodyFrame(1, true)); | 11797 scoped_ptr<SpdyFrame> body1(spdy_util_.ConstructSpdyBodyFrame(1, true)); |
11469 MockRead reads1[] = { | 11798 MockRead reads1[] = { |
11470 CreateMockRead(*resp1, 1), | 11799 CreateMockRead(*resp1, 1), CreateMockRead(*body1, 2), |
11471 CreateMockRead(*body1, 2), | 11800 MockRead(ASYNC, OK, 3) // EOF |
11472 MockRead(ASYNC, OK, 3) // EOF | |
11473 }; | 11801 }; |
11474 | 11802 |
11475 scoped_ptr<DeterministicSocketData> data1( | 11803 scoped_ptr<DeterministicSocketData> data1(new DeterministicSocketData( |
11476 new DeterministicSocketData(reads1, arraysize(reads1), | 11804 reads1, arraysize(reads1), writes1, arraysize(writes1))); |
11477 writes1, arraysize(writes1))); | |
11478 IPAddressNumber ip; | 11805 IPAddressNumber ip; |
11479 ASSERT_TRUE(ParseIPLiteralToNumber(ip_addr, &ip)); | 11806 ASSERT_TRUE(ParseIPLiteralToNumber(ip_addr, &ip)); |
11480 IPEndPoint peer_addr = IPEndPoint(ip, 443); | 11807 IPEndPoint peer_addr = IPEndPoint(ip, 443); |
11481 MockConnect connect_data1(ASYNC, OK, peer_addr); | 11808 MockConnect connect_data1(ASYNC, OK, peer_addr); |
11482 data1->set_connect_data(connect_data1); | 11809 data1->set_connect_data(connect_data1); |
11483 | 11810 |
11484 // SPDY GET for HTTPS URL (direct) | 11811 // SPDY GET for HTTPS URL (direct) |
11485 scoped_ptr<SpdyFrame> req2( | 11812 scoped_ptr<SpdyFrame> req2( |
11486 spdy_util_.ConstructSpdyGet(url2.c_str(), false, 1, MEDIUM)); | 11813 spdy_util_.ConstructSpdyGet(url2.c_str(), false, 1, MEDIUM)); |
11487 | 11814 |
11488 MockWrite writes2[] = { | 11815 MockWrite writes2[] = { |
11489 CreateMockWrite(*req2, 0), | 11816 CreateMockWrite(*req2, 0), |
11490 }; | 11817 }; |
11491 | 11818 |
11492 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 11819 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
11493 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(1, true)); | 11820 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(1, true)); |
11494 MockRead reads2[] = { | 11821 MockRead reads2[] = { |
11495 CreateMockRead(*resp2, 1), | 11822 CreateMockRead(*resp2, 1), CreateMockRead(*body2, 2), |
11496 CreateMockRead(*body2, 2), | 11823 MockRead(ASYNC, OK, 3) // EOF |
11497 MockRead(ASYNC, OK, 3) // EOF | |
11498 }; | 11824 }; |
11499 | 11825 |
11500 scoped_ptr<DeterministicSocketData> data2( | 11826 scoped_ptr<DeterministicSocketData> data2(new DeterministicSocketData( |
11501 new DeterministicSocketData(reads2, arraysize(reads2), | 11827 reads2, arraysize(reads2), writes2, arraysize(writes2))); |
11502 writes2, arraysize(writes2))); | |
11503 MockConnect connect_data2(ASYNC, OK); | 11828 MockConnect connect_data2(ASYNC, OK); |
11504 data2->set_connect_data(connect_data2); | 11829 data2->set_connect_data(connect_data2); |
11505 | 11830 |
11506 // Set up a proxy config that sends HTTP requests to a proxy, and | 11831 // Set up a proxy config that sends HTTP requests to a proxy, and |
11507 // all others direct. | 11832 // all others direct. |
11508 ProxyConfig proxy_config; | 11833 ProxyConfig proxy_config; |
11509 proxy_config.proxy_rules().ParseFromString("http=https://proxy:443"); | 11834 proxy_config.proxy_rules().ParseFromString("http=https://proxy:443"); |
11510 CapturingProxyResolver* capturing_proxy_resolver = | 11835 CapturingProxyResolver* capturing_proxy_resolver = |
11511 new CapturingProxyResolver(); | 11836 new CapturingProxyResolver(); |
11512 session_deps_.proxy_service.reset(new ProxyService( | 11837 session_deps_.proxy_service.reset( |
11513 new ProxyConfigServiceFixed(proxy_config), capturing_proxy_resolver, | 11838 new ProxyService(new ProxyConfigServiceFixed(proxy_config), |
11514 NULL)); | 11839 capturing_proxy_resolver, |
| 11840 NULL)); |
11515 | 11841 |
11516 // Load a valid cert. Note, that this does not need to | 11842 // Load a valid cert. Note, that this does not need to |
11517 // be valid for proxy because the MockSSLClientSocket does | 11843 // be valid for proxy because the MockSSLClientSocket does |
11518 // not actually verify it. But SpdySession will use this | 11844 // not actually verify it. But SpdySession will use this |
11519 // to see if it is valid for the new origin | 11845 // to see if it is valid for the new origin |
11520 base::FilePath certs_dir = GetTestCertsDirectory(); | 11846 base::FilePath certs_dir = GetTestCertsDirectory(); |
11521 scoped_refptr<X509Certificate> server_cert( | 11847 scoped_refptr<X509Certificate> server_cert( |
11522 ImportCertFromFile(certs_dir, "ok_cert.pem")); | 11848 ImportCertFromFile(certs_dir, "ok_cert.pem")); |
11523 ASSERT_NE(static_cast<X509Certificate*>(NULL), server_cert); | 11849 ASSERT_NE(static_cast<X509Certificate*>(NULL), server_cert); |
11524 | 11850 |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11574 EXPECT_TRUE(trans2.GetResponseInfo()->was_fetched_via_spdy); | 11900 EXPECT_TRUE(trans2.GetResponseInfo()->was_fetched_via_spdy); |
11575 } | 11901 } |
11576 | 11902 |
11577 // Test to verify that a failed socket read (due to an ERR_CONNECTION_CLOSED | 11903 // Test to verify that a failed socket read (due to an ERR_CONNECTION_CLOSED |
11578 // error) in SPDY session, removes the socket from pool and closes the SPDY | 11904 // error) in SPDY session, removes the socket from pool and closes the SPDY |
11579 // session. Verify that new url's from the same HttpNetworkSession (and a new | 11905 // session. Verify that new url's from the same HttpNetworkSession (and a new |
11580 // SpdySession) do work. http://crbug.com/224701 | 11906 // SpdySession) do work. http://crbug.com/224701 |
11581 TEST_P(HttpNetworkTransactionTest, ErrorSocketNotConnected) { | 11907 TEST_P(HttpNetworkTransactionTest, ErrorSocketNotConnected) { |
11582 const std::string https_url = "https://www.google.com/"; | 11908 const std::string https_url = "https://www.google.com/"; |
11583 | 11909 |
11584 MockRead reads1[] = { | 11910 MockRead reads1[] = {MockRead(SYNCHRONOUS, ERR_CONNECTION_CLOSED, 0)}; |
11585 MockRead(SYNCHRONOUS, ERR_CONNECTION_CLOSED, 0) | |
11586 }; | |
11587 | 11911 |
11588 scoped_ptr<DeterministicSocketData> data1( | 11912 scoped_ptr<DeterministicSocketData> data1( |
11589 new DeterministicSocketData(reads1, arraysize(reads1), NULL, 0)); | 11913 new DeterministicSocketData(reads1, arraysize(reads1), NULL, 0)); |
11590 data1->SetStop(1); | 11914 data1->SetStop(1); |
11591 | 11915 |
11592 scoped_ptr<SpdyFrame> req2( | 11916 scoped_ptr<SpdyFrame> req2( |
11593 spdy_util_.ConstructSpdyGet(https_url.c_str(), false, 1, MEDIUM)); | 11917 spdy_util_.ConstructSpdyGet(https_url.c_str(), false, 1, MEDIUM)); |
11594 MockWrite writes2[] = { | 11918 MockWrite writes2[] = { |
11595 CreateMockWrite(*req2, 0), | 11919 CreateMockWrite(*req2, 0), |
11596 }; | 11920 }; |
11597 | 11921 |
11598 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 11922 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
11599 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(1, true)); | 11923 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(1, true)); |
11600 MockRead reads2[] = { | 11924 MockRead reads2[] = { |
11601 CreateMockRead(*resp2, 1), | 11925 CreateMockRead(*resp2, 1), CreateMockRead(*body2, 2), |
11602 CreateMockRead(*body2, 2), | 11926 MockRead(ASYNC, OK, 3) // EOF |
11603 MockRead(ASYNC, OK, 3) // EOF | |
11604 }; | 11927 }; |
11605 | 11928 |
11606 scoped_ptr<DeterministicSocketData> data2( | 11929 scoped_ptr<DeterministicSocketData> data2(new DeterministicSocketData( |
11607 new DeterministicSocketData(reads2, arraysize(reads2), | 11930 reads2, arraysize(reads2), writes2, arraysize(writes2))); |
11608 writes2, arraysize(writes2))); | |
11609 | 11931 |
11610 SSLSocketDataProvider ssl1(ASYNC, OK); | 11932 SSLSocketDataProvider ssl1(ASYNC, OK); |
11611 ssl1.SetNextProto(GetParam()); | 11933 ssl1.SetNextProto(GetParam()); |
11612 session_deps_.deterministic_socket_factory->AddSSLSocketDataProvider(&ssl1); | 11934 session_deps_.deterministic_socket_factory->AddSSLSocketDataProvider(&ssl1); |
11613 session_deps_.deterministic_socket_factory->AddSocketDataProvider( | 11935 session_deps_.deterministic_socket_factory->AddSocketDataProvider( |
11614 data1.get()); | 11936 data1.get()); |
11615 | 11937 |
11616 SSLSocketDataProvider ssl2(ASYNC, OK); | 11938 SSLSocketDataProvider ssl2(ASYNC, OK); |
11617 ssl2.SetNextProto(GetParam()); | 11939 ssl2.SetNextProto(GetParam()); |
11618 session_deps_.deterministic_socket_factory->AddSSLSocketDataProvider(&ssl2); | 11940 session_deps_.deterministic_socket_factory->AddSSLSocketDataProvider(&ssl2); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11667 SSLSocketDataProvider ssl1(ASYNC, OK); | 11989 SSLSocketDataProvider ssl1(ASYNC, OK); |
11668 ssl1.SetNextProto(GetParam()); | 11990 ssl1.SetNextProto(GetParam()); |
11669 SSLSocketDataProvider ssl2(ASYNC, OK); | 11991 SSLSocketDataProvider ssl2(ASYNC, OK); |
11670 ssl2.SetNextProto(GetParam()); | 11992 ssl2.SetNextProto(GetParam()); |
11671 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl1); | 11993 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl1); |
11672 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl2); | 11994 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl2); |
11673 | 11995 |
11674 scoped_ptr<SpdyFrame> host1_req(spdy_util_.ConstructSpdyGet( | 11996 scoped_ptr<SpdyFrame> host1_req(spdy_util_.ConstructSpdyGet( |
11675 "https://www.a.com", false, 1, DEFAULT_PRIORITY)); | 11997 "https://www.a.com", false, 1, DEFAULT_PRIORITY)); |
11676 MockWrite spdy1_writes[] = { | 11998 MockWrite spdy1_writes[] = { |
11677 CreateMockWrite(*host1_req, 1), | 11999 CreateMockWrite(*host1_req, 1), |
11678 }; | 12000 }; |
11679 scoped_ptr<SpdyFrame> host1_resp( | 12001 scoped_ptr<SpdyFrame> host1_resp( |
11680 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 12002 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
11681 scoped_ptr<SpdyFrame> host1_resp_body( | 12003 scoped_ptr<SpdyFrame> host1_resp_body( |
11682 spdy_util_.ConstructSpdyBodyFrame(1, true)); | 12004 spdy_util_.ConstructSpdyBodyFrame(1, true)); |
11683 MockRead spdy1_reads[] = { | 12005 MockRead spdy1_reads[] = { |
11684 CreateMockRead(*host1_resp, 2), | 12006 CreateMockRead(*host1_resp, 2), CreateMockRead(*host1_resp_body, 3), |
11685 CreateMockRead(*host1_resp_body, 3), | 12007 MockRead(ASYNC, ERR_IO_PENDING, 4), |
11686 MockRead(ASYNC, ERR_IO_PENDING, 4), | |
11687 }; | 12008 }; |
11688 | 12009 |
11689 scoped_ptr<OrderedSocketData> spdy1_data( | 12010 scoped_ptr<OrderedSocketData> spdy1_data( |
11690 new OrderedSocketData( | 12011 new OrderedSocketData(spdy1_reads, |
11691 spdy1_reads, arraysize(spdy1_reads), | 12012 arraysize(spdy1_reads), |
11692 spdy1_writes, arraysize(spdy1_writes))); | 12013 spdy1_writes, |
| 12014 arraysize(spdy1_writes))); |
11693 session_deps_.socket_factory->AddSocketDataProvider(spdy1_data.get()); | 12015 session_deps_.socket_factory->AddSocketDataProvider(spdy1_data.get()); |
11694 | 12016 |
11695 scoped_ptr<SpdyFrame> host2_req(spdy_util_.ConstructSpdyGet( | 12017 scoped_ptr<SpdyFrame> host2_req(spdy_util_.ConstructSpdyGet( |
11696 "https://www.b.com", false, 1, DEFAULT_PRIORITY)); | 12018 "https://www.b.com", false, 1, DEFAULT_PRIORITY)); |
11697 MockWrite spdy2_writes[] = { | 12019 MockWrite spdy2_writes[] = { |
11698 CreateMockWrite(*host2_req, 1), | 12020 CreateMockWrite(*host2_req, 1), |
11699 }; | 12021 }; |
11700 scoped_ptr<SpdyFrame> host2_resp( | 12022 scoped_ptr<SpdyFrame> host2_resp( |
11701 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 12023 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
11702 scoped_ptr<SpdyFrame> host2_resp_body( | 12024 scoped_ptr<SpdyFrame> host2_resp_body( |
11703 spdy_util_.ConstructSpdyBodyFrame(1, true)); | 12025 spdy_util_.ConstructSpdyBodyFrame(1, true)); |
11704 MockRead spdy2_reads[] = { | 12026 MockRead spdy2_reads[] = { |
11705 CreateMockRead(*host2_resp, 2), | 12027 CreateMockRead(*host2_resp, 2), CreateMockRead(*host2_resp_body, 3), |
11706 CreateMockRead(*host2_resp_body, 3), | 12028 MockRead(ASYNC, ERR_IO_PENDING, 4), |
11707 MockRead(ASYNC, ERR_IO_PENDING, 4), | |
11708 }; | 12029 }; |
11709 | 12030 |
11710 scoped_ptr<OrderedSocketData> spdy2_data( | 12031 scoped_ptr<OrderedSocketData> spdy2_data( |
11711 new OrderedSocketData( | 12032 new OrderedSocketData(spdy2_reads, |
11712 spdy2_reads, arraysize(spdy2_reads), | 12033 arraysize(spdy2_reads), |
11713 spdy2_writes, arraysize(spdy2_writes))); | 12034 spdy2_writes, |
| 12035 arraysize(spdy2_writes))); |
11714 session_deps_.socket_factory->AddSocketDataProvider(spdy2_data.get()); | 12036 session_deps_.socket_factory->AddSocketDataProvider(spdy2_data.get()); |
11715 | 12037 |
11716 MockWrite http_write[] = { | 12038 MockWrite http_write[] = { |
11717 MockWrite("GET / HTTP/1.1\r\n" | 12039 MockWrite( |
11718 "Host: www.a.com\r\n" | 12040 "GET / HTTP/1.1\r\n" |
11719 "Connection: keep-alive\r\n\r\n"), | 12041 "Host: www.a.com\r\n" |
| 12042 "Connection: keep-alive\r\n\r\n"), |
11720 }; | 12043 }; |
11721 | 12044 |
11722 MockRead http_read[] = { | 12045 MockRead http_read[] = { |
11723 MockRead("HTTP/1.1 200 OK\r\n"), | 12046 MockRead("HTTP/1.1 200 OK\r\n"), |
11724 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), | 12047 MockRead("Content-Type: text/html; charset=iso-8859-1\r\n"), |
11725 MockRead("Content-Length: 6\r\n\r\n"), | 12048 MockRead("Content-Length: 6\r\n\r\n"), MockRead("hello!"), |
11726 MockRead("hello!"), | |
11727 }; | 12049 }; |
11728 StaticSocketDataProvider http_data(http_read, arraysize(http_read), | 12050 StaticSocketDataProvider http_data( |
11729 http_write, arraysize(http_write)); | 12051 http_read, arraysize(http_read), http_write, arraysize(http_write)); |
11730 session_deps_.socket_factory->AddSocketDataProvider(&http_data); | 12052 session_deps_.socket_factory->AddSocketDataProvider(&http_data); |
11731 | 12053 |
11732 HostPortPair host_port_pair_a("www.a.com", 443); | 12054 HostPortPair host_port_pair_a("www.a.com", 443); |
11733 SpdySessionKey spdy_session_key_a( | 12055 SpdySessionKey spdy_session_key_a( |
11734 host_port_pair_a, ProxyServer::Direct(), PRIVACY_MODE_DISABLED); | 12056 host_port_pair_a, ProxyServer::Direct(), PRIVACY_MODE_DISABLED); |
11735 EXPECT_FALSE( | 12057 EXPECT_FALSE( |
11736 HasSpdySession(session->spdy_session_pool(), spdy_session_key_a)); | 12058 HasSpdySession(session->spdy_session_pool(), spdy_session_key_a)); |
11737 | 12059 |
11738 TestCompletionCallback callback; | 12060 TestCompletionCallback callback; |
11739 HttpRequestInfo request1; | 12061 HttpRequestInfo request1; |
(...skipping 11 matching lines...) Expand all Loading... |
11751 ASSERT_TRUE(response != NULL); | 12073 ASSERT_TRUE(response != NULL); |
11752 ASSERT_TRUE(response->headers.get() != NULL); | 12074 ASSERT_TRUE(response->headers.get() != NULL); |
11753 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); | 12075 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
11754 EXPECT_TRUE(response->was_fetched_via_spdy); | 12076 EXPECT_TRUE(response->was_fetched_via_spdy); |
11755 EXPECT_TRUE(response->was_npn_negotiated); | 12077 EXPECT_TRUE(response->was_npn_negotiated); |
11756 | 12078 |
11757 std::string response_data; | 12079 std::string response_data; |
11758 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); | 12080 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); |
11759 EXPECT_EQ("hello!", response_data); | 12081 EXPECT_EQ("hello!", response_data); |
11760 trans.reset(); | 12082 trans.reset(); |
11761 EXPECT_TRUE( | 12083 EXPECT_TRUE(HasSpdySession(session->spdy_session_pool(), spdy_session_key_a)); |
11762 HasSpdySession(session->spdy_session_pool(), spdy_session_key_a)); | |
11763 | 12084 |
11764 HostPortPair host_port_pair_b("www.b.com", 443); | 12085 HostPortPair host_port_pair_b("www.b.com", 443); |
11765 SpdySessionKey spdy_session_key_b( | 12086 SpdySessionKey spdy_session_key_b( |
11766 host_port_pair_b, ProxyServer::Direct(), PRIVACY_MODE_DISABLED); | 12087 host_port_pair_b, ProxyServer::Direct(), PRIVACY_MODE_DISABLED); |
11767 EXPECT_FALSE( | 12088 EXPECT_FALSE( |
11768 HasSpdySession(session->spdy_session_pool(), spdy_session_key_b)); | 12089 HasSpdySession(session->spdy_session_pool(), spdy_session_key_b)); |
11769 HttpRequestInfo request2; | 12090 HttpRequestInfo request2; |
11770 request2.method = "GET"; | 12091 request2.method = "GET"; |
11771 request2.url = GURL("https://www.b.com/"); | 12092 request2.url = GURL("https://www.b.com/"); |
11772 request2.load_flags = 0; | 12093 request2.load_flags = 0; |
11773 trans.reset(new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 12094 trans.reset(new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
11774 | 12095 |
11775 rv = trans->Start(&request2, callback.callback(), BoundNetLog()); | 12096 rv = trans->Start(&request2, callback.callback(), BoundNetLog()); |
11776 EXPECT_EQ(ERR_IO_PENDING, rv); | 12097 EXPECT_EQ(ERR_IO_PENDING, rv); |
11777 EXPECT_EQ(OK, callback.WaitForResult()); | 12098 EXPECT_EQ(OK, callback.WaitForResult()); |
11778 | 12099 |
11779 response = trans->GetResponseInfo(); | 12100 response = trans->GetResponseInfo(); |
11780 ASSERT_TRUE(response != NULL); | 12101 ASSERT_TRUE(response != NULL); |
11781 ASSERT_TRUE(response->headers.get() != NULL); | 12102 ASSERT_TRUE(response->headers.get() != NULL); |
11782 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); | 12103 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
11783 EXPECT_TRUE(response->was_fetched_via_spdy); | 12104 EXPECT_TRUE(response->was_fetched_via_spdy); |
11784 EXPECT_TRUE(response->was_npn_negotiated); | 12105 EXPECT_TRUE(response->was_npn_negotiated); |
11785 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); | 12106 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); |
11786 EXPECT_EQ("hello!", response_data); | 12107 EXPECT_EQ("hello!", response_data); |
11787 EXPECT_FALSE( | 12108 EXPECT_FALSE( |
11788 HasSpdySession(session->spdy_session_pool(), spdy_session_key_a)); | 12109 HasSpdySession(session->spdy_session_pool(), spdy_session_key_a)); |
11789 EXPECT_TRUE( | 12110 EXPECT_TRUE(HasSpdySession(session->spdy_session_pool(), spdy_session_key_b)); |
11790 HasSpdySession(session->spdy_session_pool(), spdy_session_key_b)); | |
11791 | 12111 |
11792 HostPortPair host_port_pair_a1("www.a.com", 80); | 12112 HostPortPair host_port_pair_a1("www.a.com", 80); |
11793 SpdySessionKey spdy_session_key_a1( | 12113 SpdySessionKey spdy_session_key_a1( |
11794 host_port_pair_a1, ProxyServer::Direct(), PRIVACY_MODE_DISABLED); | 12114 host_port_pair_a1, ProxyServer::Direct(), PRIVACY_MODE_DISABLED); |
11795 EXPECT_FALSE( | 12115 EXPECT_FALSE( |
11796 HasSpdySession(session->spdy_session_pool(), spdy_session_key_a1)); | 12116 HasSpdySession(session->spdy_session_pool(), spdy_session_key_a1)); |
11797 HttpRequestInfo request3; | 12117 HttpRequestInfo request3; |
11798 request3.method = "GET"; | 12118 request3.method = "GET"; |
11799 request3.url = GURL("http://www.a.com/"); | 12119 request3.url = GURL("http://www.a.com/"); |
11800 request3.load_flags = 0; | 12120 request3.load_flags = 0; |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11882 HttpRequestInfo request; | 12202 HttpRequestInfo request; |
11883 request.method = "GET"; | 12203 request.method = "GET"; |
11884 request.url = GURL("http://www.google.com/"); | 12204 request.url = GURL("http://www.google.com/"); |
11885 request.load_flags = 0; | 12205 request.load_flags = 0; |
11886 | 12206 |
11887 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 12207 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
11888 scoped_ptr<HttpTransaction> trans( | 12208 scoped_ptr<HttpTransaction> trans( |
11889 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 12209 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
11890 | 12210 |
11891 MockWrite data_writes[] = { | 12211 MockWrite data_writes[] = { |
11892 MockWrite(SYNCHRONOUS, ERR_CONNECTION_RESET), | 12212 MockWrite(SYNCHRONOUS, ERR_CONNECTION_RESET), |
11893 }; | 12213 }; |
11894 MockRead data_reads[] = { | 12214 MockRead data_reads[] = { |
11895 MockRead(SYNCHRONOUS, ERR_UNEXPECTED), // Should not be reached. | 12215 MockRead(SYNCHRONOUS, ERR_UNEXPECTED), // Should not be reached. |
11896 }; | 12216 }; |
11897 | 12217 |
11898 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 12218 StaticSocketDataProvider data( |
11899 data_writes, arraysize(data_writes)); | 12219 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
11900 session_deps_.socket_factory->AddSocketDataProvider(&data); | 12220 session_deps_.socket_factory->AddSocketDataProvider(&data); |
11901 | 12221 |
11902 TestCompletionCallback callback; | 12222 TestCompletionCallback callback; |
11903 | 12223 |
11904 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 12224 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
11905 EXPECT_EQ(ERR_IO_PENDING, rv); | 12225 EXPECT_EQ(ERR_IO_PENDING, rv); |
11906 | 12226 |
11907 rv = callback.WaitForResult(); | 12227 rv = callback.WaitForResult(); |
11908 EXPECT_EQ(ERR_CONNECTION_RESET, rv); | 12228 EXPECT_EQ(ERR_CONNECTION_RESET, rv); |
11909 | 12229 |
11910 EXPECT_EQ(NULL, trans->GetResponseInfo()); | 12230 EXPECT_EQ(NULL, trans->GetResponseInfo()); |
11911 | 12231 |
11912 HttpRequestHeaders request_headers; | 12232 HttpRequestHeaders request_headers; |
11913 EXPECT_TRUE(trans->GetFullRequestHeaders(&request_headers)); | 12233 EXPECT_TRUE(trans->GetFullRequestHeaders(&request_headers)); |
11914 EXPECT_TRUE(request_headers.HasHeader("Host")); | 12234 EXPECT_TRUE(request_headers.HasHeader("Host")); |
11915 } | 12235 } |
11916 | 12236 |
11917 TEST_P(HttpNetworkTransactionTest, HttpAsyncWriteError) { | 12237 TEST_P(HttpNetworkTransactionTest, HttpAsyncWriteError) { |
11918 HttpRequestInfo request; | 12238 HttpRequestInfo request; |
11919 request.method = "GET"; | 12239 request.method = "GET"; |
11920 request.url = GURL("http://www.google.com/"); | 12240 request.url = GURL("http://www.google.com/"); |
11921 request.load_flags = 0; | 12241 request.load_flags = 0; |
11922 | 12242 |
11923 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 12243 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
11924 scoped_ptr<HttpTransaction> trans( | 12244 scoped_ptr<HttpTransaction> trans( |
11925 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 12245 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
11926 | 12246 |
11927 MockWrite data_writes[] = { | 12247 MockWrite data_writes[] = { |
11928 MockWrite(ASYNC, ERR_CONNECTION_RESET), | 12248 MockWrite(ASYNC, ERR_CONNECTION_RESET), |
11929 }; | 12249 }; |
11930 MockRead data_reads[] = { | 12250 MockRead data_reads[] = { |
11931 MockRead(SYNCHRONOUS, ERR_UNEXPECTED), // Should not be reached. | 12251 MockRead(SYNCHRONOUS, ERR_UNEXPECTED), // Should not be reached. |
11932 }; | 12252 }; |
11933 | 12253 |
11934 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 12254 StaticSocketDataProvider data( |
11935 data_writes, arraysize(data_writes)); | 12255 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
11936 session_deps_.socket_factory->AddSocketDataProvider(&data); | 12256 session_deps_.socket_factory->AddSocketDataProvider(&data); |
11937 | 12257 |
11938 TestCompletionCallback callback; | 12258 TestCompletionCallback callback; |
11939 | 12259 |
11940 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 12260 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
11941 EXPECT_EQ(ERR_IO_PENDING, rv); | 12261 EXPECT_EQ(ERR_IO_PENDING, rv); |
11942 | 12262 |
11943 rv = callback.WaitForResult(); | 12263 rv = callback.WaitForResult(); |
11944 EXPECT_EQ(ERR_CONNECTION_RESET, rv); | 12264 EXPECT_EQ(ERR_CONNECTION_RESET, rv); |
11945 | 12265 |
11946 EXPECT_EQ(NULL, trans->GetResponseInfo()); | 12266 EXPECT_EQ(NULL, trans->GetResponseInfo()); |
11947 | 12267 |
11948 HttpRequestHeaders request_headers; | 12268 HttpRequestHeaders request_headers; |
11949 EXPECT_TRUE(trans->GetFullRequestHeaders(&request_headers)); | 12269 EXPECT_TRUE(trans->GetFullRequestHeaders(&request_headers)); |
11950 EXPECT_TRUE(request_headers.HasHeader("Host")); | 12270 EXPECT_TRUE(request_headers.HasHeader("Host")); |
11951 } | 12271 } |
11952 | 12272 |
11953 TEST_P(HttpNetworkTransactionTest, HttpSyncReadError) { | 12273 TEST_P(HttpNetworkTransactionTest, HttpSyncReadError) { |
11954 HttpRequestInfo request; | 12274 HttpRequestInfo request; |
11955 request.method = "GET"; | 12275 request.method = "GET"; |
11956 request.url = GURL("http://www.google.com/"); | 12276 request.url = GURL("http://www.google.com/"); |
11957 request.load_flags = 0; | 12277 request.load_flags = 0; |
11958 | 12278 |
11959 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 12279 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
11960 scoped_ptr<HttpTransaction> trans( | 12280 scoped_ptr<HttpTransaction> trans( |
11961 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 12281 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
11962 | 12282 |
11963 MockWrite data_writes[] = { | 12283 MockWrite data_writes[] = { |
11964 MockWrite("GET / HTTP/1.1\r\n" | 12284 MockWrite( |
11965 "Host: www.google.com\r\n" | 12285 "GET / HTTP/1.1\r\n" |
11966 "Connection: keep-alive\r\n\r\n"), | 12286 "Host: www.google.com\r\n" |
| 12287 "Connection: keep-alive\r\n\r\n"), |
11967 }; | 12288 }; |
11968 MockRead data_reads[] = { | 12289 MockRead data_reads[] = { |
11969 MockRead(SYNCHRONOUS, ERR_CONNECTION_RESET), | 12290 MockRead(SYNCHRONOUS, ERR_CONNECTION_RESET), |
11970 }; | 12291 }; |
11971 | 12292 |
11972 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 12293 StaticSocketDataProvider data( |
11973 data_writes, arraysize(data_writes)); | 12294 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
11974 session_deps_.socket_factory->AddSocketDataProvider(&data); | 12295 session_deps_.socket_factory->AddSocketDataProvider(&data); |
11975 | 12296 |
11976 TestCompletionCallback callback; | 12297 TestCompletionCallback callback; |
11977 | 12298 |
11978 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 12299 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
11979 EXPECT_EQ(ERR_IO_PENDING, rv); | 12300 EXPECT_EQ(ERR_IO_PENDING, rv); |
11980 | 12301 |
11981 rv = callback.WaitForResult(); | 12302 rv = callback.WaitForResult(); |
11982 EXPECT_EQ(ERR_CONNECTION_RESET, rv); | 12303 EXPECT_EQ(ERR_CONNECTION_RESET, rv); |
11983 | 12304 |
11984 EXPECT_EQ(NULL, trans->GetResponseInfo()); | 12305 EXPECT_EQ(NULL, trans->GetResponseInfo()); |
11985 | 12306 |
11986 HttpRequestHeaders request_headers; | 12307 HttpRequestHeaders request_headers; |
11987 EXPECT_TRUE(trans->GetFullRequestHeaders(&request_headers)); | 12308 EXPECT_TRUE(trans->GetFullRequestHeaders(&request_headers)); |
11988 EXPECT_TRUE(request_headers.HasHeader("Host")); | 12309 EXPECT_TRUE(request_headers.HasHeader("Host")); |
11989 } | 12310 } |
11990 | 12311 |
11991 TEST_P(HttpNetworkTransactionTest, HttpAsyncReadError) { | 12312 TEST_P(HttpNetworkTransactionTest, HttpAsyncReadError) { |
11992 HttpRequestInfo request; | 12313 HttpRequestInfo request; |
11993 request.method = "GET"; | 12314 request.method = "GET"; |
11994 request.url = GURL("http://www.google.com/"); | 12315 request.url = GURL("http://www.google.com/"); |
11995 request.load_flags = 0; | 12316 request.load_flags = 0; |
11996 | 12317 |
11997 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 12318 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
11998 scoped_ptr<HttpTransaction> trans( | 12319 scoped_ptr<HttpTransaction> trans( |
11999 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 12320 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
12000 | 12321 |
12001 MockWrite data_writes[] = { | 12322 MockWrite data_writes[] = { |
12002 MockWrite("GET / HTTP/1.1\r\n" | 12323 MockWrite( |
12003 "Host: www.google.com\r\n" | 12324 "GET / HTTP/1.1\r\n" |
12004 "Connection: keep-alive\r\n\r\n"), | 12325 "Host: www.google.com\r\n" |
| 12326 "Connection: keep-alive\r\n\r\n"), |
12005 }; | 12327 }; |
12006 MockRead data_reads[] = { | 12328 MockRead data_reads[] = { |
12007 MockRead(ASYNC, ERR_CONNECTION_RESET), | 12329 MockRead(ASYNC, ERR_CONNECTION_RESET), |
12008 }; | 12330 }; |
12009 | 12331 |
12010 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 12332 StaticSocketDataProvider data( |
12011 data_writes, arraysize(data_writes)); | 12333 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
12012 session_deps_.socket_factory->AddSocketDataProvider(&data); | 12334 session_deps_.socket_factory->AddSocketDataProvider(&data); |
12013 | 12335 |
12014 TestCompletionCallback callback; | 12336 TestCompletionCallback callback; |
12015 | 12337 |
12016 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 12338 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
12017 EXPECT_EQ(ERR_IO_PENDING, rv); | 12339 EXPECT_EQ(ERR_IO_PENDING, rv); |
12018 | 12340 |
12019 rv = callback.WaitForResult(); | 12341 rv = callback.WaitForResult(); |
12020 EXPECT_EQ(ERR_CONNECTION_RESET, rv); | 12342 EXPECT_EQ(ERR_CONNECTION_RESET, rv); |
12021 | 12343 |
12022 EXPECT_EQ(NULL, trans->GetResponseInfo()); | 12344 EXPECT_EQ(NULL, trans->GetResponseInfo()); |
12023 | 12345 |
12024 HttpRequestHeaders request_headers; | 12346 HttpRequestHeaders request_headers; |
12025 EXPECT_TRUE(trans->GetFullRequestHeaders(&request_headers)); | 12347 EXPECT_TRUE(trans->GetFullRequestHeaders(&request_headers)); |
12026 EXPECT_TRUE(request_headers.HasHeader("Host")); | 12348 EXPECT_TRUE(request_headers.HasHeader("Host")); |
12027 } | 12349 } |
12028 | 12350 |
12029 TEST_P(HttpNetworkTransactionTest, GetFullRequestHeadersIncludesExtraHeader) { | 12351 TEST_P(HttpNetworkTransactionTest, GetFullRequestHeadersIncludesExtraHeader) { |
12030 HttpRequestInfo request; | 12352 HttpRequestInfo request; |
12031 request.method = "GET"; | 12353 request.method = "GET"; |
12032 request.url = GURL("http://www.google.com/"); | 12354 request.url = GURL("http://www.google.com/"); |
12033 request.load_flags = 0; | 12355 request.load_flags = 0; |
12034 request.extra_headers.SetHeader("X-Foo", "bar"); | 12356 request.extra_headers.SetHeader("X-Foo", "bar"); |
12035 | 12357 |
12036 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 12358 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
12037 scoped_ptr<HttpTransaction> trans( | 12359 scoped_ptr<HttpTransaction> trans( |
12038 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 12360 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
12039 | 12361 |
12040 MockWrite data_writes[] = { | 12362 MockWrite data_writes[] = { |
12041 MockWrite("GET / HTTP/1.1\r\n" | 12363 MockWrite( |
12042 "Host: www.google.com\r\n" | 12364 "GET / HTTP/1.1\r\n" |
12043 "Connection: keep-alive\r\n" | 12365 "Host: www.google.com\r\n" |
12044 "X-Foo: bar\r\n\r\n"), | 12366 "Connection: keep-alive\r\n" |
| 12367 "X-Foo: bar\r\n\r\n"), |
12045 }; | 12368 }; |
12046 MockRead data_reads[] = { | 12369 MockRead data_reads[] = { |
12047 MockRead("HTTP/1.1 200 OK\r\n" | 12370 MockRead( |
12048 "Content-Length: 5\r\n\r\n" | 12371 "HTTP/1.1 200 OK\r\n" |
12049 "hello"), | 12372 "Content-Length: 5\r\n\r\n" |
12050 MockRead(ASYNC, ERR_UNEXPECTED), | 12373 "hello"), |
| 12374 MockRead(ASYNC, ERR_UNEXPECTED), |
12051 }; | 12375 }; |
12052 | 12376 |
12053 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 12377 StaticSocketDataProvider data( |
12054 data_writes, arraysize(data_writes)); | 12378 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
12055 session_deps_.socket_factory->AddSocketDataProvider(&data); | 12379 session_deps_.socket_factory->AddSocketDataProvider(&data); |
12056 | 12380 |
12057 TestCompletionCallback callback; | 12381 TestCompletionCallback callback; |
12058 | 12382 |
12059 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 12383 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
12060 EXPECT_EQ(ERR_IO_PENDING, rv); | 12384 EXPECT_EQ(ERR_IO_PENDING, rv); |
12061 | 12385 |
12062 rv = callback.WaitForResult(); | 12386 rv = callback.WaitForResult(); |
12063 EXPECT_EQ(OK, rv); | 12387 EXPECT_EQ(OK, rv); |
12064 | 12388 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12097 virtual int ReadResponseHeaders(const CompletionCallback& callback) OVERRIDE { | 12421 virtual int ReadResponseHeaders(const CompletionCallback& callback) OVERRIDE { |
12098 ADD_FAILURE(); | 12422 ADD_FAILURE(); |
12099 return ERR_UNEXPECTED; | 12423 return ERR_UNEXPECTED; |
12100 } | 12424 } |
12101 | 12425 |
12102 virtual const HttpResponseInfo* GetResponseInfo() const OVERRIDE { | 12426 virtual const HttpResponseInfo* GetResponseInfo() const OVERRIDE { |
12103 ADD_FAILURE(); | 12427 ADD_FAILURE(); |
12104 return NULL; | 12428 return NULL; |
12105 } | 12429 } |
12106 | 12430 |
12107 virtual int ReadResponseBody(IOBuffer* buf, int buf_len, | 12431 virtual int ReadResponseBody(IOBuffer* buf, |
| 12432 int buf_len, |
12108 const CompletionCallback& callback) OVERRIDE { | 12433 const CompletionCallback& callback) OVERRIDE { |
12109 ADD_FAILURE(); | 12434 ADD_FAILURE(); |
12110 return ERR_UNEXPECTED; | 12435 return ERR_UNEXPECTED; |
12111 } | 12436 } |
12112 | 12437 |
12113 virtual void Close(bool not_reusable) OVERRIDE {} | 12438 virtual void Close(bool not_reusable) OVERRIDE {} |
12114 | 12439 |
12115 virtual bool IsResponseBodyComplete() const OVERRIDE { | 12440 virtual bool IsResponseBodyComplete() const OVERRIDE { |
12116 ADD_FAILURE(); | 12441 ADD_FAILURE(); |
12117 return false; | 12442 return false; |
12118 } | 12443 } |
12119 | 12444 |
12120 virtual bool CanFindEndOfResponse() const OVERRIDE { | 12445 virtual bool CanFindEndOfResponse() const OVERRIDE { return false; } |
12121 return false; | |
12122 } | |
12123 | 12446 |
12124 virtual bool IsConnectionReused() const OVERRIDE { | 12447 virtual bool IsConnectionReused() const OVERRIDE { |
12125 ADD_FAILURE(); | 12448 ADD_FAILURE(); |
12126 return false; | 12449 return false; |
12127 } | 12450 } |
12128 | 12451 |
12129 virtual void SetConnectionReused() OVERRIDE { | 12452 virtual void SetConnectionReused() OVERRIDE { ADD_FAILURE(); } |
12130 ADD_FAILURE(); | |
12131 } | |
12132 | 12453 |
12133 virtual bool IsConnectionReusable() const OVERRIDE { | 12454 virtual bool IsConnectionReusable() const OVERRIDE { |
12134 ADD_FAILURE(); | 12455 ADD_FAILURE(); |
12135 return false; | 12456 return false; |
12136 } | 12457 } |
12137 | 12458 |
12138 virtual int64 GetTotalReceivedBytes() const OVERRIDE { | 12459 virtual int64 GetTotalReceivedBytes() const OVERRIDE { |
12139 ADD_FAILURE(); | 12460 ADD_FAILURE(); |
12140 return 0; | 12461 return 0; |
12141 } | 12462 } |
12142 | 12463 |
12143 virtual bool GetLoadTimingInfo( | 12464 virtual bool GetLoadTimingInfo( |
12144 LoadTimingInfo* load_timing_info) const OVERRIDE { | 12465 LoadTimingInfo* load_timing_info) const OVERRIDE { |
12145 ADD_FAILURE(); | 12466 ADD_FAILURE(); |
12146 return false; | 12467 return false; |
12147 } | 12468 } |
12148 | 12469 |
12149 virtual void GetSSLInfo(SSLInfo* ssl_info) OVERRIDE { | 12470 virtual void GetSSLInfo(SSLInfo* ssl_info) OVERRIDE { ADD_FAILURE(); } |
12150 ADD_FAILURE(); | |
12151 } | |
12152 | 12471 |
12153 virtual void GetSSLCertRequestInfo( | 12472 virtual void GetSSLCertRequestInfo( |
12154 SSLCertRequestInfo* cert_request_info) OVERRIDE { | 12473 SSLCertRequestInfo* cert_request_info) OVERRIDE { |
12155 ADD_FAILURE(); | 12474 ADD_FAILURE(); |
12156 } | 12475 } |
12157 | 12476 |
12158 virtual bool IsSpdyHttpStream() const OVERRIDE { | 12477 virtual bool IsSpdyHttpStream() const OVERRIDE { |
12159 ADD_FAILURE(); | 12478 ADD_FAILURE(); |
12160 return false; | 12479 return false; |
12161 } | 12480 } |
12162 | 12481 |
12163 virtual void Drain(HttpNetworkSession* session) OVERRIDE { | 12482 virtual void Drain(HttpNetworkSession* session) OVERRIDE { ADD_FAILURE(); } |
12164 ADD_FAILURE(); | |
12165 } | |
12166 | 12483 |
12167 virtual void SetPriority(RequestPriority priority) OVERRIDE { | 12484 virtual void SetPriority(RequestPriority priority) OVERRIDE { |
12168 priority_ = priority; | 12485 priority_ = priority; |
12169 } | 12486 } |
12170 | 12487 |
12171 private: | 12488 private: |
12172 RequestPriority priority_; | 12489 RequestPriority priority_; |
12173 | 12490 |
12174 DISALLOW_COPY_AND_ASSIGN(FakeStream); | 12491 DISALLOW_COPY_AND_ASSIGN(FakeStream); |
12175 }; | 12492 }; |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12220 | 12537 |
12221 virtual LoadState GetLoadState() const OVERRIDE { | 12538 virtual LoadState GetLoadState() const OVERRIDE { |
12222 ADD_FAILURE(); | 12539 ADD_FAILURE(); |
12223 return LoadState(); | 12540 return LoadState(); |
12224 } | 12541 } |
12225 | 12542 |
12226 virtual void SetPriority(RequestPriority priority) OVERRIDE { | 12543 virtual void SetPriority(RequestPriority priority) OVERRIDE { |
12227 priority_ = priority; | 12544 priority_ = priority; |
12228 } | 12545 } |
12229 | 12546 |
12230 virtual bool was_npn_negotiated() const OVERRIDE { | 12547 virtual bool was_npn_negotiated() const OVERRIDE { return false; } |
12231 return false; | |
12232 } | |
12233 | 12548 |
12234 virtual NextProto protocol_negotiated() const OVERRIDE { | 12549 virtual NextProto protocol_negotiated() const OVERRIDE { |
12235 return kProtoUnknown; | 12550 return kProtoUnknown; |
12236 } | 12551 } |
12237 | 12552 |
12238 virtual bool using_spdy() const OVERRIDE { | 12553 virtual bool using_spdy() const OVERRIDE { return false; } |
12239 return false; | |
12240 } | |
12241 | 12554 |
12242 private: | 12555 private: |
12243 RequestPriority priority_; | 12556 RequestPriority priority_; |
12244 HttpStreamRequest::Delegate* const delegate_; | 12557 HttpStreamRequest::Delegate* const delegate_; |
12245 WebSocketHandshakeStreamBase::CreateHelper* websocket_stream_create_helper_; | 12558 WebSocketHandshakeStreamBase::CreateHelper* websocket_stream_create_helper_; |
12246 | 12559 |
12247 DISALLOW_COPY_AND_ASSIGN(FakeStreamRequest); | 12560 DISALLOW_COPY_AND_ASSIGN(FakeStreamRequest); |
12248 }; | 12561 }; |
12249 | 12562 |
12250 // Fake HttpStreamFactory that vends FakeStreamRequests. | 12563 // Fake HttpStreamFactory that vends FakeStreamRequests. |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12304 } | 12617 } |
12305 | 12618 |
12306 private: | 12619 private: |
12307 base::WeakPtr<FakeStreamRequest> last_stream_request_; | 12620 base::WeakPtr<FakeStreamRequest> last_stream_request_; |
12308 | 12621 |
12309 DISALLOW_COPY_AND_ASSIGN(FakeStreamFactory); | 12622 DISALLOW_COPY_AND_ASSIGN(FakeStreamFactory); |
12310 }; | 12623 }; |
12311 | 12624 |
12312 // TODO(yhirano): Split this class out into a net/websockets file, if it is | 12625 // TODO(yhirano): Split this class out into a net/websockets file, if it is |
12313 // worth doing. | 12626 // worth doing. |
12314 class FakeWebSocketStreamCreateHelper : | 12627 class FakeWebSocketStreamCreateHelper |
12315 public WebSocketHandshakeStreamBase::CreateHelper { | 12628 : public WebSocketHandshakeStreamBase::CreateHelper { |
12316 public: | 12629 public: |
12317 virtual WebSocketHandshakeStreamBase* CreateBasicStream( | 12630 virtual WebSocketHandshakeStreamBase* CreateBasicStream( |
12318 scoped_ptr<ClientSocketHandle> connection, | 12631 scoped_ptr<ClientSocketHandle> connection, |
12319 bool using_proxy) OVERRIDE { | 12632 bool using_proxy) OVERRIDE { |
12320 NOTREACHED(); | 12633 NOTREACHED(); |
12321 return NULL; | 12634 return NULL; |
12322 } | 12635 } |
12323 | 12636 |
12324 virtual WebSocketHandshakeStreamBase* CreateSpdyStream( | 12637 virtual WebSocketHandshakeStreamBase* CreateSpdyStream( |
12325 const base::WeakPtr<SpdySession>& session, | 12638 const base::WeakPtr<SpdySession>& session, |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12453 ClientSocketPoolManager::set_max_sockets_per_pool( | 12766 ClientSocketPoolManager::set_max_sockets_per_pool( |
12454 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); | 12767 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); |
12455 | 12768 |
12456 // Set up SSL request. | 12769 // Set up SSL request. |
12457 | 12770 |
12458 HttpRequestInfo ssl_request; | 12771 HttpRequestInfo ssl_request; |
12459 ssl_request.method = "GET"; | 12772 ssl_request.method = "GET"; |
12460 ssl_request.url = GURL("https://www.google.com/"); | 12773 ssl_request.url = GURL("https://www.google.com/"); |
12461 | 12774 |
12462 MockWrite ssl_writes[] = { | 12775 MockWrite ssl_writes[] = { |
12463 MockWrite("GET / HTTP/1.1\r\n" | 12776 MockWrite( |
12464 "Host: www.google.com\r\n" | 12777 "GET / HTTP/1.1\r\n" |
12465 "Connection: keep-alive\r\n\r\n"), | 12778 "Host: www.google.com\r\n" |
| 12779 "Connection: keep-alive\r\n\r\n"), |
12466 }; | 12780 }; |
12467 MockRead ssl_reads[] = { | 12781 MockRead ssl_reads[] = { |
12468 MockRead("HTTP/1.1 200 OK\r\n"), | 12782 MockRead("HTTP/1.1 200 OK\r\n"), MockRead("Content-Length: 11\r\n\r\n"), |
12469 MockRead("Content-Length: 11\r\n\r\n"), | 12783 MockRead("hello world"), MockRead(SYNCHRONOUS, OK), |
12470 MockRead("hello world"), | |
12471 MockRead(SYNCHRONOUS, OK), | |
12472 }; | 12784 }; |
12473 StaticSocketDataProvider ssl_data(ssl_reads, arraysize(ssl_reads), | 12785 StaticSocketDataProvider ssl_data( |
12474 ssl_writes, arraysize(ssl_writes)); | 12786 ssl_reads, arraysize(ssl_reads), ssl_writes, arraysize(ssl_writes)); |
12475 session_deps_.socket_factory->AddSocketDataProvider(&ssl_data); | 12787 session_deps_.socket_factory->AddSocketDataProvider(&ssl_data); |
12476 | 12788 |
12477 SSLSocketDataProvider ssl(ASYNC, OK); | 12789 SSLSocketDataProvider ssl(ASYNC, OK); |
12478 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 12790 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
12479 | 12791 |
12480 // Set up HTTP request. | 12792 // Set up HTTP request. |
12481 | 12793 |
12482 HttpRequestInfo http_request; | 12794 HttpRequestInfo http_request; |
12483 http_request.method = "GET"; | 12795 http_request.method = "GET"; |
12484 http_request.url = GURL("http://www.google.com/"); | 12796 http_request.url = GURL("http://www.google.com/"); |
12485 | 12797 |
12486 MockWrite http_writes[] = { | 12798 MockWrite http_writes[] = { |
12487 MockWrite("GET / HTTP/1.1\r\n" | 12799 MockWrite( |
12488 "Host: www.google.com\r\n" | 12800 "GET / HTTP/1.1\r\n" |
12489 "Connection: keep-alive\r\n\r\n"), | 12801 "Host: www.google.com\r\n" |
| 12802 "Connection: keep-alive\r\n\r\n"), |
12490 }; | 12803 }; |
12491 MockRead http_reads[] = { | 12804 MockRead http_reads[] = { |
12492 MockRead("HTTP/1.1 200 OK\r\n"), | 12805 MockRead("HTTP/1.1 200 OK\r\n"), MockRead("Content-Length: 7\r\n\r\n"), |
12493 MockRead("Content-Length: 7\r\n\r\n"), | 12806 MockRead("falafel"), MockRead(SYNCHRONOUS, OK), |
12494 MockRead("falafel"), | |
12495 MockRead(SYNCHRONOUS, OK), | |
12496 }; | 12807 }; |
12497 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 12808 StaticSocketDataProvider http_data( |
12498 http_writes, arraysize(http_writes)); | 12809 http_reads, arraysize(http_reads), http_writes, arraysize(http_writes)); |
12499 session_deps_.socket_factory->AddSocketDataProvider(&http_data); | 12810 session_deps_.socket_factory->AddSocketDataProvider(&http_data); |
12500 | 12811 |
12501 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 12812 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
12502 | 12813 |
12503 // Start the SSL request. | 12814 // Start the SSL request. |
12504 TestCompletionCallback ssl_callback; | 12815 TestCompletionCallback ssl_callback; |
12505 scoped_ptr<HttpTransaction> ssl_trans( | 12816 scoped_ptr<HttpTransaction> ssl_trans( |
12506 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 12817 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
12507 ASSERT_EQ(ERR_IO_PENDING, | 12818 ASSERT_EQ( |
12508 ssl_trans->Start(&ssl_request, ssl_callback.callback(), | 12819 ERR_IO_PENDING, |
12509 BoundNetLog())); | 12820 ssl_trans->Start(&ssl_request, ssl_callback.callback(), BoundNetLog())); |
12510 | 12821 |
12511 // Start the HTTP request. Pool should stall. | 12822 // Start the HTTP request. Pool should stall. |
12512 TestCompletionCallback http_callback; | 12823 TestCompletionCallback http_callback; |
12513 scoped_ptr<HttpTransaction> http_trans( | 12824 scoped_ptr<HttpTransaction> http_trans( |
12514 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 12825 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
12515 ASSERT_EQ(ERR_IO_PENDING, | 12826 ASSERT_EQ(ERR_IO_PENDING, |
12516 http_trans->Start(&http_request, http_callback.callback(), | 12827 http_trans->Start( |
12517 BoundNetLog())); | 12828 &http_request, http_callback.callback(), BoundNetLog())); |
12518 EXPECT_TRUE(IsTransportSocketPoolStalled(session)); | 12829 EXPECT_TRUE(IsTransportSocketPoolStalled(session)); |
12519 | 12830 |
12520 // Wait for response from SSL request. | 12831 // Wait for response from SSL request. |
12521 ASSERT_EQ(OK, ssl_callback.WaitForResult()); | 12832 ASSERT_EQ(OK, ssl_callback.WaitForResult()); |
12522 std::string response_data; | 12833 std::string response_data; |
12523 ASSERT_EQ(OK, ReadTransaction(ssl_trans.get(), &response_data)); | 12834 ASSERT_EQ(OK, ReadTransaction(ssl_trans.get(), &response_data)); |
12524 EXPECT_EQ("hello world", response_data); | 12835 EXPECT_EQ("hello world", response_data); |
12525 | 12836 |
12526 // The SSL socket should automatically be closed, so the HTTP request can | 12837 // The SSL socket should automatically be closed, so the HTTP request can |
12527 // start. | 12838 // start. |
(...skipping 30 matching lines...) Expand all Loading... |
12558 SSLSocketDataProvider ssl(ASYNC, OK); | 12869 SSLSocketDataProvider ssl(ASYNC, OK); |
12559 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 12870 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
12560 | 12871 |
12561 // Set up HTTP request. | 12872 // Set up HTTP request. |
12562 | 12873 |
12563 HttpRequestInfo http_request; | 12874 HttpRequestInfo http_request; |
12564 http_request.method = "GET"; | 12875 http_request.method = "GET"; |
12565 http_request.url = GURL("http://www.google.com/"); | 12876 http_request.url = GURL("http://www.google.com/"); |
12566 | 12877 |
12567 MockWrite http_writes[] = { | 12878 MockWrite http_writes[] = { |
12568 MockWrite("GET / HTTP/1.1\r\n" | 12879 MockWrite( |
12569 "Host: www.google.com\r\n" | 12880 "GET / HTTP/1.1\r\n" |
12570 "Connection: keep-alive\r\n\r\n"), | 12881 "Host: www.google.com\r\n" |
| 12882 "Connection: keep-alive\r\n\r\n"), |
12571 }; | 12883 }; |
12572 MockRead http_reads[] = { | 12884 MockRead http_reads[] = { |
12573 MockRead("HTTP/1.1 200 OK\r\n"), | 12885 MockRead("HTTP/1.1 200 OK\r\n"), MockRead("Content-Length: 7\r\n\r\n"), |
12574 MockRead("Content-Length: 7\r\n\r\n"), | 12886 MockRead("falafel"), MockRead(SYNCHRONOUS, OK), |
12575 MockRead("falafel"), | |
12576 MockRead(SYNCHRONOUS, OK), | |
12577 }; | 12887 }; |
12578 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 12888 StaticSocketDataProvider http_data( |
12579 http_writes, arraysize(http_writes)); | 12889 http_reads, arraysize(http_reads), http_writes, arraysize(http_writes)); |
12580 session_deps_.socket_factory->AddSocketDataProvider(&http_data); | 12890 session_deps_.socket_factory->AddSocketDataProvider(&http_data); |
12581 | 12891 |
12582 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 12892 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
12583 | 12893 |
12584 // Preconnect an SSL socket. A preconnect is needed because connect jobs are | 12894 // Preconnect an SSL socket. A preconnect is needed because connect jobs are |
12585 // cancelled when a normal transaction is cancelled. | 12895 // cancelled when a normal transaction is cancelled. |
12586 net::HttpStreamFactory* http_stream_factory = session->http_stream_factory(); | 12896 net::HttpStreamFactory* http_stream_factory = session->http_stream_factory(); |
12587 net::SSLConfig ssl_config; | 12897 net::SSLConfig ssl_config; |
12588 session->ssl_config_service()->GetSSLConfig(&ssl_config); | 12898 session->ssl_config_service()->GetSSLConfig(&ssl_config); |
12589 http_stream_factory->PreconnectStreams(1, ssl_request, DEFAULT_PRIORITY, | 12899 http_stream_factory->PreconnectStreams( |
12590 ssl_config, ssl_config); | 12900 1, ssl_request, DEFAULT_PRIORITY, ssl_config, ssl_config); |
12591 EXPECT_EQ(0, GetIdleSocketCountInSSLSocketPool(session)); | 12901 EXPECT_EQ(0, GetIdleSocketCountInSSLSocketPool(session)); |
12592 | 12902 |
12593 // Start the HTTP request. Pool should stall. | 12903 // Start the HTTP request. Pool should stall. |
12594 TestCompletionCallback http_callback; | 12904 TestCompletionCallback http_callback; |
12595 scoped_ptr<HttpTransaction> http_trans( | 12905 scoped_ptr<HttpTransaction> http_trans( |
12596 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 12906 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
12597 ASSERT_EQ(ERR_IO_PENDING, | 12907 ASSERT_EQ(ERR_IO_PENDING, |
12598 http_trans->Start(&http_request, http_callback.callback(), | 12908 http_trans->Start( |
12599 BoundNetLog())); | 12909 &http_request, http_callback.callback(), BoundNetLog())); |
12600 EXPECT_TRUE(IsTransportSocketPoolStalled(session)); | 12910 EXPECT_TRUE(IsTransportSocketPoolStalled(session)); |
12601 | 12911 |
12602 // The SSL connection will automatically be closed once the connection is | 12912 // The SSL connection will automatically be closed once the connection is |
12603 // established, to let the HTTP request start. | 12913 // established, to let the HTTP request start. |
12604 ASSERT_EQ(OK, http_callback.WaitForResult()); | 12914 ASSERT_EQ(OK, http_callback.WaitForResult()); |
12605 std::string response_data; | 12915 std::string response_data; |
12606 ASSERT_EQ(OK, ReadTransaction(http_trans.get(), &response_data)); | 12916 ASSERT_EQ(OK, ReadTransaction(http_trans.get(), &response_data)); |
12607 EXPECT_EQ("falafel", response_data); | 12917 EXPECT_EQ("falafel", response_data); |
12608 | 12918 |
12609 EXPECT_EQ(1, GetIdleSocketCountInTransportSocketPool(session)); | 12919 EXPECT_EQ(1, GetIdleSocketCountInTransportSocketPool(session)); |
12610 } | 12920 } |
12611 | 12921 |
12612 TEST_P(HttpNetworkTransactionTest, PostReadsErrorResponseAfterReset) { | 12922 TEST_P(HttpNetworkTransactionTest, PostReadsErrorResponseAfterReset) { |
12613 ScopedVector<UploadElementReader> element_readers; | 12923 ScopedVector<UploadElementReader> element_readers; |
12614 element_readers.push_back(new UploadBytesElementReader("foo", 3)); | 12924 element_readers.push_back(new UploadBytesElementReader("foo", 3)); |
12615 UploadDataStream upload_data_stream(element_readers.Pass(), 0); | 12925 UploadDataStream upload_data_stream(element_readers.Pass(), 0); |
12616 | 12926 |
12617 HttpRequestInfo request; | 12927 HttpRequestInfo request; |
12618 request.method = "POST"; | 12928 request.method = "POST"; |
12619 request.url = GURL("http://www.foo.com/"); | 12929 request.url = GURL("http://www.foo.com/"); |
12620 request.upload_data_stream = &upload_data_stream; | 12930 request.upload_data_stream = &upload_data_stream; |
12621 request.load_flags = 0; | 12931 request.load_flags = 0; |
12622 | 12932 |
12623 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 12933 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
12624 scoped_ptr<HttpTransaction> trans( | 12934 scoped_ptr<HttpTransaction> trans( |
12625 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 12935 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
12626 // Send headers successfully, but get an error while sending the body. | 12936 // Send headers successfully, but get an error while sending the body. |
12627 MockWrite data_writes[] = { | 12937 MockWrite data_writes[] = { |
12628 MockWrite("POST / HTTP/1.1\r\n" | 12938 MockWrite( |
12629 "Host: www.foo.com\r\n" | 12939 "POST / HTTP/1.1\r\n" |
12630 "Connection: keep-alive\r\n" | 12940 "Host: www.foo.com\r\n" |
12631 "Content-Length: 3\r\n\r\n"), | 12941 "Connection: keep-alive\r\n" |
12632 MockWrite(SYNCHRONOUS, ERR_CONNECTION_RESET), | 12942 "Content-Length: 3\r\n\r\n"), |
| 12943 MockWrite(SYNCHRONOUS, ERR_CONNECTION_RESET), |
12633 }; | 12944 }; |
12634 | 12945 |
12635 MockRead data_reads[] = { | 12946 MockRead data_reads[] = { |
12636 MockRead("HTTP/1.0 400 Not OK\r\n\r\n"), | 12947 MockRead("HTTP/1.0 400 Not OK\r\n\r\n"), MockRead("hello world"), |
12637 MockRead("hello world"), | 12948 MockRead(SYNCHRONOUS, OK), |
12638 MockRead(SYNCHRONOUS, OK), | |
12639 }; | 12949 }; |
12640 StaticSocketDataProvider data(data_reads, arraysize(data_reads), data_writes, | 12950 StaticSocketDataProvider data( |
12641 arraysize(data_writes)); | 12951 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
12642 session_deps_.socket_factory->AddSocketDataProvider(&data); | 12952 session_deps_.socket_factory->AddSocketDataProvider(&data); |
12643 | 12953 |
12644 TestCompletionCallback callback; | 12954 TestCompletionCallback callback; |
12645 | 12955 |
12646 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 12956 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
12647 EXPECT_EQ(ERR_IO_PENDING, rv); | 12957 EXPECT_EQ(ERR_IO_PENDING, rv); |
12648 | 12958 |
12649 rv = callback.WaitForResult(); | 12959 rv = callback.WaitForResult(); |
12650 EXPECT_EQ(OK, rv); | 12960 EXPECT_EQ(OK, rv); |
12651 | 12961 |
12652 const HttpResponseInfo* response = trans->GetResponseInfo(); | 12962 const HttpResponseInfo* response = trans->GetResponseInfo(); |
12653 ASSERT_TRUE(response != NULL); | 12963 ASSERT_TRUE(response != NULL); |
12654 | 12964 |
12655 EXPECT_TRUE(response->headers.get() != NULL); | 12965 EXPECT_TRUE(response->headers.get() != NULL); |
12656 EXPECT_EQ("HTTP/1.0 400 Not OK", response->headers->GetStatusLine()); | 12966 EXPECT_EQ("HTTP/1.0 400 Not OK", response->headers->GetStatusLine()); |
12657 | 12967 |
12658 std::string response_data; | 12968 std::string response_data; |
12659 rv = ReadTransaction(trans.get(), &response_data); | 12969 rv = ReadTransaction(trans.get(), &response_data); |
12660 EXPECT_EQ(OK, rv); | 12970 EXPECT_EQ(OK, rv); |
12661 EXPECT_EQ("hello world", response_data); | 12971 EXPECT_EQ("hello world", response_data); |
12662 } | 12972 } |
12663 | 12973 |
12664 // This test makes sure the retry logic doesn't trigger when reading an error | 12974 // This test makes sure the retry logic doesn't trigger when reading an error |
12665 // response from a server that rejected a POST with a CONNECTION_RESET. | 12975 // response from a server that rejected a POST with a CONNECTION_RESET. |
12666 TEST_P(HttpNetworkTransactionTest, | 12976 TEST_P(HttpNetworkTransactionTest, |
12667 PostReadsErrorResponseAfterResetOnReusedSocket) { | 12977 PostReadsErrorResponseAfterResetOnReusedSocket) { |
12668 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 12978 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
12669 MockWrite data_writes[] = { | 12979 MockWrite data_writes[] = { |
12670 MockWrite("GET / HTTP/1.1\r\n" | 12980 MockWrite( |
12671 "Host: www.foo.com\r\n" | 12981 "GET / HTTP/1.1\r\n" |
12672 "Connection: keep-alive\r\n\r\n"), | 12982 "Host: www.foo.com\r\n" |
12673 MockWrite("POST / HTTP/1.1\r\n" | 12983 "Connection: keep-alive\r\n\r\n"), |
12674 "Host: www.foo.com\r\n" | 12984 MockWrite( |
12675 "Connection: keep-alive\r\n" | 12985 "POST / HTTP/1.1\r\n" |
12676 "Content-Length: 3\r\n\r\n"), | 12986 "Host: www.foo.com\r\n" |
12677 MockWrite(SYNCHRONOUS, ERR_CONNECTION_RESET), | 12987 "Connection: keep-alive\r\n" |
| 12988 "Content-Length: 3\r\n\r\n"), |
| 12989 MockWrite(SYNCHRONOUS, ERR_CONNECTION_RESET), |
12678 }; | 12990 }; |
12679 | 12991 |
12680 MockRead data_reads[] = { | 12992 MockRead data_reads[] = { |
12681 MockRead("HTTP/1.1 200 Peachy\r\n" | 12993 MockRead( |
12682 "Content-Length: 14\r\n\r\n"), | 12994 "HTTP/1.1 200 Peachy\r\n" |
12683 MockRead("first response"), | 12995 "Content-Length: 14\r\n\r\n"), |
12684 MockRead("HTTP/1.1 400 Not OK\r\n" | 12996 MockRead("first response"), MockRead( |
12685 "Content-Length: 15\r\n\r\n"), | 12997 "HTTP/1.1 400 Not OK\r\n" |
12686 MockRead("second response"), | 12998 "Content-Length: 15\r\n\r\n"), |
12687 MockRead(SYNCHRONOUS, OK), | 12999 MockRead("second response"), MockRead(SYNCHRONOUS, OK), |
12688 }; | 13000 }; |
12689 StaticSocketDataProvider data(data_reads, arraysize(data_reads), data_writes, | 13001 StaticSocketDataProvider data( |
12690 arraysize(data_writes)); | 13002 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
12691 session_deps_.socket_factory->AddSocketDataProvider(&data); | 13003 session_deps_.socket_factory->AddSocketDataProvider(&data); |
12692 | 13004 |
12693 TestCompletionCallback callback; | 13005 TestCompletionCallback callback; |
12694 HttpRequestInfo request1; | 13006 HttpRequestInfo request1; |
12695 request1.method = "GET"; | 13007 request1.method = "GET"; |
12696 request1.url = GURL("http://www.foo.com/"); | 13008 request1.url = GURL("http://www.foo.com/"); |
12697 request1.load_flags = 0; | 13009 request1.load_flags = 0; |
12698 | 13010 |
12699 scoped_ptr<HttpTransaction> trans1( | 13011 scoped_ptr<HttpTransaction> trans1( |
12700 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 13012 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12757 request.method = "POST"; | 13069 request.method = "POST"; |
12758 request.url = GURL("http://www.foo.com/"); | 13070 request.url = GURL("http://www.foo.com/"); |
12759 request.upload_data_stream = &upload_data_stream; | 13071 request.upload_data_stream = &upload_data_stream; |
12760 request.load_flags = 0; | 13072 request.load_flags = 0; |
12761 | 13073 |
12762 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 13074 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
12763 scoped_ptr<HttpTransaction> trans( | 13075 scoped_ptr<HttpTransaction> trans( |
12764 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 13076 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
12765 // Send headers successfully, but get an error while sending the body. | 13077 // Send headers successfully, but get an error while sending the body. |
12766 MockWrite data_writes[] = { | 13078 MockWrite data_writes[] = { |
12767 MockWrite("POST / HTTP/1.1\r\n" | 13079 MockWrite( |
12768 "Host: www.foo.com\r\n" | 13080 "POST / HTTP/1.1\r\n" |
12769 "Connection: keep-alive\r\n" | 13081 "Host: www.foo.com\r\n" |
12770 "Content-Length: 3\r\n\r\n" | 13082 "Connection: keep-alive\r\n" |
12771 "fo"), | 13083 "Content-Length: 3\r\n\r\n" |
12772 MockWrite(SYNCHRONOUS, ERR_CONNECTION_RESET), | 13084 "fo"), |
| 13085 MockWrite(SYNCHRONOUS, ERR_CONNECTION_RESET), |
12773 }; | 13086 }; |
12774 | 13087 |
12775 MockRead data_reads[] = { | 13088 MockRead data_reads[] = { |
12776 MockRead("HTTP/1.0 400 Not OK\r\n\r\n"), | 13089 MockRead("HTTP/1.0 400 Not OK\r\n\r\n"), MockRead("hello world"), |
12777 MockRead("hello world"), | 13090 MockRead(SYNCHRONOUS, OK), |
12778 MockRead(SYNCHRONOUS, OK), | |
12779 }; | 13091 }; |
12780 StaticSocketDataProvider data(data_reads, arraysize(data_reads), data_writes, | 13092 StaticSocketDataProvider data( |
12781 arraysize(data_writes)); | 13093 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
12782 session_deps_.socket_factory->AddSocketDataProvider(&data); | 13094 session_deps_.socket_factory->AddSocketDataProvider(&data); |
12783 | 13095 |
12784 TestCompletionCallback callback; | 13096 TestCompletionCallback callback; |
12785 | 13097 |
12786 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 13098 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
12787 EXPECT_EQ(ERR_IO_PENDING, rv); | 13099 EXPECT_EQ(ERR_IO_PENDING, rv); |
12788 | 13100 |
12789 rv = callback.WaitForResult(); | 13101 rv = callback.WaitForResult(); |
12790 EXPECT_EQ(OK, rv); | 13102 EXPECT_EQ(OK, rv); |
12791 | 13103 |
(...skipping 20 matching lines...) Expand all Loading... |
12812 request.method = "POST"; | 13124 request.method = "POST"; |
12813 request.url = GURL("http://www.foo.com/"); | 13125 request.url = GURL("http://www.foo.com/"); |
12814 request.upload_data_stream = &upload_data_stream; | 13126 request.upload_data_stream = &upload_data_stream; |
12815 request.load_flags = 0; | 13127 request.load_flags = 0; |
12816 | 13128 |
12817 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 13129 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
12818 scoped_ptr<HttpTransaction> trans( | 13130 scoped_ptr<HttpTransaction> trans( |
12819 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 13131 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
12820 // Send headers successfully, but get an error while sending the body. | 13132 // Send headers successfully, but get an error while sending the body. |
12821 MockWrite data_writes[] = { | 13133 MockWrite data_writes[] = { |
12822 MockWrite("POST / HTTP/1.1\r\n" | 13134 MockWrite( |
12823 "Host: www.foo.com\r\n" | 13135 "POST / HTTP/1.1\r\n" |
12824 "Connection: keep-alive\r\n" | 13136 "Host: www.foo.com\r\n" |
12825 "Transfer-Encoding: chunked\r\n\r\n"), | 13137 "Connection: keep-alive\r\n" |
12826 MockWrite(SYNCHRONOUS, ERR_CONNECTION_RESET), | 13138 "Transfer-Encoding: chunked\r\n\r\n"), |
| 13139 MockWrite(SYNCHRONOUS, ERR_CONNECTION_RESET), |
12827 }; | 13140 }; |
12828 | 13141 |
12829 MockRead data_reads[] = { | 13142 MockRead data_reads[] = { |
12830 MockRead("HTTP/1.0 400 Not OK\r\n\r\n"), | 13143 MockRead("HTTP/1.0 400 Not OK\r\n\r\n"), MockRead("hello world"), |
12831 MockRead("hello world"), | 13144 MockRead(SYNCHRONOUS, OK), |
12832 MockRead(SYNCHRONOUS, OK), | |
12833 }; | 13145 }; |
12834 StaticSocketDataProvider data(data_reads, arraysize(data_reads), data_writes, | 13146 StaticSocketDataProvider data( |
12835 arraysize(data_writes)); | 13147 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
12836 session_deps_.socket_factory->AddSocketDataProvider(&data); | 13148 session_deps_.socket_factory->AddSocketDataProvider(&data); |
12837 | 13149 |
12838 TestCompletionCallback callback; | 13150 TestCompletionCallback callback; |
12839 | 13151 |
12840 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 13152 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
12841 EXPECT_EQ(ERR_IO_PENDING, rv); | 13153 EXPECT_EQ(ERR_IO_PENDING, rv); |
12842 // Make sure the headers are sent before adding a chunk. This ensures that | 13154 // Make sure the headers are sent before adding a chunk. This ensures that |
12843 // they can't be merged with the body in a single send. Not currently | 13155 // they can't be merged with the body in a single send. Not currently |
12844 // necessary since a chunked body is never merged with headers, but this makes | 13156 // necessary since a chunked body is never merged with headers, but this makes |
12845 // the test more future proof. | 13157 // the test more future proof. |
(...skipping 25 matching lines...) Expand all Loading... |
12871 request.method = "POST"; | 13183 request.method = "POST"; |
12872 request.url = GURL("http://www.foo.com/"); | 13184 request.url = GURL("http://www.foo.com/"); |
12873 request.upload_data_stream = &upload_data_stream; | 13185 request.upload_data_stream = &upload_data_stream; |
12874 request.load_flags = 0; | 13186 request.load_flags = 0; |
12875 | 13187 |
12876 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 13188 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
12877 scoped_ptr<HttpTransaction> trans( | 13189 scoped_ptr<HttpTransaction> trans( |
12878 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 13190 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
12879 | 13191 |
12880 MockWrite data_writes[] = { | 13192 MockWrite data_writes[] = { |
12881 MockWrite("POST / HTTP/1.1\r\n" | 13193 MockWrite( |
12882 "Host: www.foo.com\r\n" | 13194 "POST / HTTP/1.1\r\n" |
12883 "Connection: keep-alive\r\n" | 13195 "Host: www.foo.com\r\n" |
12884 "Content-Length: 3\r\n\r\n"), | 13196 "Connection: keep-alive\r\n" |
12885 MockWrite(SYNCHRONOUS, ERR_CONNECTION_RESET), | 13197 "Content-Length: 3\r\n\r\n"), |
| 13198 MockWrite(SYNCHRONOUS, ERR_CONNECTION_RESET), |
12886 }; | 13199 }; |
12887 | 13200 |
12888 MockRead data_reads[] = { | 13201 MockRead data_reads[] = { |
12889 MockRead("HTTP/1.0 100 Continue\r\n\r\n"), | 13202 MockRead("HTTP/1.0 100 Continue\r\n\r\n"), |
12890 MockRead("HTTP/1.0 400 Not OK\r\n\r\n"), | 13203 MockRead("HTTP/1.0 400 Not OK\r\n\r\n"), MockRead("hello world"), |
12891 MockRead("hello world"), | 13204 MockRead(SYNCHRONOUS, OK), |
12892 MockRead(SYNCHRONOUS, OK), | |
12893 }; | 13205 }; |
12894 StaticSocketDataProvider data(data_reads, arraysize(data_reads), data_writes, | 13206 StaticSocketDataProvider data( |
12895 arraysize(data_writes)); | 13207 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
12896 session_deps_.socket_factory->AddSocketDataProvider(&data); | 13208 session_deps_.socket_factory->AddSocketDataProvider(&data); |
12897 | 13209 |
12898 TestCompletionCallback callback; | 13210 TestCompletionCallback callback; |
12899 | 13211 |
12900 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 13212 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
12901 EXPECT_EQ(ERR_IO_PENDING, rv); | 13213 EXPECT_EQ(ERR_IO_PENDING, rv); |
12902 | 13214 |
12903 rv = callback.WaitForResult(); | 13215 rv = callback.WaitForResult(); |
12904 EXPECT_EQ(OK, rv); | 13216 EXPECT_EQ(OK, rv); |
12905 | 13217 |
(...skipping 18 matching lines...) Expand all Loading... |
12924 request.method = "POST"; | 13236 request.method = "POST"; |
12925 request.url = GURL("http://www.foo.com/"); | 13237 request.url = GURL("http://www.foo.com/"); |
12926 request.upload_data_stream = &upload_data_stream; | 13238 request.upload_data_stream = &upload_data_stream; |
12927 request.load_flags = 0; | 13239 request.load_flags = 0; |
12928 | 13240 |
12929 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 13241 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
12930 scoped_ptr<HttpTransaction> trans( | 13242 scoped_ptr<HttpTransaction> trans( |
12931 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 13243 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
12932 // Send headers successfully, but get an error while sending the body. | 13244 // Send headers successfully, but get an error while sending the body. |
12933 MockWrite data_writes[] = { | 13245 MockWrite data_writes[] = { |
12934 MockWrite("POST / HTTP/1.1\r\n" | 13246 MockWrite( |
12935 "Host: www.foo.com\r\n" | 13247 "POST / HTTP/1.1\r\n" |
12936 "Connection: keep-alive\r\n" | 13248 "Host: www.foo.com\r\n" |
12937 "Content-Length: 3\r\n\r\n"), | 13249 "Connection: keep-alive\r\n" |
12938 MockWrite(SYNCHRONOUS, ERR_CONNECTION_RESET), | 13250 "Content-Length: 3\r\n\r\n"), |
| 13251 MockWrite(SYNCHRONOUS, ERR_CONNECTION_RESET), |
12939 }; | 13252 }; |
12940 | 13253 |
12941 MockRead data_reads[] = { | 13254 MockRead data_reads[] = { |
12942 MockRead("HTTP/1.0 200 Just Dandy\r\n\r\n"), | 13255 MockRead("HTTP/1.0 200 Just Dandy\r\n\r\n"), MockRead("hello world"), |
12943 MockRead("hello world"), | 13256 MockRead(SYNCHRONOUS, OK), |
12944 MockRead(SYNCHRONOUS, OK), | |
12945 }; | 13257 }; |
12946 StaticSocketDataProvider data(data_reads, arraysize(data_reads), data_writes, | 13258 StaticSocketDataProvider data( |
12947 arraysize(data_writes)); | 13259 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
12948 session_deps_.socket_factory->AddSocketDataProvider(&data); | 13260 session_deps_.socket_factory->AddSocketDataProvider(&data); |
12949 | 13261 |
12950 TestCompletionCallback callback; | 13262 TestCompletionCallback callback; |
12951 | 13263 |
12952 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 13264 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
12953 EXPECT_EQ(ERR_IO_PENDING, rv); | 13265 EXPECT_EQ(ERR_IO_PENDING, rv); |
12954 | 13266 |
12955 rv = callback.WaitForResult(); | 13267 rv = callback.WaitForResult(); |
12956 EXPECT_EQ(ERR_CONNECTION_RESET, rv); | 13268 EXPECT_EQ(ERR_CONNECTION_RESET, rv); |
12957 | 13269 |
(...skipping 11 matching lines...) Expand all Loading... |
12969 request.method = "POST"; | 13281 request.method = "POST"; |
12970 request.url = GURL("http://www.foo.com/"); | 13282 request.url = GURL("http://www.foo.com/"); |
12971 request.upload_data_stream = &upload_data_stream; | 13283 request.upload_data_stream = &upload_data_stream; |
12972 request.load_flags = 0; | 13284 request.load_flags = 0; |
12973 | 13285 |
12974 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 13286 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
12975 scoped_ptr<HttpTransaction> trans( | 13287 scoped_ptr<HttpTransaction> trans( |
12976 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 13288 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
12977 // Send headers successfully, but get an error while sending the body. | 13289 // Send headers successfully, but get an error while sending the body. |
12978 MockWrite data_writes[] = { | 13290 MockWrite data_writes[] = { |
12979 MockWrite("POST / HTTP/1.1\r\n" | 13291 MockWrite( |
12980 "Host: www.foo.com\r\n" | 13292 "POST / HTTP/1.1\r\n" |
12981 "Connection: keep-alive\r\n" | 13293 "Host: www.foo.com\r\n" |
12982 "Content-Length: 3\r\n\r\n"), | 13294 "Connection: keep-alive\r\n" |
12983 MockWrite(SYNCHRONOUS, ERR_CONNECTION_RESET), | 13295 "Content-Length: 3\r\n\r\n"), |
| 13296 MockWrite(SYNCHRONOUS, ERR_CONNECTION_RESET), |
12984 }; | 13297 }; |
12985 | 13298 |
12986 MockRead data_reads[] = { | 13299 MockRead data_reads[] = { |
12987 MockRead("HTTP/1.0 100 Continue\r\n\r\n"), | 13300 MockRead("HTTP/1.0 100 Continue\r\n\r\n"), |
12988 MockRead("HTTP/1.0 302 Redirect\r\n"), | 13301 MockRead("HTTP/1.0 302 Redirect\r\n"), |
12989 MockRead("Location: http://somewhere-else.com/\r\n"), | 13302 MockRead("Location: http://somewhere-else.com/\r\n"), |
12990 MockRead("Content-Length: 0\r\n\r\n"), | 13303 MockRead("Content-Length: 0\r\n\r\n"), |
12991 MockRead(SYNCHRONOUS, OK), | 13304 MockRead(SYNCHRONOUS, OK), |
12992 }; | 13305 }; |
12993 StaticSocketDataProvider data(data_reads, arraysize(data_reads), data_writes, | 13306 StaticSocketDataProvider data( |
12994 arraysize(data_writes)); | 13307 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
12995 session_deps_.socket_factory->AddSocketDataProvider(&data); | 13308 session_deps_.socket_factory->AddSocketDataProvider(&data); |
12996 | 13309 |
12997 TestCompletionCallback callback; | 13310 TestCompletionCallback callback; |
12998 | 13311 |
12999 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 13312 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
13000 EXPECT_EQ(ERR_IO_PENDING, rv); | 13313 EXPECT_EQ(ERR_IO_PENDING, rv); |
13001 | 13314 |
13002 rv = callback.WaitForResult(); | 13315 rv = callback.WaitForResult(); |
13003 EXPECT_EQ(ERR_CONNECTION_RESET, rv); | 13316 EXPECT_EQ(ERR_CONNECTION_RESET, rv); |
13004 | 13317 |
(...skipping 10 matching lines...) Expand all Loading... |
13015 request.method = "POST"; | 13328 request.method = "POST"; |
13016 request.url = GURL("http://www.foo.com/"); | 13329 request.url = GURL("http://www.foo.com/"); |
13017 request.upload_data_stream = &upload_data_stream; | 13330 request.upload_data_stream = &upload_data_stream; |
13018 request.load_flags = 0; | 13331 request.load_flags = 0; |
13019 | 13332 |
13020 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 13333 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
13021 scoped_ptr<HttpTransaction> trans( | 13334 scoped_ptr<HttpTransaction> trans( |
13022 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 13335 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
13023 // Send headers successfully, but get an error while sending the body. | 13336 // Send headers successfully, but get an error while sending the body. |
13024 MockWrite data_writes[] = { | 13337 MockWrite data_writes[] = { |
13025 MockWrite("POST / HTTP/1.1\r\n" | 13338 MockWrite( |
13026 "Host: www.foo.com\r\n" | 13339 "POST / HTTP/1.1\r\n" |
13027 "Connection: keep-alive\r\n" | 13340 "Host: www.foo.com\r\n" |
13028 "Content-Length: 3\r\n\r\n"), | 13341 "Connection: keep-alive\r\n" |
13029 MockWrite(SYNCHRONOUS, ERR_CONNECTION_RESET), | 13342 "Content-Length: 3\r\n\r\n"), |
| 13343 MockWrite(SYNCHRONOUS, ERR_CONNECTION_RESET), |
13030 }; | 13344 }; |
13031 | 13345 |
13032 MockRead data_reads[] = { | 13346 MockRead data_reads[] = { |
13033 MockRead("HTTP 0.9 rocks!"), | 13347 MockRead("HTTP 0.9 rocks!"), MockRead(SYNCHRONOUS, OK), |
13034 MockRead(SYNCHRONOUS, OK), | |
13035 }; | 13348 }; |
13036 StaticSocketDataProvider data(data_reads, arraysize(data_reads), data_writes, | 13349 StaticSocketDataProvider data( |
13037 arraysize(data_writes)); | 13350 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
13038 session_deps_.socket_factory->AddSocketDataProvider(&data); | 13351 session_deps_.socket_factory->AddSocketDataProvider(&data); |
13039 | 13352 |
13040 TestCompletionCallback callback; | 13353 TestCompletionCallback callback; |
13041 | 13354 |
13042 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 13355 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
13043 EXPECT_EQ(ERR_IO_PENDING, rv); | 13356 EXPECT_EQ(ERR_IO_PENDING, rv); |
13044 | 13357 |
13045 rv = callback.WaitForResult(); | 13358 rv = callback.WaitForResult(); |
13046 EXPECT_EQ(ERR_CONNECTION_RESET, rv); | 13359 EXPECT_EQ(ERR_CONNECTION_RESET, rv); |
13047 | 13360 |
(...skipping 10 matching lines...) Expand all Loading... |
13058 request.method = "POST"; | 13371 request.method = "POST"; |
13059 request.url = GURL("http://www.foo.com/"); | 13372 request.url = GURL("http://www.foo.com/"); |
13060 request.upload_data_stream = &upload_data_stream; | 13373 request.upload_data_stream = &upload_data_stream; |
13061 request.load_flags = 0; | 13374 request.load_flags = 0; |
13062 | 13375 |
13063 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 13376 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
13064 scoped_ptr<HttpTransaction> trans( | 13377 scoped_ptr<HttpTransaction> trans( |
13065 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 13378 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
13066 // Send headers successfully, but get an error while sending the body. | 13379 // Send headers successfully, but get an error while sending the body. |
13067 MockWrite data_writes[] = { | 13380 MockWrite data_writes[] = { |
13068 MockWrite("POST / HTTP/1.1\r\n" | 13381 MockWrite( |
13069 "Host: www.foo.com\r\n" | 13382 "POST / HTTP/1.1\r\n" |
13070 "Connection: keep-alive\r\n" | 13383 "Host: www.foo.com\r\n" |
13071 "Content-Length: 3\r\n\r\n"), | 13384 "Connection: keep-alive\r\n" |
13072 MockWrite(SYNCHRONOUS, ERR_CONNECTION_RESET), | 13385 "Content-Length: 3\r\n\r\n"), |
| 13386 MockWrite(SYNCHRONOUS, ERR_CONNECTION_RESET), |
13073 }; | 13387 }; |
13074 | 13388 |
13075 MockRead data_reads[] = { | 13389 MockRead data_reads[] = { |
13076 MockRead("HTTP/1.0 400 Not a Full Response\r\n"), | 13390 MockRead("HTTP/1.0 400 Not a Full Response\r\n"), |
13077 MockRead(SYNCHRONOUS, OK), | 13391 MockRead(SYNCHRONOUS, OK), |
13078 }; | 13392 }; |
13079 StaticSocketDataProvider data(data_reads, arraysize(data_reads), data_writes, | 13393 StaticSocketDataProvider data( |
13080 arraysize(data_writes)); | 13394 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
13081 session_deps_.socket_factory->AddSocketDataProvider(&data); | 13395 session_deps_.socket_factory->AddSocketDataProvider(&data); |
13082 | 13396 |
13083 TestCompletionCallback callback; | 13397 TestCompletionCallback callback; |
13084 | 13398 |
13085 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 13399 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
13086 EXPECT_EQ(ERR_IO_PENDING, rv); | 13400 EXPECT_EQ(ERR_IO_PENDING, rv); |
13087 | 13401 |
13088 rv = callback.WaitForResult(); | 13402 rv = callback.WaitForResult(); |
13089 EXPECT_EQ(ERR_CONNECTION_RESET, rv); | 13403 EXPECT_EQ(ERR_CONNECTION_RESET, rv); |
13090 | 13404 |
13091 const HttpResponseInfo* response = trans->GetResponseInfo(); | 13405 const HttpResponseInfo* response = trans->GetResponseInfo(); |
13092 EXPECT_TRUE(response == NULL); | 13406 EXPECT_TRUE(response == NULL); |
13093 } | 13407 } |
13094 | 13408 |
13095 } // namespace net | 13409 } // namespace net |
OLD | NEW |