summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorakalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-08-14 18:01:47 +0000
committerakalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-08-14 18:01:47 +0000
commitbf828984a28131c7531b05b7dcaece484d9212e4 (patch)
treeeee72c3788d037ab23d8e1dbbf94072aca8fa98d
parentdb9a39f1e3645d8b8bb6ccc0dcc23f34726b06e5 (diff)
downloadchromium_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.cc5
-rw-r--r--net/http/http_network_transaction_unittest.cc158
-rw-r--r--net/http/http_stream_factory.h3
-rw-r--r--net/http/http_stream_factory_impl.h7
-rw-r--r--net/http/http_stream_factory_impl_job.cc9
-rw-r--r--net/http/http_stream_factory_impl_job.h3
-rw-r--r--net/http/http_stream_factory_impl_request.cc9
-rw-r--r--net/http/http_stream_factory_impl_request.h1
-rw-r--r--net/http/http_stream_factory_impl_request_unittest.cc98
-rw-r--r--net/net.gyp1
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',