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

Side by Side Diff: net/http/http_network_transaction_unittest.cc

Issue 266243004: Clang format slam. Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698