diff options
author | akalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-14 18:01:47 +0000 |
---|---|---|
committer | akalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-14 18:01:47 +0000 |
commit | bf828984a28131c7531b05b7dcaece484d9212e4 (patch) | |
tree | eee72c3788d037ab23d8e1dbbf94072aca8fa98d | |
parent | db9a39f1e3645d8b8bb6ccc0dcc23f34726b06e5 (diff) | |
download | chromium_src-bf828984a28131c7531b05b7dcaece484d9212e4.zip chromium_src-bf828984a28131c7531b05b7dcaece484d9212e4.tar.gz chromium_src-bf828984a28131c7531b05b7dcaece484d9212e4.tar.bz2 |
[Net] Propagate priority changes from HttpNetworkTransaction to its request
Also propagate it further down to HttpStreamFactoryImpl::Job.
BUG=166689
R=mmenke@chromium.org
Review URL: https://codereview.chromium.org/19866006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@217582 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | net/http/http_network_transaction.cc | 5 | ||||
-rw-r--r-- | net/http/http_network_transaction_unittest.cc | 158 | ||||
-rw-r--r-- | net/http/http_stream_factory.h | 3 | ||||
-rw-r--r-- | net/http/http_stream_factory_impl.h | 7 | ||||
-rw-r--r-- | net/http/http_stream_factory_impl_job.cc | 9 | ||||
-rw-r--r-- | net/http/http_stream_factory_impl_job.h | 3 | ||||
-rw-r--r-- | net/http/http_stream_factory_impl_request.cc | 9 | ||||
-rw-r--r-- | net/http/http_stream_factory_impl_request.h | 1 | ||||
-rw-r--r-- | net/http/http_stream_factory_impl_request_unittest.cc | 98 | ||||
-rw-r--r-- | net/net.gyp | 1 |
10 files changed, 288 insertions, 6 deletions
diff --git a/net/http/http_network_transaction.cc b/net/http/http_network_transaction.cc index 70292be..4d1cf65 100644 --- a/net/http/http_network_transaction.cc +++ b/net/http/http_network_transaction.cc @@ -419,8 +419,9 @@ bool HttpNetworkTransaction::GetLoadTimingInfo( void HttpNetworkTransaction::SetPriority(RequestPriority priority) { priority_ = priority; - // TODO(akalin): Plumb this through to |stream_request_| and - // |stream_|. + if (stream_request_) + stream_request_->SetPriority(priority); + // TODO(akalin): Plumb this through to |stream_| also. } void HttpNetworkTransaction::OnStreamReady(const SSLConfig& used_ssl_config, diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc index 5f8dac2..e59333e 100644 --- a/net/http/http_network_transaction_unittest.cc +++ b/net/http/http_network_transaction_unittest.cc @@ -15,6 +15,7 @@ #include "base/files/file_path.h" #include "base/json/json_writer.h" #include "base/memory/scoped_ptr.h" +#include "base/memory/weak_ptr.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "base/test/test_file_util.h" @@ -11680,4 +11681,161 @@ TEST_P(HttpNetworkTransactionTest, GetFullRequestHeadersIncludesExtraHeader) { EXPECT_EQ("bar", foo); } +namespace { + +// Fake HttpStreamRequest that simply records calls to SetPriority(). +class FakeStreamRequest : public HttpStreamRequest, + public base::SupportsWeakPtr<FakeStreamRequest> { + public: + explicit FakeStreamRequest(RequestPriority priority) : priority_(priority) {} + virtual ~FakeStreamRequest() {} + + RequestPriority priority() const { return priority_; } + + virtual int RestartTunnelWithProxyAuth( + const AuthCredentials& credentials) OVERRIDE { + ADD_FAILURE(); + return ERR_UNEXPECTED; + } + + virtual LoadState GetLoadState() const OVERRIDE { + ADD_FAILURE(); + return LoadState(); + } + + virtual void SetPriority(RequestPriority priority) OVERRIDE { + priority_ = priority; + } + + virtual bool was_npn_negotiated() const OVERRIDE { + ADD_FAILURE(); + return false; + } + + virtual NextProto protocol_negotiated() const OVERRIDE { + ADD_FAILURE(); + return kProtoUnknown; + } + + virtual bool using_spdy() const OVERRIDE { + ADD_FAILURE(); + return false; + } + + private: + RequestPriority priority_; + + DISALLOW_COPY_AND_ASSIGN(FakeStreamRequest); +}; + +// Fake HttpStreamFactory that vends FakeStreamRequests. +class FakeStreamFactory : public HttpStreamFactory { + public: + FakeStreamFactory() {} + virtual ~FakeStreamFactory() {} + + // Returns a WeakPtr<> to the last HttpStreamRequest returned by + // RequestStream() (which may be NULL if it was destroyed already). + base::WeakPtr<FakeStreamRequest> last_stream_request() { + return last_stream_request_; + } + + virtual HttpStreamRequest* RequestStream( + const HttpRequestInfo& info, + RequestPriority priority, + const SSLConfig& server_ssl_config, + const SSLConfig& proxy_ssl_config, + HttpStreamRequest::Delegate* delegate, + const BoundNetLog& net_log) OVERRIDE { + FakeStreamRequest* fake_request = new FakeStreamRequest(priority); + last_stream_request_ = fake_request->AsWeakPtr(); + return fake_request; + } + + virtual HttpStreamRequest* RequestWebSocketStream( + const HttpRequestInfo& info, + RequestPriority priority, + const SSLConfig& server_ssl_config, + const SSLConfig& proxy_ssl_config, + HttpStreamRequest::Delegate* delegate, + WebSocketStreamBase::Factory* factory, + const BoundNetLog& net_log) OVERRIDE { + ADD_FAILURE(); + return NULL; + } + + virtual void PreconnectStreams(int num_streams, + const HttpRequestInfo& info, + RequestPriority priority, + const SSLConfig& server_ssl_config, + const SSLConfig& proxy_ssl_config) OVERRIDE { + ADD_FAILURE(); + } + + virtual base::Value* PipelineInfoToValue() const OVERRIDE { + ADD_FAILURE(); + return NULL; + } + + virtual const HostMappingRules* GetHostMappingRules() const OVERRIDE { + ADD_FAILURE(); + return NULL; + } + + private: + base::WeakPtr<FakeStreamRequest> last_stream_request_; + + DISALLOW_COPY_AND_ASSIGN(FakeStreamFactory); +}; + +} // namespace + +// Make sure that HttpNetworkTransaction passes on its priority to its +// stream request on start. +TEST_P(HttpNetworkTransactionTest, SetStreamRequestPriorityOnStart) { + scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); + HttpNetworkSessionPeer peer(session); + FakeStreamFactory* fake_factory = new FakeStreamFactory(); + peer.SetHttpStreamFactory(fake_factory); + + HttpNetworkTransaction trans(LOW, session); + + ASSERT_TRUE(fake_factory->last_stream_request() == NULL); + + HttpRequestInfo request; + TestCompletionCallback callback; + EXPECT_EQ(ERR_IO_PENDING, + trans.Start(&request, callback.callback(), BoundNetLog())); + + base::WeakPtr<FakeStreamRequest> fake_request = + fake_factory->last_stream_request(); + ASSERT_TRUE(fake_request != NULL); + EXPECT_EQ(LOW, fake_request->priority()); +} + +// Make sure that HttpNetworkTransaction passes on its priority +// updates to its stream request. +TEST_P(HttpNetworkTransactionTest, SetStreamRequestPriority) { + scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); + HttpNetworkSessionPeer peer(session); + FakeStreamFactory* fake_factory = new FakeStreamFactory(); + peer.SetHttpStreamFactory(fake_factory); + + HttpNetworkTransaction trans(LOW, session); + + HttpRequestInfo request; + TestCompletionCallback callback; + EXPECT_EQ(ERR_IO_PENDING, + trans.Start(&request, callback.callback(), BoundNetLog())); + + base::WeakPtr<FakeStreamRequest> fake_request = + fake_factory->last_stream_request(); + ASSERT_TRUE(fake_request != NULL); + EXPECT_EQ(LOW, fake_request->priority()); + + trans.SetPriority(LOWEST); + ASSERT_TRUE(fake_request != NULL); + EXPECT_EQ(LOWEST, fake_request->priority()); +} + } // namespace net diff --git a/net/http/http_stream_factory.h b/net/http/http_stream_factory.h index 6db6905..0de3b65 100644 --- a/net/http/http_stream_factory.h +++ b/net/http/http_stream_factory.h @@ -157,6 +157,9 @@ class NET_EXPORT_PRIVATE HttpStreamRequest { virtual int RestartTunnelWithProxyAuth( const AuthCredentials& credentials) = 0; + // Called when the priority of the parent transaction changes. + virtual void SetPriority(RequestPriority priority) = 0; + // Returns the LoadState for the request. virtual LoadState GetLoadState() const = 0; diff --git a/net/http/http_stream_factory_impl.h b/net/http/http_stream_factory_impl.h index 3949f38..4339fd3 100644 --- a/net/http/http_stream_factory_impl.h +++ b/net/http/http_stream_factory_impl.h @@ -9,6 +9,7 @@ #include <set> #include <vector> +#include "base/gtest_prod_util.h" #include "base/memory/ref_counted.h" #include "net/base/host_port_pair.h" #include "net/base/net_log.h" @@ -66,8 +67,10 @@ class NET_EXPORT_PRIVATE HttpStreamFactoryImpl : size_t num_orphaned_jobs() const { return orphaned_job_set_.size(); } private: - class Request; - class Job; + FRIEND_TEST_ALL_PREFIXES(HttpStreamFactoryImplRequestTest, SetPriority); + + class NET_EXPORT_PRIVATE Request; + class NET_EXPORT_PRIVATE Job; typedef std::set<Request*> RequestSet; typedef std::vector<Request*> RequestVector; diff --git a/net/http/http_stream_factory_impl_job.cc b/net/http/http_stream_factory_impl_job.cc index b2eee3b..c0383f4 100644 --- a/net/http/http_stream_factory_impl_job.cc +++ b/net/http/http_stream_factory_impl_job.cc @@ -230,12 +230,17 @@ void HttpStreamFactoryImpl::Job::Orphan(const Request* request) { } } +void HttpStreamFactoryImpl::Job::SetPriority(RequestPriority priority) { + priority_ = priority; + // TODO(akalin): Propagate this to |connection_| and maybe the + // preconnect state. +} + bool HttpStreamFactoryImpl::Job::was_npn_negotiated() const { return was_npn_negotiated_; } -NextProto HttpStreamFactoryImpl::Job::protocol_negotiated() - const { +NextProto HttpStreamFactoryImpl::Job::protocol_negotiated() const { return protocol_negotiated_; } diff --git a/net/http/http_stream_factory_impl_job.h b/net/http/http_stream_factory_impl_job.h index 2c2eb34..01a794a 100644 --- a/net/http/http_stream_factory_impl_job.h +++ b/net/http/http_stream_factory_impl_job.h @@ -74,6 +74,9 @@ class HttpStreamFactoryImpl::Job { // Used to detach the Job from |request|. void Orphan(const Request* request); + void SetPriority(RequestPriority priority); + + RequestPriority priority() const { return priority_; } bool was_npn_negotiated() const; NextProto protocol_negotiated() const; bool using_spdy() const; diff --git a/net/http/http_stream_factory_impl_request.cc b/net/http/http_stream_factory_impl_request.cc index e73a897..57190ed 100644 --- a/net/http/http_stream_factory_impl_request.cc +++ b/net/http/http_stream_factory_impl_request.cc @@ -215,6 +215,15 @@ int HttpStreamFactoryImpl::Request::RestartTunnelWithProxyAuth( return bound_job_->RestartTunnelWithProxyAuth(credentials); } +void HttpStreamFactoryImpl::Request::SetPriority(RequestPriority priority) { + for (std::set<HttpStreamFactoryImpl::Job*>::const_iterator it = jobs_.begin(); + it != jobs_.end(); ++it) { + (*it)->SetPriority(priority); + } + if (bound_job_) + bound_job_->SetPriority(priority); +} + LoadState HttpStreamFactoryImpl::Request::GetLoadState() const { if (bound_job_.get()) return bound_job_->GetLoadState(); diff --git a/net/http/http_stream_factory_impl_request.h b/net/http/http_stream_factory_impl_request.h index 169e1f5..d6f9b02 100644 --- a/net/http/http_stream_factory_impl_request.h +++ b/net/http/http_stream_factory_impl_request.h @@ -105,6 +105,7 @@ class HttpStreamFactoryImpl::Request : public HttpStreamRequest { virtual int RestartTunnelWithProxyAuth( const AuthCredentials& credentials) OVERRIDE; + virtual void SetPriority(RequestPriority priority) OVERRIDE; virtual LoadState GetLoadState() const OVERRIDE; virtual bool was_npn_negotiated() const OVERRIDE; virtual NextProto protocol_negotiated() const OVERRIDE; diff --git a/net/http/http_stream_factory_impl_request_unittest.cc b/net/http/http_stream_factory_impl_request_unittest.cc new file mode 100644 index 0000000..1f38a2e --- /dev/null +++ b/net/http/http_stream_factory_impl_request_unittest.cc @@ -0,0 +1,98 @@ +// Copyright (c) 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/http/http_stream_factory_impl_request.h" + +#include "net/http/http_stream_factory_impl_job.h" +#include "net/proxy/proxy_info.h" +#include "net/proxy/proxy_service.h" +#include "net/spdy/spdy_test_util_common.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace net { + +class HttpStreamFactoryImplRequestTest + : public ::testing::Test, + public ::testing::WithParamInterface<NextProto> {}; + +INSTANTIATE_TEST_CASE_P( + NextProto, + HttpStreamFactoryImplRequestTest, + testing::Values(kProtoSPDY2, kProtoSPDY3, kProtoSPDY31, kProtoSPDY4a2, + kProtoHTTP2Draft04)); + +namespace { + +class DoNothingRequestDelegate : public HttpStreamRequest::Delegate { + public: + DoNothingRequestDelegate() {} + + virtual ~DoNothingRequestDelegate() {} + + // HttpStreamRequest::Delegate + virtual void OnStreamReady( + const SSLConfig& used_ssl_config, + const ProxyInfo& used_proxy_info, + HttpStreamBase* stream) OVERRIDE {} + virtual void OnWebSocketStreamReady( + const SSLConfig& used_ssl_config, + const ProxyInfo& used_proxy_info, + WebSocketStreamBase* stream) OVERRIDE {} + virtual void OnStreamFailed( + int status, + const SSLConfig& used_ssl_config) OVERRIDE {} + virtual void OnCertificateError( + int status, + const SSLConfig& used_ssl_config, + const SSLInfo& ssl_info) OVERRIDE {} + virtual void OnNeedsProxyAuth(const HttpResponseInfo& proxy_response, + const SSLConfig& used_ssl_config, + const ProxyInfo& used_proxy_info, + HttpAuthController* auth_controller) OVERRIDE {} + virtual void OnNeedsClientAuth(const SSLConfig& used_ssl_config, + SSLCertRequestInfo* cert_info) OVERRIDE {} + virtual void OnHttpsProxyTunnelResponse(const HttpResponseInfo& response_info, + const SSLConfig& used_ssl_config, + const ProxyInfo& used_proxy_info, + HttpStreamBase* stream) OVERRIDE {} +}; + +} // namespace + +// Make sure that Request passes on its priority updates to its jobs. +TEST_P(HttpStreamFactoryImplRequestTest, SetPriority) { + SpdySessionDependencies session_deps(GetParam(), + ProxyService::CreateDirect()); + + scoped_refptr<HttpNetworkSession> + session(SpdySessionDependencies::SpdyCreateSession(&session_deps)); + HttpStreamFactoryImpl* factory = + static_cast<HttpStreamFactoryImpl*>(session->http_stream_factory()); + + DoNothingRequestDelegate request_delegate; + HttpStreamFactoryImpl::Request request( + GURL(), factory, &request_delegate, NULL, BoundNetLog()); + + HttpStreamFactoryImpl::Job* job = + new HttpStreamFactoryImpl::Job(factory, + session, + HttpRequestInfo(), + DEFAULT_PRIORITY, + SSLConfig(), + SSLConfig(), + NULL); + request.AttachJob(job); + EXPECT_EQ(DEFAULT_PRIORITY, job->priority()); + + request.SetPriority(MEDIUM); + EXPECT_EQ(MEDIUM, job->priority()); + + // Make |job| the bound job. + request.OnStreamFailed(job, ERR_FAILED, SSLConfig()); + + request.SetPriority(IDLE); + EXPECT_EQ(IDLE, job->priority()); +} + +} // namespace net diff --git a/net/net.gyp b/net/net.gyp index 707bb9a..7086e3d 100644 --- a/net/net.gyp +++ b/net/net.gyp @@ -1631,6 +1631,7 @@ 'http/http_security_headers_unittest.cc', 'http/http_server_properties_impl_unittest.cc', 'http/http_status_code_unittest.cc', + 'http/http_stream_factory_impl_request_unittest.cc', 'http/http_stream_factory_impl_unittest.cc', 'http/http_stream_parser_unittest.cc', 'http/http_transaction_unittest.cc', |