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

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

Issue 4935001: Allow a non-200 (or non-407) response for a CONNECT request from an HTTPS pro... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 10 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 <vector> 8 #include <vector>
9 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
(...skipping 2257 matching lines...) Expand 10 before | Expand all | Expand 10 after
2268 ssl2.next_proto = "spdy/2"; 2268 ssl2.next_proto = "spdy/2";
2269 ssl2.was_npn_negotiated = true; 2269 ssl2.was_npn_negotiated = true;
2270 session_deps.socket_factory.AddSSLSocketDataProvider(&ssl2); 2270 session_deps.socket_factory.AddSSLSocketDataProvider(&ssl2);
2271 2271
2272 TestCompletionCallback callback1; 2272 TestCompletionCallback callback1;
2273 2273
2274 int rv = trans->Start(&request, &callback1, log.bound()); 2274 int rv = trans->Start(&request, &callback1, log.bound());
2275 EXPECT_EQ(ERR_IO_PENDING, rv); 2275 EXPECT_EQ(ERR_IO_PENDING, rv);
2276 2276
2277 rv = callback1.WaitForResult(); 2277 rv = callback1.WaitForResult();
2278 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, rv); 2278 EXPECT_EQ(OK, rv);
2279 2279
2280 const HttpResponseInfo* response = trans->GetResponseInfo(); 2280 const HttpResponseInfo* response = trans->GetResponseInfo();
2281 ASSERT_TRUE(response == NULL); 2281 ASSERT_FALSE(response == NULL);
2282 EXPECT_EQ(500, response->headers->response_code());
2282 } 2283 }
2283 2284
2284 // Test the challenge-response-retry sequence through an HTTPS Proxy 2285 // Test the challenge-response-retry sequence through an HTTPS Proxy
2285 TEST_F(HttpNetworkTransactionTest, HttpsProxyAuthRetry) { 2286 TEST_F(HttpNetworkTransactionTest, HttpsProxyAuthRetry) {
2286 // Configure against https proxy server "proxy:70". 2287 // Configure against https proxy server "proxy:70".
2287 SessionDependencies session_deps(ProxyService::CreateFixed("https://proxy:70") ); 2288 SessionDependencies session_deps(ProxyService::CreateFixed("https://proxy:70") );
2288 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); 2289 CapturingBoundNetLog log(CapturingNetLog::kUnbounded);
2289 session_deps.net_log = log.bound().net_log(); 2290 session_deps.net_log = log.bound().net_log();
2290 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); 2291 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps));
2291 2292
(...skipping 2167 matching lines...) Expand 10 before | Expand all | Expand 10 after
4459 const HttpResponseInfo* response = trans->GetResponseInfo(); 4460 const HttpResponseInfo* response = trans->GetResponseInfo();
4460 4461
4461 ASSERT_FALSE(response == NULL); 4462 ASSERT_FALSE(response == NULL);
4462 4463
4463 EXPECT_TRUE(response->headers->IsKeepAlive()); 4464 EXPECT_TRUE(response->headers->IsKeepAlive());
4464 EXPECT_EQ(200, response->headers->response_code()); 4465 EXPECT_EQ(200, response->headers->response_code());
4465 EXPECT_EQ(100, response->headers->GetContentLength()); 4466 EXPECT_EQ(100, response->headers->GetContentLength());
4466 EXPECT_TRUE(HttpVersion(1, 1) == response->headers->GetHttpVersion()); 4467 EXPECT_TRUE(HttpVersion(1, 1) == response->headers->GetHttpVersion());
4467 } 4468 }
4468 4469
4470 // Test an HTTPS Proxy's ability to redirect a CONNECT request
4471 TEST_F(HttpNetworkTransactionTest, RedirectOfHttpsConnectViaHttpsProxy) {
4472 SessionDependencies session_deps(
4473 ProxyService::CreateFixed("https://proxy:70"));
4474
4475 HttpRequestInfo request;
4476 request.method = "GET";
4477 request.url = GURL("https://www.google.com/");
4478 request.load_flags = 0;
4479
4480 MockWrite data_writes[] = {
4481 MockWrite("CONNECT www.google.com:443 HTTP/1.1\r\n"
4482 "Host: www.google.com\r\n"
4483 "Proxy-Connection: keep-alive\r\n\r\n"),
4484 };
4485
4486 MockRead data_reads[] = {
4487 MockRead("HTTP/1.1 302 Redirect\r\n"),
4488 MockRead("Location: http://login.example.com/\r\n"),
4489 MockRead("Content-Length: 0\r\n\r\n"),
4490 MockRead(false, OK),
4491 };
4492
4493 StaticSocketDataProvider data(data_reads, arraysize(data_reads),
4494 data_writes, arraysize(data_writes));
4495 SSLSocketDataProvider proxy_ssl(true, OK); // SSL to the proxy
4496
4497 session_deps.socket_factory.AddSocketDataProvider(&data);
4498 session_deps.socket_factory.AddSSLSocketDataProvider(&proxy_ssl);
4499
4500 TestCompletionCallback callback;
4501
4502 scoped_ptr<HttpTransaction> trans(
4503 new HttpNetworkTransaction(CreateSession(&session_deps)));
4504
4505 int rv = trans->Start(&request, &callback, BoundNetLog());
4506 EXPECT_EQ(ERR_IO_PENDING, rv);
4507
4508 rv = callback.WaitForResult();
4509 EXPECT_EQ(OK, rv);
4510 const HttpResponseInfo* response = trans->GetResponseInfo();
4511
4512 ASSERT_FALSE(response == NULL);
4513
4514 EXPECT_EQ(302, response->headers->response_code());
4515 std::string url;
4516 EXPECT_TRUE(response->headers->IsRedirect(&url));
4517 EXPECT_EQ("http://login.example.com/", url);
4518 }
4519
4520 // Test an HTTPS (SPDY) Proxy's ability to redirect a CONNECT request
4521 TEST_F(HttpNetworkTransactionTest, RedirectOfHttpsConnectViaSpdyProxy) {
4522 SessionDependencies session_deps(
4523 ProxyService::CreateFixed("https://proxy:70"));
4524
4525 HttpRequestInfo request;
4526 request.method = "GET";
4527 request.url = GURL("https://www.google.com/");
4528 request.load_flags = 0;
4529
4530 scoped_ptr<spdy::SpdyFrame> conn(ConstructSpdyConnect(NULL, 0, 1));
4531 scoped_ptr<spdy::SpdyFrame> goaway(ConstructSpdyRstStream(1, spdy::CANCEL));
4532 MockWrite data_writes[] = {
4533 CreateMockWrite(*conn.get(), 0, false),
4534 };
4535
4536 static const char* const kExtraHeaders[] = {
4537 "location",
4538 "http://login.example.com/",
4539 };
4540 scoped_ptr<spdy::SpdyFrame> resp(
4541 ConstructSpdySynReplyError("302 Redirect", kExtraHeaders,
4542 arraysize(kExtraHeaders)/2, 1));
4543 MockRead data_reads[] = {
4544 CreateMockRead(*resp.get(), 1, false),
4545 MockRead(true, 0, 2), // EOF
4546 };
4547
4548 scoped_refptr<DelayedSocketData> data(
4549 new DelayedSocketData(
4550 1, // wait for one write to finish before reading.
4551 data_reads, arraysize(data_reads),
4552 data_writes, arraysize(data_writes)));
4553 SSLSocketDataProvider proxy_ssl(true, OK); // SSL to the proxy
4554 proxy_ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated;
4555 proxy_ssl.next_proto = "spdy/2";
4556 proxy_ssl.was_npn_negotiated = true;
4557
4558 session_deps.socket_factory.AddSocketDataProvider(data.get());
4559 session_deps.socket_factory.AddSSLSocketDataProvider(&proxy_ssl);
4560
4561 TestCompletionCallback callback;
4562
4563 scoped_ptr<HttpTransaction> trans(
4564 new HttpNetworkTransaction(CreateSession(&session_deps)));
4565
4566 int rv = trans->Start(&request, &callback, BoundNetLog());
4567 EXPECT_EQ(ERR_IO_PENDING, rv);
4568
4569 rv = callback.WaitForResult();
4570 EXPECT_EQ(OK, rv);
4571 const HttpResponseInfo* response = trans->GetResponseInfo();
4572
4573 ASSERT_FALSE(response == NULL);
4574
4575 EXPECT_EQ(302, response->headers->response_code());
4576 std::string url;
4577 EXPECT_TRUE(response->headers->IsRedirect(&url));
4578 EXPECT_EQ("http://login.example.com/", url);
4579 }
4580
4581 // Test an HTTPS Proxy's ability to provide a response to a CONNECT request
4582 TEST_F(HttpNetworkTransactionTest, ErrorResponseTofHttpsConnectViaHttpsProxy) {
4583 SessionDependencies session_deps(
4584 ProxyService::CreateFixed("https://proxy:70"));
4585
4586 HttpRequestInfo request;
4587 request.method = "GET";
4588 request.url = GURL("https://www.google.com/");
4589 request.load_flags = 0;
4590
4591 MockWrite data_writes[] = {
4592 MockWrite("CONNECT www.google.com:443 HTTP/1.1\r\n"
4593 "Host: www.google.com\r\n"
4594 "Proxy-Connection: keep-alive\r\n\r\n"),
4595 };
4596
4597 MockRead data_reads[] = {
4598 MockRead("HTTP/1.1 404 Not Found\r\n"),
4599 MockRead("Content-Length: 23\r\n\r\n"),
4600 MockRead("The host does not exist"),
4601 MockRead(false, OK),
4602 };
4603
4604 StaticSocketDataProvider data(data_reads, arraysize(data_reads),
4605 data_writes, arraysize(data_writes));
4606 SSLSocketDataProvider proxy_ssl(true, OK); // SSL to the proxy
4607
4608 session_deps.socket_factory.AddSocketDataProvider(&data);
4609 session_deps.socket_factory.AddSSLSocketDataProvider(&proxy_ssl);
4610
4611 TestCompletionCallback callback;
4612
4613 scoped_ptr<HttpTransaction> trans(
4614 new HttpNetworkTransaction(CreateSession(&session_deps)));
4615
4616 int rv = trans->Start(&request, &callback, BoundNetLog());
4617 EXPECT_EQ(ERR_IO_PENDING, rv);
4618
4619 rv = callback.WaitForResult();
4620 EXPECT_EQ(OK, rv);
4621 const HttpResponseInfo* response = trans->GetResponseInfo();
4622
4623 ASSERT_FALSE(response == NULL);
4624
4625 EXPECT_EQ(404, response->headers->response_code());
4626 EXPECT_EQ(23, response->headers->GetContentLength());
4627 EXPECT_TRUE(HttpVersion(1, 1) == response->headers->GetHttpVersion());
4628 EXPECT_FALSE(response->ssl_info.is_valid());
vandebo (ex-Chrome) 2010/12/16 17:59:23 Just to double check, this is true in some other u
4629
4630 std::string response_data;
4631 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
4632 EXPECT_EQ("The host does not exist", response_data);
4633 }
4634
4635 // Test an HTTPS (SPDY) Proxy's ability to provide a response to a CONNECT
4636 // request
4637 TEST_F(HttpNetworkTransactionTest, ErrorResponseTofHttpsConnectViaSpdyProxy) {
4638 SessionDependencies session_deps(
4639 ProxyService::CreateFixed("https://proxy:70"));
4640
4641 HttpRequestInfo request;
4642 request.method = "GET";
4643 request.url = GURL("https://www.google.com/");
4644 request.load_flags = 0;
4645
4646 scoped_ptr<spdy::SpdyFrame> conn(ConstructSpdyConnect(NULL, 0, 1));
4647 scoped_ptr<spdy::SpdyFrame> goaway(ConstructSpdyRstStream(1, spdy::CANCEL));
4648 MockWrite data_writes[] = {
4649 CreateMockWrite(*conn.get(), 0, false),
4650 };
4651
4652 static const char* const kExtraHeaders[] = {
4653 "location",
4654 "http://login.example.com/",
4655 };
4656 scoped_ptr<spdy::SpdyFrame> resp(
4657 ConstructSpdySynReplyError("404 Not Found", kExtraHeaders,
4658 arraysize(kExtraHeaders)/2, 1));
4659 scoped_ptr<spdy::SpdyFrame> body(
4660 ConstructSpdyBodyFrame(1, "The host does not exist", 23, true));
4661 MockRead data_reads[] = {
4662 CreateMockRead(*resp.get(), 1, false),
4663 CreateMockRead(*body.get(), 2, false),
4664 MockRead(true, 0, 3), // EOF
4665 };
4666
4667 scoped_refptr<DelayedSocketData> data(
4668 new DelayedSocketData(
4669 1, // wait for one write to finish before reading.
4670 data_reads, arraysize(data_reads),
4671 data_writes, arraysize(data_writes)));
4672 SSLSocketDataProvider proxy_ssl(true, OK); // SSL to the proxy
4673 proxy_ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated;
4674 proxy_ssl.next_proto = "spdy/2";
4675 proxy_ssl.was_npn_negotiated = true;
4676
4677 session_deps.socket_factory.AddSocketDataProvider(data.get());
4678 session_deps.socket_factory.AddSSLSocketDataProvider(&proxy_ssl);
4679
4680 TestCompletionCallback callback;
4681
4682 scoped_ptr<HttpTransaction> trans(
4683 new HttpNetworkTransaction(CreateSession(&session_deps)));
4684
4685 int rv = trans->Start(&request, &callback, BoundNetLog());
4686 EXPECT_EQ(ERR_IO_PENDING, rv);
4687
4688 rv = callback.WaitForResult();
4689 EXPECT_EQ(OK, rv);
4690 const HttpResponseInfo* response = trans->GetResponseInfo();
4691
4692 ASSERT_FALSE(response == NULL);
4693
4694 EXPECT_EQ(404, response->headers->response_code());
4695 EXPECT_FALSE(response->ssl_info.is_valid());
4696
4697 std::string response_data;
4698 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data));
4699 EXPECT_EQ("The host does not exist", response_data);
4700 }
4701
4469 // Test HTTPS connections to a site with a bad certificate, going through an 4702 // Test HTTPS connections to a site with a bad certificate, going through an
4470 // HTTPS proxy 4703 // HTTPS proxy
4471 TEST_F(HttpNetworkTransactionTest, HTTPSBadCertificateViaHttpsProxy) { 4704 TEST_F(HttpNetworkTransactionTest, HTTPSBadCertificateViaHttpsProxy) {
4472 SessionDependencies session_deps(ProxyService::CreateFixed("https://proxy:70") ); 4705 SessionDependencies session_deps(ProxyService::CreateFixed("https://proxy:70") );
4473 4706
4474 HttpRequestInfo request; 4707 HttpRequestInfo request;
4475 request.method = "GET"; 4708 request.method = "GET";
4476 request.url = GURL("https://www.google.com/"); 4709 request.url = GURL("https://www.google.com/");
4477 request.load_flags = 0; 4710 request.load_flags = 0;
4478 4711
(...skipping 3479 matching lines...) Expand 10 before | Expand all | Expand 10 after
7958 rv = callback.WaitForResult(); 8191 rv = callback.WaitForResult();
7959 ASSERT_EQ(OK, rv); 8192 ASSERT_EQ(OK, rv);
7960 8193
7961 std::string contents; 8194 std::string contents;
7962 rv = ReadTransaction(trans.get(), &contents); 8195 rv = ReadTransaction(trans.get(), &contents);
7963 EXPECT_EQ(net::OK, rv); 8196 EXPECT_EQ(net::OK, rv);
7964 EXPECT_EQ("hello world", contents); 8197 EXPECT_EQ("hello world", contents);
7965 } 8198 }
7966 8199
7967 } // namespace net 8200 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698