diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/http/failing_http_transaction_factory.cc | 6 | ||||
-rw-r--r-- | net/http/http_cache_transaction.cc | 11 | ||||
-rw-r--r-- | net/http/http_network_layer_unittest.cc | 5 | ||||
-rw-r--r-- | net/http/http_network_transaction.cc | 8 | ||||
-rw-r--r-- | net/http/http_network_transaction_unittest.cc | 43 | ||||
-rw-r--r-- | net/http/http_transaction.h | 4 | ||||
-rw-r--r-- | net/spdy/spdy_network_transaction_unittest.cc | 1 | ||||
-rw-r--r-- | net/url_request/url_request_unittest.cc | 106 |
8 files changed, 122 insertions, 62 deletions
diff --git a/net/http/failing_http_transaction_factory.cc b/net/http/failing_http_transaction_factory.cc index b871576..07023f2 100644 --- a/net/http/failing_http_transaction_factory.cc +++ b/net/http/failing_http_transaction_factory.cc @@ -10,6 +10,7 @@ #include "base/message_loop/message_loop.h" #include "net/base/load_timing_info.h" #include "net/base/upload_progress.h" +#include "net/http/http_response_info.h" #include "net/socket/connection_attempts.h" namespace net { @@ -20,8 +21,6 @@ class HttpRequestHeaders; class IOBuffer; class X509Certificate; -struct HttpRequestInfo; - namespace { // A simple class to interpose between the cache and network http layers. @@ -66,6 +65,7 @@ class FailingHttpTransaction : public HttpTransaction { private: Error error_; + HttpResponseInfo response_; }; FailingHttpTransaction::FailingHttpTransaction(Error error) : error_(error) { @@ -125,7 +125,7 @@ void FailingHttpTransaction::DoneReading() { } const HttpResponseInfo* FailingHttpTransaction::GetResponseInfo() const { - return NULL; + return &response_; } LoadState FailingHttpTransaction::GetLoadState() const { diff --git a/net/http/http_cache_transaction.cc b/net/http/http_cache_transaction.cc index 90a98461..e39a6c1 100644 --- a/net/http/http_cache_transaction.cc +++ b/net/http/http_cache_transaction.cc @@ -573,10 +573,7 @@ const HttpResponseInfo* HttpCache::Transaction::GetResponseInfo() const { // Null headers means we encountered an error or haven't a response yet if (auth_response_.headers.get()) return &auth_response_; - return (response_.headers.get() || response_.ssl_info.cert.get() || - response_.cert_request_info.get()) - ? &response_ - : NULL; + return &response_; } LoadState HttpCache::Transaction::GetLoadState() const { @@ -1092,21 +1089,23 @@ int HttpCache::Transaction::DoSendRequestComplete(int result) { return OK; } + const HttpResponseInfo* response = network_trans_->GetResponseInfo(); + response_.network_accessed = response->network_accessed; + // Do not record requests that have network errors or restarts. UpdateTransactionPattern(PATTERN_NOT_COVERED); if (IsCertificateError(result)) { - const HttpResponseInfo* response = network_trans_->GetResponseInfo(); // If we get a certificate error, then there is a certificate in ssl_info, // so GetResponseInfo() should never return NULL here. DCHECK(response); response_.ssl_info = response->ssl_info; } else if (result == ERR_SSL_CLIENT_AUTH_CERT_NEEDED) { - const HttpResponseInfo* response = network_trans_->GetResponseInfo(); DCHECK(response); response_.cert_request_info = response->cert_request_info; } else if (response_.was_cached) { DoneWritingToEntry(true); } + return result; } diff --git a/net/http/http_network_layer_unittest.cc b/net/http/http_network_layer_unittest.cc index c49d5ec..9128cdd3 100644 --- a/net/http/http_network_layer_unittest.cc +++ b/net/http/http_network_layer_unittest.cc @@ -395,9 +395,8 @@ TEST_F(HttpNetworkLayerTest, NetworkUnVerified) { rv = trans->Start(&request_info, callback.callback(), BoundNetLog()); ASSERT_EQ(ERR_CONNECTION_RESET, callback.GetResult(rv)); - // If the response info is null, that means that any consumer won't - // see the network accessed bit set. - EXPECT_EQ(NULL, trans->GetResponseInfo()); + // network_accessed is true; the HTTP stack did try to make a connection. + EXPECT_TRUE(trans->GetResponseInfo()->network_accessed); } } // namespace diff --git a/net/http/http_network_transaction.cc b/net/http/http_network_transaction.cc index 998b7ef..cf73369 100644 --- a/net/http/http_network_transaction.cc +++ b/net/http/http_network_transaction.cc @@ -395,10 +395,7 @@ int64 HttpNetworkTransaction::GetTotalReceivedBytes() const { void HttpNetworkTransaction::DoneReading() {} const HttpResponseInfo* HttpNetworkTransaction::GetResponseInfo() const { - return ((headers_valid_ && response_.headers.get()) || - response_.ssl_info.cert.get() || response_.cert_request_info.get()) - ? &response_ - : NULL; + return &response_; } LoadState HttpNetworkTransaction::GetLoadState() const { @@ -736,6 +733,8 @@ int HttpNetworkTransaction::DoCreateStream() { FROM_HERE_WITH_EXPLICIT_FUNCTION( "424359 HttpNetworkTransaction::DoCreateStream")); + response_.network_accessed = true; + next_state_ = STATE_CREATE_STREAM_COMPLETE; if (ForWebSocketHandshake()) { stream_request_.reset( @@ -974,7 +973,6 @@ int HttpNetworkTransaction::DoSendRequestComplete(int result) { send_end_time_ = base::TimeTicks::Now(); if (result < 0) return HandleIOError(result); - response_.network_accessed = true; next_state_ = STATE_READ_HEADERS; return OK; } diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc index 6645f5a..ea328a5 100644 --- a/net/http/http_network_transaction_unittest.cc +++ b/net/http/http_network_transaction_unittest.cc @@ -1584,9 +1584,6 @@ TEST_P(HttpNetworkTransactionTest, NonKeepAliveConnectionReset) { rv = callback.WaitForResult(); EXPECT_EQ(ERR_CONNECTION_RESET, rv); - - const HttpResponseInfo* response = trans->GetResponseInfo(); - EXPECT_TRUE(response == NULL); } // What do various browsers do when the server closes a non-keepalive @@ -1645,7 +1642,6 @@ TEST_P(HttpNetworkTransactionTest, ThrottleBeforeNetworkStart) { // Should have deferred for network start. EXPECT_TRUE(net_start_handler.observed_before_network_start()); EXPECT_EQ(LOAD_STATE_WAITING_FOR_DELEGATE, trans->GetLoadState()); - EXPECT_TRUE(trans->GetResponseInfo() == NULL); trans->ResumeNetworkStart(); rv = callback.WaitForResult(); @@ -1686,7 +1682,6 @@ TEST_P(HttpNetworkTransactionTest, ThrottleAndCancelBeforeNetworkStart) { // Should have deferred for network start. EXPECT_TRUE(net_start_handler.observed_before_network_start()); EXPECT_EQ(LOAD_STATE_WAITING_FOR_DELEGATE, trans->GetLoadState()); - EXPECT_TRUE(trans->GetResponseInfo() == NULL); } // Next 2 cases (KeepAliveEarlyClose and KeepAliveEarlyClose2) are regression @@ -5003,9 +4998,6 @@ TEST_P(HttpNetworkTransactionTest, LargeHeadersNoBody) { rv = callback.WaitForResult(); EXPECT_EQ(ERR_RESPONSE_HEADERS_TOO_BIG, rv); - - const HttpResponseInfo* response = trans->GetResponseInfo(); - EXPECT_TRUE(response == NULL); } // Make sure that we don't try to reuse a TCPClientSocket when failing to @@ -5055,9 +5047,6 @@ TEST_P(HttpNetworkTransactionTest, rv = callback1.WaitForResult(); EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, rv); - const HttpResponseInfo* response = trans->GetResponseInfo(); - EXPECT_TRUE(response == NULL); - // Empty the current queue. This is necessary because idle sockets are // added to the connection pool asynchronously with a PostTask. base::MessageLoop::current()->RunUntilIdle(); @@ -8534,9 +8523,6 @@ TEST_P(HttpNetworkTransactionTest, UploadUnreadableFile) { rv = callback.WaitForResult(); EXPECT_EQ(ERR_ACCESS_DENIED, rv); - const HttpResponseInfo* response = trans->GetResponseInfo(); - EXPECT_FALSE(response); - base::DeleteFile(temp_file, false); } @@ -10186,10 +10172,7 @@ TEST_P(HttpNetworkTransactionTest, GenerateAuthToken) { // Compare results with expected data. EXPECT_EQ(read_write_round.expected_rv, rv); const HttpResponseInfo* response = trans.GetResponseInfo(); - if (read_write_round.expected_rv == OK) { - ASSERT_TRUE(response != NULL); - } else { - EXPECT_TRUE(response == NULL); + if (read_write_round.expected_rv != OK) { EXPECT_EQ(round + 1, test_config.num_auth_rounds); continue; } @@ -12736,8 +12719,6 @@ TEST_P(HttpNetworkTransactionTest, HttpSyncConnectError) { rv = callback.WaitForResult(); EXPECT_EQ(ERR_CONNECTION_REFUSED, rv); - EXPECT_EQ(NULL, trans->GetResponseInfo()); - // We don't care whether this succeeds or fails, but it shouldn't crash. HttpRequestHeaders request_headers; trans->GetFullRequestHeaders(&request_headers); @@ -12771,8 +12752,6 @@ TEST_P(HttpNetworkTransactionTest, HttpAsyncConnectError) { rv = callback.WaitForResult(); EXPECT_EQ(ERR_CONNECTION_REFUSED, rv); - EXPECT_EQ(NULL, trans->GetResponseInfo()); - // We don't care whether this succeeds or fails, but it shouldn't crash. HttpRequestHeaders request_headers; trans->GetFullRequestHeaders(&request_headers); @@ -12812,8 +12791,6 @@ TEST_P(HttpNetworkTransactionTest, HttpSyncWriteError) { rv = callback.WaitForResult(); EXPECT_EQ(ERR_CONNECTION_RESET, rv); - EXPECT_EQ(NULL, trans->GetResponseInfo()); - HttpRequestHeaders request_headers; EXPECT_TRUE(trans->GetFullRequestHeaders(&request_headers)); EXPECT_TRUE(request_headers.HasHeader("Host")); @@ -12848,8 +12825,6 @@ TEST_P(HttpNetworkTransactionTest, HttpAsyncWriteError) { rv = callback.WaitForResult(); EXPECT_EQ(ERR_CONNECTION_RESET, rv); - EXPECT_EQ(NULL, trans->GetResponseInfo()); - HttpRequestHeaders request_headers; EXPECT_TRUE(trans->GetFullRequestHeaders(&request_headers)); EXPECT_TRUE(request_headers.HasHeader("Host")); @@ -12887,8 +12862,6 @@ TEST_P(HttpNetworkTransactionTest, HttpSyncReadError) { rv = callback.WaitForResult(); EXPECT_EQ(ERR_CONNECTION_RESET, rv); - EXPECT_EQ(NULL, trans->GetResponseInfo()); - HttpRequestHeaders request_headers; EXPECT_TRUE(trans->GetFullRequestHeaders(&request_headers)); EXPECT_TRUE(request_headers.HasHeader("Host")); @@ -12926,8 +12899,6 @@ TEST_P(HttpNetworkTransactionTest, HttpAsyncReadError) { rv = callback.WaitForResult(); EXPECT_EQ(ERR_CONNECTION_RESET, rv); - EXPECT_EQ(NULL, trans->GetResponseInfo()); - HttpRequestHeaders request_headers; EXPECT_TRUE(trans->GetFullRequestHeaders(&request_headers)); EXPECT_TRUE(request_headers.HasHeader("Host")); @@ -13956,9 +13927,6 @@ TEST_P(HttpNetworkTransactionTest, PostIgnoresNonErrorResponseAfterReset) { rv = callback.WaitForResult(); EXPECT_EQ(ERR_CONNECTION_RESET, rv); - - const HttpResponseInfo* response = trans->GetResponseInfo(); - EXPECT_TRUE(response == NULL); } TEST_P(HttpNetworkTransactionTest, @@ -14003,9 +13971,6 @@ TEST_P(HttpNetworkTransactionTest, rv = callback.WaitForResult(); EXPECT_EQ(ERR_CONNECTION_RESET, rv); - - const HttpResponseInfo* response = trans->GetResponseInfo(); - EXPECT_TRUE(response == NULL); } TEST_P(HttpNetworkTransactionTest, PostIgnoresHttp09ResponseAfterReset) { @@ -14046,9 +14011,6 @@ TEST_P(HttpNetworkTransactionTest, PostIgnoresHttp09ResponseAfterReset) { rv = callback.WaitForResult(); EXPECT_EQ(ERR_CONNECTION_RESET, rv); - - const HttpResponseInfo* response = trans->GetResponseInfo(); - EXPECT_TRUE(response == NULL); } TEST_P(HttpNetworkTransactionTest, PostIgnoresPartial400HeadersAfterReset) { @@ -14089,9 +14051,6 @@ TEST_P(HttpNetworkTransactionTest, PostIgnoresPartial400HeadersAfterReset) { rv = callback.WaitForResult(); EXPECT_EQ(ERR_CONNECTION_RESET, rv); - - const HttpResponseInfo* response = trans->GetResponseInfo(); - EXPECT_TRUE(response == NULL); } // Verify that proxy headers are not sent to the destination server when diff --git a/net/http/http_transaction.h b/net/http/http_transaction.h index 5b7ea9b..6b8ea70 100644 --- a/net/http/http_transaction.h +++ b/net/http/http_transaction.h @@ -133,8 +133,8 @@ class NET_EXPORT_PRIVATE HttpTransaction { // entire response body is to be ignored (e.g., in a redirect). virtual void DoneReading() = 0; - // Returns the response info for this transaction or NULL if the response - // info is not available. + // Returns the response info for this transaction. Must not be called until + // |Start| completes. virtual const HttpResponseInfo* GetResponseInfo() const = 0; // Returns the load state for this transaction. diff --git a/net/spdy/spdy_network_transaction_unittest.cc b/net/spdy/spdy_network_transaction_unittest.cc index a29ecf4..b75405b 100644 --- a/net/spdy/spdy_network_transaction_unittest.cc +++ b/net/spdy/spdy_network_transaction_unittest.cc @@ -5505,7 +5505,6 @@ TEST_P(SpdyNetworkTransactionTest, ServerPushWithNoStatusHeaderFrames) { // Verify the SYN_REPLY. // Copy the response info, because trans goes away. HttpResponseInfo response = *trans->GetResponseInfo(); - ASSERT_TRUE(trans2->GetResponseInfo() == NULL); VerifyStreamsClosed(helper); diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc index 20687e9..fd9a650 100644 --- a/net/url_request/url_request_unittest.cc +++ b/net/url_request/url_request_unittest.cc @@ -6823,6 +6823,59 @@ TEST_F(URLRequestTestHTTP, NetworkSuspendTestNoCache) { EXPECT_EQ(ERR_NETWORK_IO_SUSPENDED, req->status().error()); } +TEST_F(URLRequestTestHTTP, NetworkAccessedSetOnNetworkRequest) { + ASSERT_TRUE(test_server_.Start()); + + TestDelegate d; + GURL test_url(test_server_.GetURL(std::string())); + scoped_ptr<URLRequest> req( + default_context_.CreateRequest(test_url, DEFAULT_PRIORITY, &d)); + + req->Start(); + base::RunLoop().Run(); + + EXPECT_TRUE(req->response_info().network_accessed); +} + +TEST_F(URLRequestTestHTTP, NetworkAccessedClearOnCachedResponse) { + ASSERT_TRUE(test_server_.Start()); + + // Populate the cache. + TestDelegate d; + scoped_ptr<URLRequest> req(default_context_.CreateRequest( + test_server_.GetURL("cachetime"), DEFAULT_PRIORITY, &d)); + req->Start(); + base::RunLoop().Run(); + + EXPECT_EQ(URLRequestStatus::SUCCESS, req->status().status()); + EXPECT_TRUE(req->response_info().network_accessed); + EXPECT_FALSE(req->response_info().was_cached); + + req = default_context_.CreateRequest(test_server_.GetURL("cachetime"), + DEFAULT_PRIORITY, &d); + req->Start(); + base::RunLoop().Run(); + + EXPECT_EQ(URLRequestStatus::SUCCESS, req->status().status()); + EXPECT_FALSE(req->response_info().network_accessed); + EXPECT_TRUE(req->response_info().was_cached); +} + +TEST_F(URLRequestTestHTTP, NetworkAccessedClearOnLoadOnlyFromCache) { + ASSERT_TRUE(test_server_.Start()); + + TestDelegate d; + GURL test_url(test_server_.GetURL(std::string())); + scoped_ptr<URLRequest> req( + default_context_.CreateRequest(test_url, DEFAULT_PRIORITY, &d)); + req->SetLoadFlags(LOAD_ONLY_FROM_CACHE); + + req->Start(); + base::RunLoop().Run(); + + EXPECT_FALSE(req->response_info().network_accessed); +} + class URLRequestInterceptorTestHTTP : public URLRequestTestHTTP { public: // TODO(bengr): Merge this with the URLRequestInterceptorHTTPTest fixture, @@ -9089,4 +9142,57 @@ TEST_F(URLRequestTestFTP, DISABLED_FTPCacheLoginBoxCredentials) { } #endif // !defined(DISABLE_FTP_SUPPORT) +TEST_F(URLRequestTest, NetworkAccessedClearBeforeNetworkStart) { + TestDelegate d; + scoped_ptr<URLRequest> req(default_context_.CreateRequest( + GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d)); + d.set_quit_on_network_start(true); + + EXPECT_FALSE(req->response_info().network_accessed); + + req->Start(); + base::RunLoop().Run(); + + EXPECT_EQ(1, d.received_before_network_start_count()); + EXPECT_EQ(0, d.response_started_count()); + EXPECT_FALSE(req->response_info().network_accessed); + + req->ResumeNetworkStart(); + base::RunLoop().Run(); +} + +TEST_F(URLRequestTest, NetworkAccessedClearOnDataRequest) { + TestDelegate d; + scoped_ptr<URLRequest> req( + default_context_.CreateRequest(GURL("data:,"), DEFAULT_PRIORITY, &d)); + + EXPECT_FALSE(req->response_info().network_accessed); + + req->Start(); + base::RunLoop().Run(); + + EXPECT_EQ(1, default_network_delegate_.completed_requests()); + EXPECT_FALSE(req->response_info().network_accessed); +} + +TEST_F(URLRequestTest, NetworkAccessedSetOnHostResolutionFailure) { + MockHostResolver host_resolver; + TestNetworkDelegate network_delegate; // Must outlive URLRequest. + TestURLRequestContext context(true); + context.set_network_delegate(&network_delegate); + context.set_host_resolver(&host_resolver); + host_resolver.rules()->AddSimulatedFailure("*"); + context.Init(); + + TestDelegate d; + scoped_ptr<URLRequest> req(context.CreateRequest( + GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d)); + + EXPECT_FALSE(req->response_info().network_accessed); + + req->Start(); + base::RunLoop().Run(); + EXPECT_TRUE(req->response_info().network_accessed); +} + } // namespace net |