summaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
Diffstat (limited to 'net')
-rw-r--r--net/http/failing_http_transaction_factory.cc6
-rw-r--r--net/http/http_cache_transaction.cc11
-rw-r--r--net/http/http_network_layer_unittest.cc5
-rw-r--r--net/http/http_network_transaction.cc8
-rw-r--r--net/http/http_network_transaction_unittest.cc43
-rw-r--r--net/http/http_transaction.h4
-rw-r--r--net/spdy/spdy_network_transaction_unittest.cc1
-rw-r--r--net/url_request/url_request_unittest.cc106
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