summaryrefslogtreecommitdiffstats
path: root/chrome/browser/net
diff options
context:
space:
mode:
authorwillchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-23 01:01:31 +0000
committerwillchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-23 01:01:31 +0000
commit102e27c64d9deae4c32f346214fd7c2bddaa9fb3 (patch)
treed7372b853f79764c4ec200f4cd6d26c9bb512d65 /chrome/browser/net
parentd7f21d5584fb4962617644833fd2a80b6d0c7e8d (diff)
downloadchromium_src-102e27c64d9deae4c32f346214fd7c2bddaa9fb3.zip
chromium_src-102e27c64d9deae4c32f346214fd7c2bddaa9fb3.tar.gz
chromium_src-102e27c64d9deae4c32f346214fd7c2bddaa9fb3.tar.bz2
Refactor HttpStreamFactory.
Rename StreamFactory and StreamRequest to HttpStreamFactory and HttpStreamRequest. Rename HttpStreamFactory to HttpStreamFactoryImpl. Create HttpStreamFactoryImpl::Request (inherits from HttpStreamRequest) and HttpStreamFactoryImpl::Job (most of the old HttpStreamRequest code, other than the interface, moved here). Currently there is still a strong binding within HttpStreamFactoryImpl between requests and jobs. This will be removed in a future changelist. Note that due to the preparation for late binding, information like HttpRequestInfo and SSLConfig and ProxyInfo are just copied. It's possible we can consider refcounting them to reduce copies, but I think it's not worth the effort / ugliness. I also did some minor cleanups like moving SpdySettingsStorage into SpdySessionPool and some CloseIdleConnections() cleanup. BUG=54371,42669 TEST=unit tests Committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=75668 Review URL: http://codereview.chromium.org/6543004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@75688 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/net')
-rw-r--r--chrome/browser/net/preconnect.cc76
-rw-r--r--chrome/browser/net/preconnect.h75
-rw-r--r--chrome/browser/net/predictor.cc10
3 files changed, 49 insertions, 112 deletions
diff --git a/chrome/browser/net/preconnect.cc b/chrome/browser/net/preconnect.cc
index c35bc0e..8152f62 100644
--- a/chrome/browser/net/preconnect.cc
+++ b/chrome/browser/net/preconnect.cc
@@ -6,44 +6,37 @@
#include "base/logging.h"
#include "base/metrics/histogram.h"
-#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/browser_thread.h"
+#include "chrome/browser/profiles/profile.h"
#include "chrome/common/net/url_request_context_getter.h"
+#include "net/base/net_log.h"
+#include "net/base/ssl_config_service.h"
#include "net/http/http_network_session.h"
+#include "net/http/http_request_info.h"
+#include "net/http/http_stream_factory.h"
#include "net/http/http_transaction_factory.h"
#include "net/url_request/url_request_context.h"
namespace chrome_browser_net {
-// static
-void Preconnect::PreconnectOnUIThread(const GURL& url,
- UrlInfo::ResolutionMotivation motivation, int count) {
+void PreconnectOnUIThread(
+ const GURL& url,
+ UrlInfo::ResolutionMotivation motivation,
+ int count) {
// Prewarm connection to Search URL.
BrowserThread::PostTask(
BrowserThread::IO,
FROM_HERE,
- NewRunnableFunction(Preconnect::PreconnectOnIOThread, url, motivation,
+ NewRunnableFunction(PreconnectOnIOThread, url, motivation,
count));
return;
}
-// static
-void Preconnect::PreconnectOnIOThread(const GURL& url,
- UrlInfo::ResolutionMotivation motivation, int count) {
- Preconnect* preconnect = new Preconnect(motivation);
- // TODO(jar): Should I use PostTask for LearnedSubresources to delay the
- // preconnection a tad?
- preconnect->Connect(url, count);
-}
-
-Preconnect::Preconnect(UrlInfo::ResolutionMotivation motivation)
- : motivation_(motivation),
- ALLOW_THIS_IN_INITIALIZER_LIST(
- io_callback_(this, &Preconnect::OnPreconnectComplete)) {}
-Preconnect::~Preconnect() {}
-
-void Preconnect::Connect(const GURL& url, int count) {
+void PreconnectOnIOThread(
+ const GURL& url,
+ UrlInfo::ResolutionMotivation motivation,
+ int count) {
URLRequestContextGetter* getter = Profile::GetDefaultRequestContext();
if (!getter)
return;
@@ -53,16 +46,16 @@ void Preconnect::Connect(const GURL& url, int count) {
}
// We are now commited to doing the async preconnection call.
- UMA_HISTOGRAM_ENUMERATION("Net.PreconnectMotivation", motivation_,
+ UMA_HISTOGRAM_ENUMERATION("Net.PreconnectMotivation", motivation,
UrlInfo::MAX_MOTIVATED);
net::URLRequestContext* context = getter->GetURLRequestContext();
net::HttpTransactionFactory* factory = context->http_transaction_factory();
net::HttpNetworkSession* session = factory->GetSession();
- request_info_.reset(new net::HttpRequestInfo());
- request_info_->url = url;
- request_info_->method = "GET";
+ net::HttpRequestInfo request_info;
+ request_info.url = url;
+ request_info.method = "GET";
// It almost doesn't matter whether we use net::LOWEST or net::HIGHEST
// priority here, as we won't make a request, and will surrender the created
// socket to the pool as soon as we can. However, we would like to mark the
@@ -74,19 +67,19 @@ void Preconnect::Connect(const GURL& url, int count) {
// as speculative, and better detect stats (if it gets used).
// TODO(jar): histogram to see how often we accidentally use a previously-
// unused socket, when a previously used socket was available.
- request_info_->priority = net::HIGHEST;
+ request_info.priority = net::HIGHEST;
// Translate the motivation from UrlRequest motivations to HttpRequest
// motivations.
- switch (motivation_) {
+ switch (motivation) {
case UrlInfo::OMNIBOX_MOTIVATED:
- request_info_->motivation = net::HttpRequestInfo::OMNIBOX_MOTIVATED;
+ request_info.motivation = net::HttpRequestInfo::OMNIBOX_MOTIVATED;
break;
case UrlInfo::LEARNED_REFERAL_MOTIVATED:
- request_info_->motivation = net::HttpRequestInfo::PRECONNECT_MOTIVATED;
+ request_info.motivation = net::HttpRequestInfo::PRECONNECT_MOTIVATED;
break;
case UrlInfo::EARLY_LOAD_MOTIVATED:
- request_info_->motivation = net::HttpRequestInfo::EARLY_LOAD_MOTIVATED;
+ request_info.motivation = net::HttpRequestInfo::EARLY_LOAD_MOTIVATED;
break;
default:
// Other motivations should never happen here.
@@ -95,26 +88,17 @@ void Preconnect::Connect(const GURL& url, int count) {
}
// Setup the SSL Configuration.
- ssl_config_.reset(new net::SSLConfig());
- session->ssl_config_service()->GetSSLConfig(ssl_config_.get());
+ net::SSLConfig ssl_config;
+ session->ssl_config_service()->GetSSLConfig(&ssl_config);
if (session->http_stream_factory()->next_protos())
- ssl_config_->next_protos = *session->http_stream_factory()->next_protos();
+ ssl_config.next_protos = *session->http_stream_factory()->next_protos();
// All preconnects should perform EV certificate verification.
- ssl_config_->verify_ev_cert = true;
-
- proxy_info_.reset(new net::ProxyInfo());
- net::StreamFactory* stream_factory = session->http_stream_factory();
- int rv = stream_factory->PreconnectStreams(count, request_info_.get(),
- ssl_config_.get(),
- proxy_info_.get(), session,
- net_log_, &io_callback_);
- if (rv != net::ERR_IO_PENDING)
- delete this;
-}
+ ssl_config.verify_ev_cert = true;
-void Preconnect::OnPreconnectComplete(int error_code) {
- delete this;
+ net::HttpStreamFactory* http_stream_factory = session->http_stream_factory();
+ http_stream_factory->PreconnectStreams(
+ count, request_info, ssl_config, net::BoundNetLog());
}
} // namespace chrome_browser_net
diff --git a/chrome/browser/net/preconnect.h b/chrome/browser/net/preconnect.h
index a950167..0175122 100644
--- a/chrome/browser/net/preconnect.h
+++ b/chrome/browser/net/preconnect.h
@@ -9,72 +9,25 @@
#define CHROME_BROWSER_NET_PRECONNECT_H_
#pragma once
-#include "base/scoped_ptr.h"
#include "chrome/browser/net/url_info.h"
-#include "net/base/completion_callback.h"
-#include "net/base/net_log.h"
-#include "net/http/http_request_info.h"
-#include "net/http/stream_factory.h"
-namespace net {
-
-class ProxyInfo;
-struct SSLConfig;
-
-} // namespace net
+class GURL;
namespace chrome_browser_net {
-class Preconnect {
- public:
- // Try to preconnect. Typically motivated by OMNIBOX to reach search service.
- // |count| may be used to request more than one connection be established in
- // parallel.
- static void PreconnectOnUIThread(const GURL& url,
- UrlInfo::ResolutionMotivation motivation,
- int count);
-
- // Try to preconnect. Typically used by predictor when a subresource probably
- // needs a connection. |count| may be used to request more than one connection
- // be established in parallel.
- static void PreconnectOnIOThread(const GURL& url,
- UrlInfo::ResolutionMotivation motivation,
- int count);
-
- private:
- explicit Preconnect(UrlInfo::ResolutionMotivation motivation);
- virtual ~Preconnect();
-
- void OnPreconnectComplete(int error_code);
-
- // Request actual connection, via interface that tags request as needed for
- // preconnect only (so that they can be merged with connections needed for
- // navigations).
- void Connect(const GURL& url, int count);
-
- // Generally either LEARNED_REFERAL_MOTIVATED, OMNIBOX_MOTIVATED or
- // EARLY_LOAD_MOTIVATED to indicate why we were trying to do a preconnection.
- const UrlInfo::ResolutionMotivation motivation_;
-
- // HttpRequestInfo used for connecting.
- scoped_ptr<net::HttpRequestInfo> request_info_;
-
- // SSLConfig used for connecting.
- scoped_ptr<net::SSLConfig> ssl_config_;
-
- // ProxyInfo used for connecting.
- scoped_ptr<net::ProxyInfo> proxy_info_;
-
- // A net log to use for this preconnect.
- net::BoundNetLog net_log_;
-
- // Our preconnect.
- scoped_ptr<net::StreamRequest> stream_request_;
-
- net::CompletionCallbackImpl<Preconnect> io_callback_;
-
- DISALLOW_COPY_AND_ASSIGN(Preconnect);
-};
+// Try to preconnect. Typically motivated by OMNIBOX to reach search service.
+// |count| may be used to request more than one connection be established in
+// parallel.
+void PreconnectOnUIThread(const GURL& url,
+ UrlInfo::ResolutionMotivation motivation,
+ int count);
+
+// Try to preconnect. Typically used by predictor when a subresource probably
+// needs a connection. |count| may be used to request more than one connection
+// be established in parallel.
+void PreconnectOnIOThread(const GURL& url,
+ UrlInfo::ResolutionMotivation motivation,
+ int count);
} // namespace chrome_browser_net
diff --git a/chrome/browser/net/predictor.cc b/chrome/browser/net/predictor.cc
index 327d709..06aca37 100644
--- a/chrome/browser/net/predictor.cc
+++ b/chrome/browser/net/predictor.cc
@@ -183,8 +183,8 @@ void Predictor::AnticipateOmniboxUrl(const GURL& url, bool preconnectable) {
return; // We've done a preconnect recently.
last_omnibox_preconnect_ = now;
const int kConnectionsNeeded = 1;
- Preconnect::PreconnectOnUIThread(CanonicalizeUrl(url), motivation,
- kConnectionsNeeded);
+ PreconnectOnUIThread(CanonicalizeUrl(url), motivation,
+ kConnectionsNeeded);
return; // Skip pre-resolution, since we'll open a connection.
}
} else {
@@ -217,8 +217,8 @@ void Predictor::PreconnectUrlAndSubresources(const GURL& url) {
std::string host = url.HostNoBrackets();
UrlInfo::ResolutionMotivation motivation(UrlInfo::EARLY_LOAD_MOTIVATED);
const int kConnectionsNeeded = 1;
- Preconnect::PreconnectOnUIThread(CanonicalizeUrl(url), motivation,
- kConnectionsNeeded);
+ PreconnectOnUIThread(CanonicalizeUrl(url), motivation,
+ kConnectionsNeeded);
PredictFrameSubresources(url.GetWithEmptyPath());
}
}
@@ -259,7 +259,7 @@ void Predictor::PrepareFrameSubresources(const GURL& url) {
int count = static_cast<int>(std::ceil(connection_expectation));
if (url.host() == future_url->first.host())
++count;
- Preconnect::PreconnectOnIOThread(future_url->first, motivation, count);
+ PreconnectOnIOThread(future_url->first, motivation, count);
} else if (connection_expectation > kDNSPreresolutionWorthyExpectedValue) {
evalution = PRERESOLUTION;
future_url->second.preresolution_increment();