diff options
author | rch@chromium.org <rch@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-11-12 00:01:13 +0000 |
---|---|---|
committer | rch@chromium.org <rch@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-11-12 00:01:13 +0000 |
commit | dc7bd1c5cdd3cb15bdd943bee4cd07168d16ee2b (patch) | |
tree | 2557b25e0fd4e0afdf58eba45a541b6ce9675d9a /net | |
parent | c1d12339b6bf13ec57c1720304e48257ef77e2d6 (diff) | |
download | chromium_src-dc7bd1c5cdd3cb15bdd943bee4cd07168d16ee2b.zip chromium_src-dc7bd1c5cdd3cb15bdd943bee4cd07168d16ee2b.tar.gz chromium_src-dc7bd1c5cdd3cb15bdd943bee4cd07168d16ee2b.tar.bz2 |
Add a new test to HttpNetworkTransaction that tests
HTTP Basic Proxy Auth over SPDY.
BUG=none
TEST=HttpNetworkTransactionTest.HttpsProxySpdyGetWithProxyAuth
Review URL: http://codereview.chromium.org/4389001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@65877 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net')
-rw-r--r-- | net/http/http_network_transaction_unittest.cc | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc index 32656bf..fd66d8d 100644 --- a/net/http/http_network_transaction_unittest.cc +++ b/net/http/http_network_transaction_unittest.cc @@ -1952,6 +1952,113 @@ TEST_F(HttpNetworkTransactionTest, HttpsProxySpdyGet) { EXPECT_EQ(net::kUploadData, response_data); } +// Test a SPDY get through an HTTPS Proxy. +TEST_F(HttpNetworkTransactionTest, HttpsProxySpdyGetWithProxyAuth) { + // Configure against https proxy server "proxy:70". + SessionDependencies session_deps( + ProxyService::CreateFixed("https://proxy:70")); + CapturingBoundNetLog log(CapturingNetLog::kUnbounded); + session_deps.net_log = log.bound().net_log(); + scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); + + HttpRequestInfo request; + request.method = "GET"; + request.url = GURL("http://www.google.com/"); + request.load_flags = 0; + + // The first request will be a bare GET, the second request will be a + // GET with a Proxy-Authorization header. + scoped_ptr<spdy::SpdyFrame> req_get( + ConstructSpdyGet(NULL, 0, false, 1, LOWEST, false)); + const char* const kExtraAuthorizationHeaders[] = { + "proxy-authorization", + "Basic Zm9vOmJhcg==", + }; + scoped_ptr<spdy::SpdyFrame> req_get_authorization( + ConstructSpdyGet( + kExtraAuthorizationHeaders, arraysize(kExtraAuthorizationHeaders)/2, + false, 3, LOWEST, false)); + MockWrite spdy_writes[] = { + CreateMockWrite(*req_get, 1), + CreateMockWrite(*req_get_authorization, 4), + }; + + // The first response is a 407 proxy authentication challenge, and the second + // response will be a 200 response since the second request includes a valid + // Authorization header. + const char* const kExtraAuthenticationHeaders[] = { + "Proxy-Authenticate", + "Basic realm=\"MyRealm1\"" + }; + scoped_ptr<spdy::SpdyFrame> resp_authentication( + ConstructSpdySynReplyError( + "407 Proxy Authentication Required", + kExtraAuthenticationHeaders, arraysize(kExtraAuthenticationHeaders)/2, + 1)); + scoped_ptr<spdy::SpdyFrame> body_authentication( + ConstructSpdyBodyFrame(1, true)); + scoped_ptr<spdy::SpdyFrame> resp_data(ConstructSpdyGetSynReply(NULL, 0, 3)); + scoped_ptr<spdy::SpdyFrame> body_data(ConstructSpdyBodyFrame(3, true)); + MockRead spdy_reads[] = { + CreateMockRead(*resp_authentication, 2), + CreateMockRead(*body_authentication, 3), + CreateMockRead(*resp_data, 5), + CreateMockRead(*body_data, 6), + MockRead(true, 0, 7), + }; + + scoped_refptr<OrderedSocketData> data( + new OrderedSocketData(spdy_reads, arraysize(spdy_reads), + spdy_writes, arraysize(spdy_writes))); + session_deps.socket_factory.AddSocketDataProvider(data); + + SSLSocketDataProvider ssl(true, OK); + ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated; + ssl.next_proto = "spdy/2"; + ssl.was_npn_negotiated = true; + session_deps.socket_factory.AddSSLSocketDataProvider(&ssl); + + TestCompletionCallback callback1; + + scoped_ptr<HttpTransaction> trans(new HttpNetworkTransaction(session)); + + int rv = trans->Start(&request, &callback1, log.bound()); + EXPECT_EQ(ERR_IO_PENDING, rv); + + rv = callback1.WaitForResult(); + EXPECT_EQ(OK, rv); + + const HttpResponseInfo* const response = trans->GetResponseInfo(); + + ASSERT_TRUE(response != NULL); + ASSERT_TRUE(response->headers != NULL); + EXPECT_EQ(407, response->headers->response_code()); + EXPECT_TRUE(response->was_fetched_via_spdy); + + // The password prompt info should have been set in response->auth_challenge. + ASSERT_TRUE(response->auth_challenge.get() != NULL); + EXPECT_TRUE(response->auth_challenge->is_proxy); + EXPECT_EQ(L"proxy:70", response->auth_challenge->host_and_port); + EXPECT_EQ(L"MyRealm1", response->auth_challenge->realm); + EXPECT_EQ(L"basic", response->auth_challenge->scheme); + + TestCompletionCallback callback2; + + rv = trans->RestartWithAuth(kFoo, kBar, &callback2); + EXPECT_EQ(ERR_IO_PENDING, rv); + + rv = callback2.WaitForResult(); + EXPECT_EQ(OK, rv); + + const HttpResponseInfo* const response_restart = trans->GetResponseInfo(); + + ASSERT_TRUE(response_restart != NULL); + ASSERT_TRUE(response_restart->headers != NULL); + EXPECT_EQ(200, response_restart->headers->response_code()); + // The password prompt info should not be set. + EXPECT_TRUE(response_restart->auth_challenge.get() == NULL); +} + // Test a SPDY CONNECT through an HTTPS Proxy to an HTTPS (non-SPDY) Server. TEST_F(HttpNetworkTransactionTest, HttpsProxySpdyConnectHttps) { // Configure against https proxy server "proxy:70". |