summaryrefslogtreecommitdiffstats
path: root/net/http/http_stream_factory_impl_job.cc
diff options
context:
space:
mode:
Diffstat (limited to 'net/http/http_stream_factory_impl_job.cc')
-rw-r--r--net/http/http_stream_factory_impl_job.cc360
1 files changed, 164 insertions, 196 deletions
diff --git a/net/http/http_stream_factory_impl_job.cc b/net/http/http_stream_factory_impl_job.cc
index f8d8a9e..5e65d31 100644
--- a/net/http/http_stream_factory_impl_job.cc
+++ b/net/http/http_stream_factory_impl_job.cc
@@ -6,7 +6,6 @@
#include "base/logging.h"
#include "base/stl_util-inl.h"
-#include "base/string_number_conversions.h"
#include "base/string_util.h"
#include "base/stringprintf.h"
#include "base/values.h"
@@ -34,46 +33,38 @@ namespace net {
namespace {
-GURL UpgradeUrlToHttps(const GURL& original_url) {
- GURL::Replacements replacements;
- // new_sheme and new_port need to be in scope here because GURL::Replacements
- // references the memory contained by them directly.
- const std::string new_scheme = "https";
- const std::string new_port = base::IntToString(443);
- replacements.SetSchemeStr(new_scheme);
- replacements.SetPortStr(new_port);
- return original_url.ReplaceComponents(replacements);
-}
-
} // namespace
HttpStreamFactoryImpl::Job::Job(HttpStreamFactoryImpl* stream_factory,
- HttpNetworkSession* session)
+ HttpNetworkSession* session,
+ const HttpRequestInfo& request_info,
+ const SSLConfig& ssl_config,
+ const BoundNetLog& net_log)
: request_(NULL),
+ request_info_(request_info),
+ ssl_config_(ssl_config),
+ net_log_(BoundNetLog::Make(net_log.net_log(),
+ NetLog::SOURCE_HTTP_STREAM_JOB)),
ALLOW_THIS_IN_INITIALIZER_LIST(io_callback_(this, &Job::OnIOComplete)),
connection_(new ClientSocketHandle),
session_(session),
stream_factory_(stream_factory),
next_state_(STATE_NONE),
pac_request_(NULL),
+ blocking_job_(NULL),
+ dependent_job_(NULL),
using_ssl_(false),
using_spdy_(false),
force_spdy_always_(HttpStreamFactory::force_spdy_always()),
force_spdy_over_ssl_(HttpStreamFactory::force_spdy_over_ssl()),
spdy_certificate_error_(OK),
- alternate_protocol_(HttpAlternateProtocols::UNINITIALIZED),
establishing_tunnel_(false),
- was_alternate_protocol_available_(false),
was_npn_negotiated_(false),
num_streams_(0),
spdy_session_direct_(false),
ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) {
DCHECK(stream_factory);
DCHECK(session);
- if (HttpStreamFactory::use_alternate_protocols())
- alternate_protocol_mode_ = kUnspecified;
- else
- alternate_protocol_mode_ = kDoNotUseAlternateProtocol;
}
HttpStreamFactoryImpl::Job::~Job() {
@@ -95,22 +86,16 @@ HttpStreamFactoryImpl::Job::~Job() {
stream_->Close(true /* not reusable */);
}
-void HttpStreamFactoryImpl::Job::Start(Request* request,
- const HttpRequestInfo& request_info,
- const SSLConfig& ssl_config,
- const BoundNetLog& net_log) {
+void HttpStreamFactoryImpl::Job::Start(Request* request) {
DCHECK(request);
request_ = request;
- StartInternal(request_info, ssl_config, net_log);
+ StartInternal();
}
-int HttpStreamFactoryImpl::Job::Preconnect(int num_streams,
- const HttpRequestInfo& request_info,
- const SSLConfig& ssl_config,
- const BoundNetLog& net_log) {
+int HttpStreamFactoryImpl::Job::Preconnect(int num_streams) {
DCHECK_GT(num_streams, 0);
num_streams_ = num_streams;
- return StartInternal(request_info, ssl_config, net_log);
+ return StartInternal();
}
int HttpStreamFactoryImpl::Job::RestartTunnelWithProxyAuth(
@@ -134,13 +119,45 @@ LoadState HttpStreamFactoryImpl::Job::GetLoadState() const {
}
}
+void HttpStreamFactoryImpl::Job::MarkAsAlternate(const GURL& original_url) {
+ DCHECK(!original_url_.get());
+ original_url_.reset(new GURL(original_url));
+}
+
+void HttpStreamFactoryImpl::Job::WaitFor(Job* job) {
+ DCHECK_EQ(STATE_NONE, next_state_);
+ DCHECK_EQ(STATE_NONE, job->next_state_);
+ DCHECK(!blocking_job_);
+ DCHECK(!job->dependent_job_);
+ blocking_job_ = job;
+ job->dependent_job_ = this;
+}
+
+void HttpStreamFactoryImpl::Job::Resume(Job* job) {
+ DCHECK_EQ(blocking_job_, job);
+ blocking_job_ = NULL;
+
+ // We know we're blocked if the next_state_ is STATE_WAIT_FOR_JOB_COMPLETE.
+ // Unblock |this|.
+ if (next_state_ == STATE_WAIT_FOR_JOB_COMPLETE) {
+ MessageLoop::current()->PostTask(
+ FROM_HERE,
+ method_factory_.NewRunnableMethod(
+ &HttpStreamFactoryImpl::Job::OnIOComplete, OK));
+ }
+}
+
void HttpStreamFactoryImpl::Job::Orphan(const Request* request) {
DCHECK_EQ(request_, request);
request_ = NULL;
-}
-
-bool HttpStreamFactoryImpl::Job::was_alternate_protocol_available() const {
- return was_alternate_protocol_available_;
+ // We've been orphaned, but there's a job we're blocked on. Don't bother
+ // racing, just cancel ourself.
+ if (blocking_job_) {
+ DCHECK(blocking_job_->dependent_job_);
+ blocking_job_->dependent_job_ = NULL;
+ blocking_job_ = NULL;
+ stream_factory_->OnOrphanedJobComplete(this);
+ }
}
bool HttpStreamFactoryImpl::Job::was_npn_negotiated() const {
@@ -174,8 +191,7 @@ void HttpStreamFactoryImpl::Job::OnStreamReadyCallback() {
if (IsOrphaned()) {
stream_factory_->OnOrphanedJobComplete(this);
} else {
- request_->Complete(was_alternate_protocol_available(),
- was_npn_negotiated(),
+ request_->Complete(was_npn_negotiated(),
using_spdy(),
net_log_.source());
request_->OnStreamReady(this, ssl_config_, proxy_info_, stream_.release());
@@ -193,8 +209,7 @@ void HttpStreamFactoryImpl::Job::OnSpdySessionReadyCallback() {
if (IsOrphaned()) {
stream_factory_->OnSpdySessionReady(
spdy_session, spdy_session_direct_, ssl_config_, proxy_info_,
- was_alternate_protocol_available(), was_npn_negotiated(),
- using_spdy(), net_log_.source());
+ was_npn_negotiated(), using_spdy(), net_log_.source());
stream_factory_->OnOrphanedJobComplete(this);
} else {
request_->OnSpdySessionReady(this, spdy_session, spdy_session_direct_);
@@ -260,8 +275,7 @@ void HttpStreamFactoryImpl::Job::OnPreconnectsComplete() {
if (new_spdy_session_) {
stream_factory_->OnSpdySessionReady(
new_spdy_session_, spdy_session_direct_, ssl_config_,
- proxy_info_, was_alternate_protocol_available(),
- was_npn_negotiated(), using_spdy(), net_log_.source());
+ proxy_info_, was_npn_negotiated(), using_spdy(), net_log_.source());
}
stream_factory_->OnPreconnectsComplete(this);
// |this| may be deleted after this call.
@@ -385,6 +399,13 @@ int HttpStreamFactoryImpl::Job::DoLoop(int result) {
case STATE_RESOLVE_PROXY_COMPLETE:
rv = DoResolveProxyComplete(rv);
break;
+ case STATE_WAIT_FOR_JOB:
+ DCHECK_EQ(OK, rv);
+ rv = DoWaitForJob();
+ break;
+ case STATE_WAIT_FOR_JOB_COMPLETE:
+ rv = DoWaitForJobComplete(rv);
+ break;
case STATE_INIT_CONNECTION:
DCHECK_EQ(OK, rv);
rv = DoInitConnection();
@@ -418,18 +439,11 @@ int HttpStreamFactoryImpl::Job::DoLoop(int result) {
return rv;
}
-int HttpStreamFactoryImpl::Job::StartInternal(
- const HttpRequestInfo& request_info,
- const SSLConfig& ssl_config,
- const BoundNetLog& net_log) {
+int HttpStreamFactoryImpl::Job::StartInternal() {
CHECK_EQ(STATE_NONE, next_state_);
- request_info_ = request_info;
- ssl_config_ = ssl_config;
- net_log_ = BoundNetLog::Make(net_log.net_log(),
- NetLog::SOURCE_HTTP_STREAM_JOB);
net_log_.BeginEvent(NetLog::TYPE_HTTP_STREAM_JOB,
make_scoped_refptr(new NetLogStringParameter(
- "url", request_info.url.GetOrigin().spec())));
+ "url", request_info_.url.GetOrigin().spec())));
next_state_ = STATE_RESOLVE_PROXY;
int rv = RunLoop(OK);
DCHECK_EQ(ERR_IO_PENDING, rv);
@@ -441,40 +455,8 @@ int HttpStreamFactoryImpl::Job::DoResolveProxy() {
next_state_ = STATE_RESOLVE_PROXY_COMPLETE;
- // |endpoint_| indicates the final destination endpoint.
- endpoint_ = HostPortPair(request_info_.url.HostNoBrackets(),
- request_info_.url.EffectiveIntPort());
-
- // Extra URL we might be attempting to resolve to.
- GURL alternate_endpoint_url = request_info_.url;
-
- // Tracks whether we are using |request_.url| or |alternate_endpoint_url|.
- const GURL *curr_endpoint_url = &request_info_.url;
-
- alternate_endpoint_url =
- HttpStreamFactory::ApplyHostMappingRules(
- alternate_endpoint_url, &endpoint_);
-
- const HttpAlternateProtocols& alternate_protocols =
- session_->alternate_protocols();
- if (HttpStreamFactory::spdy_enabled() &&
- alternate_protocols.HasAlternateProtocolFor(endpoint_)) {
- was_alternate_protocol_available_ = true;
- if (alternate_protocol_mode_ == kUnspecified) {
- HttpAlternateProtocols::PortProtocolPair alternate =
- alternate_protocols.GetAlternateProtocolFor(endpoint_);
- if (alternate.protocol != HttpAlternateProtocols::BROKEN) {
- DCHECK_LE(HttpAlternateProtocols::NPN_SPDY_1, alternate.protocol);
- DCHECK_GT(HttpAlternateProtocols::NUM_ALTERNATE_PROTOCOLS,
- alternate.protocol);
- endpoint_.set_port(alternate.port);
- alternate_protocol_ = alternate.protocol;
- alternate_protocol_mode_ = kUsingAlternateProtocol;
- alternate_endpoint_url = UpgradeUrlToHttps(*curr_endpoint_url);
- curr_endpoint_url = &alternate_endpoint_url;
- }
- }
- }
+ origin_ = HostPortPair(request_info_.url.HostNoBrackets(),
+ request_info_.url.EffectiveIntPort());
if (request_info_.load_flags & LOAD_BYPASS_PROXY) {
proxy_info_.UseDirect();
@@ -482,101 +464,104 @@ int HttpStreamFactoryImpl::Job::DoResolveProxy() {
}
return session_->proxy_service()->ResolveProxy(
- *curr_endpoint_url, &proxy_info_, &io_callback_, &pac_request_,
+ request_info_.url, &proxy_info_, &io_callback_, &pac_request_,
net_log_);
}
int HttpStreamFactoryImpl::Job::DoResolveProxyComplete(int result) {
pac_request_ = NULL;
- if (result != OK)
- return result;
-
- // TODO(mbelshe): consider retrying ResolveProxy if we came here via use of
- // AlternateProtocol.
-
- // Remove unsupported proxies from the list.
- proxy_info_.RemoveProxiesWithoutScheme(
- ProxyServer::SCHEME_DIRECT |
- ProxyServer::SCHEME_HTTP | ProxyServer::SCHEME_HTTPS |
- ProxyServer::SCHEME_SOCKS4 | ProxyServer::SCHEME_SOCKS5);
+ if (result == OK) {
+ // Remove unsupported proxies from the list.
+ proxy_info_.RemoveProxiesWithoutScheme(
+ ProxyServer::SCHEME_DIRECT |
+ ProxyServer::SCHEME_HTTP | ProxyServer::SCHEME_HTTPS |
+ ProxyServer::SCHEME_SOCKS4 | ProxyServer::SCHEME_SOCKS5);
+
+ if (proxy_info_.is_empty()) {
+ // No proxies/direct to choose from. This happens when we don't support
+ // any of the proxies in the returned list.
+ result = ERR_NO_SUPPORTED_PROXIES;
+ }
+ }
- if (proxy_info_.is_empty()) {
- // No proxies/direct to choose from. This happens when we don't support any
- // of the proxies in the returned list.
- return ERR_NO_SUPPORTED_PROXIES;
+ if (result != OK) {
+ if (dependent_job_)
+ dependent_job_->Resume(this);
+ return result;
}
- next_state_ = STATE_INIT_CONNECTION;
+ if (blocking_job_)
+ next_state_ = STATE_WAIT_FOR_JOB;
+ else
+ next_state_ = STATE_INIT_CONNECTION;
return OK;
}
-static bool HasSpdyExclusion(const HostPortPair& endpoint) {
- std::list<HostPortPair>* exclusions =
- HttpStreamFactory::forced_spdy_exclusions();
- if (!exclusions)
- return false;
+bool HttpStreamFactoryImpl::Job::ShouldForceSpdySSL() const {
+ return force_spdy_always_ && force_spdy_over_ssl_;
+}
- std::list<HostPortPair>::const_iterator it;
- for (it = exclusions->begin(); it != exclusions->end(); it++)
- if (it->Equals(endpoint))
- return true;
- return false;
+bool HttpStreamFactoryImpl::Job::ShouldForceSpdyWithoutSSL() const {
+ return force_spdy_always_ && !force_spdy_over_ssl_;
}
-bool HttpStreamFactoryImpl::Job::ShouldForceSpdySSL() {
- bool rv = force_spdy_always_ && force_spdy_over_ssl_;
- return rv && !HasSpdyExclusion(endpoint_);
+int HttpStreamFactoryImpl::Job::DoWaitForJob() {
+ DCHECK(blocking_job_);
+ next_state_ = STATE_WAIT_FOR_JOB_COMPLETE;
+ return ERR_IO_PENDING;
}
-bool HttpStreamFactoryImpl::Job::ShouldForceSpdyWithoutSSL() {
- bool rv = force_spdy_always_ && !force_spdy_over_ssl_;
- return rv && !HasSpdyExclusion(endpoint_);
+int HttpStreamFactoryImpl::Job::DoWaitForJobComplete(int result) {
+ DCHECK(!blocking_job_);
+ DCHECK_EQ(OK, result);
+ next_state_ = STATE_INIT_CONNECTION;
+ return OK;
}
int HttpStreamFactoryImpl::Job::DoInitConnection() {
+ DCHECK(!blocking_job_);
DCHECK(!connection_->is_initialized());
DCHECK(proxy_info_.proxy_server().is_valid());
next_state_ = STATE_INIT_CONNECTION_COMPLETE;
- bool want_spdy_over_npn =
- alternate_protocol_mode_ == kUsingAlternateProtocol &&
- alternate_protocol_ == HttpAlternateProtocols::NPN_SPDY_2;
- using_ssl_ = request_info_.url.SchemeIs("https") ||
- ShouldForceSpdySSL() || want_spdy_over_npn;
+ using_ssl_ = request_info_.url.SchemeIs("https") || ShouldForceSpdySSL();
using_spdy_ = false;
- // If spdy has been turned off on-the-fly, then there may be SpdySessions
- // still active. But don't use them unless spdy is currently on.
- if (HttpStreamFactory::spdy_enabled() && !HasSpdyExclusion(endpoint_)) {
- // Check first if we have a spdy session for this group. If so, then go
- // straight to using that.
- HostPortProxyPair spdy_session_key;
- if (IsHttpsProxyAndHttpUrl()) {
- spdy_session_key =
- HostPortProxyPair(proxy_info_.proxy_server().host_port_pair(),
- ProxyServer::Direct());
- } else {
- spdy_session_key =
- HostPortProxyPair(endpoint_, proxy_info_.proxy_server());
- }
- if (session_->spdy_session_pool()->HasSession(spdy_session_key)) {
- // If we're preconnecting, but we already have a SpdySession, we don't
- // actually need to preconnect any sockets, so we're done.
- if (IsPreconnecting())
- return OK;
- using_spdy_ = true;
- next_state_ = STATE_CREATE_STREAM;
+ // Check first if we have a spdy session for this group. If so, then go
+ // straight to using that.
+ HostPortProxyPair spdy_session_key;
+ if (IsHttpsProxyAndHttpUrl()) {
+ spdy_session_key =
+ HostPortProxyPair(proxy_info_.proxy_server().host_port_pair(),
+ ProxyServer::Direct());
+ } else {
+ spdy_session_key = HostPortProxyPair(origin_, proxy_info_.proxy_server());
+ }
+ if (session_->spdy_session_pool()->HasSession(spdy_session_key)) {
+ // If we're preconnecting, but we already have a SpdySession, we don't
+ // actually need to preconnect any sockets, so we're done.
+ if (IsPreconnecting())
return OK;
- } else if (request_) {
- // Update the spdy session key for the request that launched this job.
- request_->SetSpdySessionKey(spdy_session_key);
- }
+ using_spdy_ = true;
+ next_state_ = STATE_CREATE_STREAM;
+ return OK;
+ } else if (request_ && (using_ssl_ || ShouldForceSpdyWithoutSSL())) {
+ // Update the spdy session key for the request that launched this job.
+ request_->SetSpdySessionKey(spdy_session_key);
+ }
+
+ // OK, there's no available SPDY session. Let |dependent_job_| resume if it's
+ // paused.
+
+ if (dependent_job_) {
+ dependent_job_->Resume(this);
+ dependent_job_ = NULL;
}
// Build the string used to uniquely identify connections of this type.
// Determine the host and port to connect to.
- std::string connection_group = endpoint_.ToString();
+ std::string connection_group = origin_.ToString();
DCHECK(!connection_group.empty());
if (using_ssl_)
@@ -595,7 +580,7 @@ int HttpStreamFactoryImpl::Job::DoInitConnection() {
scoped_ptr<HostPortPair> proxy_host_port;
if (proxy_info_.is_direct()) {
- tcp_params = new TCPSocketParams(endpoint_, request_info_.priority,
+ tcp_params = new TCPSocketParams(origin_, request_info_.priority,
request_info_.referrer,
disable_resolver_cache);
} else {
@@ -606,19 +591,6 @@ int HttpStreamFactoryImpl::Job::DoInitConnection() {
request_info_.referrer, disable_resolver_cache));
if (proxy_info_.is_http() || proxy_info_.is_https()) {
- GURL authentication_url = request_info_.url;
- if (using_ssl_ && !authentication_url.SchemeIs("https")) {
- // If a proxy tunnel connection needs to be established due to
- // an Alternate-Protocol, the URL needs to be changed to indicate
- // https or digest authentication attempts will fail.
- // For example, suppose the initial request was for
- // "http://www.example.com/index.html". If this is an SSL
- // upgrade due to alternate protocol, the digest authorization
- // should have a uri="www.example.com:443" field rather than a
- // "/index.html" entry, even though the original request URL has not
- // changed.
- authentication_url = UpgradeUrlToHttps(authentication_url);
- }
establishing_tunnel_ = using_ssl_;
std::string user_agent;
request_info_.extra_headers.GetHeader(HttpRequestHeaders::kUserAgent,
@@ -629,16 +601,16 @@ int HttpStreamFactoryImpl::Job::DoInitConnection() {
ssl_params = GenerateSSLParams(proxy_tcp_params, NULL, NULL,
ProxyServer::SCHEME_DIRECT,
*proxy_host_port.get(),
- want_spdy_over_npn);
+ original_url_.get() ? true : false);
proxy_tcp_params = NULL;
}
http_proxy_params =
new HttpProxySocketParams(proxy_tcp_params,
ssl_params,
- authentication_url,
+ request_info_.url,
user_agent,
- endpoint_,
+ origin_,
session_->http_auth_cache(),
session_->http_auth_handler_factory(),
session_->spdy_session_pool(),
@@ -655,7 +627,7 @@ int HttpStreamFactoryImpl::Job::DoInitConnection() {
socks_params = new SOCKSSocketParams(proxy_tcp_params,
socks_version == '5',
- endpoint_,
+ origin_,
request_info_.priority,
request_info_.referrer);
}
@@ -666,8 +638,7 @@ int HttpStreamFactoryImpl::Job::DoInitConnection() {
scoped_refptr<SSLSocketParams> ssl_params =
GenerateSSLParams(tcp_params, http_proxy_params, socks_params,
proxy_info_.proxy_server().scheme(),
- HostPortPair::FromURL(request_info_.url),
- want_spdy_over_npn);
+ origin_, original_url_.get() ? true : false);
SSLClientSocketPool* ssl_pool = NULL;
if (proxy_info_.is_direct())
ssl_pool = session_->ssl_socket_pool();
@@ -734,6 +705,13 @@ int HttpStreamFactoryImpl::Job::DoInitConnectionComplete(int result) {
return OK;
}
+ // TODO(willchan): Make this a bit more exact. Maybe there are recoverable
+ // errors, such as ignoring certificate errors for Alternate-Protocol.
+ if (result < 0 && dependent_job_) {
+ dependent_job_->Resume(this);
+ dependent_job_ = NULL;
+ }
+
// |result| may be the result of any of the stacked pools. The following
// logic is used when determining how to interpret an error.
// If |result| < 0:
@@ -782,12 +760,11 @@ int HttpStreamFactoryImpl::Job::DoInitConnectionComplete(int result) {
return result;
}
- if ((!ssl_started && result < 0 &&
- alternate_protocol_mode_ == kUsingAlternateProtocol) ||
- result == ERR_NPN_NEGOTIATION_FAILED) {
+ if (!ssl_started && result < 0 && original_url_.get()) {
// Mark the alternate protocol as broken and fallback.
- MarkBrokenAlternateProtocolAndFallback();
- return OK;
+ session_->mutable_alternate_protocols()->MarkBrokenAlternateProtocolFor(
+ HostPortPair::FromURL(*original_url_));
+ return result;
}
if (result < 0 && !ssl_started)
@@ -808,7 +785,8 @@ int HttpStreamFactoryImpl::Job::DoInitConnectionComplete(int result) {
if (using_ssl_) {
DCHECK(ssl_started);
if (IsCertificateError(result)) {
- if (using_spdy_ && request_info_.url.SchemeIs("http")) {
+ if (using_spdy_ && original_url_.get() &&
+ original_url_->SchemeIs("http")) {
// We ignore certificate errors for http over spdy.
spdy_certificate_error_ = result;
result = OK;
@@ -862,7 +840,7 @@ int HttpStreamFactoryImpl::Job::DoCreateStream() {
SpdySessionPool* spdy_pool = session_->spdy_session_pool();
scoped_refptr<SpdySession> spdy_session;
- HostPortProxyPair pair(endpoint_, proxy_server);
+ HostPortProxyPair pair(origin_, proxy_server);
if (spdy_pool->HasSession(pair)) {
// We have a SPDY session to the origin server. This might be a direct
// connection, or it might be a SPDY session through an HTTP or HTTPS proxy.
@@ -966,7 +944,15 @@ void HttpStreamFactoryImpl::Job::SetSocketMotivation() {
}
bool HttpStreamFactoryImpl::Job::IsHttpsProxyAndHttpUrl() {
- return proxy_info_.is_https() && request_info_.url.SchemeIs("http");
+ if (!proxy_info_.is_https())
+ return false;
+ if (original_url_.get()) {
+ // We currently only support Alternate-Protocol where the original scheme
+ // is http.
+ DCHECK(original_url_->SchemeIs("http"));
+ return original_url_->SchemeIs("http");
+ }
+ return request_info_.url.SchemeIs("http");
}
// Returns a newly create SSLSocketParams, and sets several
@@ -976,12 +962,12 @@ scoped_refptr<SSLSocketParams> HttpStreamFactoryImpl::Job::GenerateSSLParams(
scoped_refptr<HttpProxySocketParams> http_proxy_params,
scoped_refptr<SOCKSSocketParams> socks_params,
ProxyServer::Scheme proxy_scheme,
- const HostPortPair& host_and_port,
+ const HostPortPair& origin_server,
bool want_spdy_over_npn) {
- if (stream_factory_->IsTLSIntolerantServer(request_info_.url)) {
+ if (stream_factory_->IsTLSIntolerantServer(origin_server)) {
LOG(WARNING) << "Falling back to SSLv3 because host is TLS intolerant: "
- << GetHostAndPort(request_info_.url);
+ << origin_server.ToString();
ssl_config_.ssl3_fallback = true;
ssl_config_.tls1_enabled = false;
}
@@ -1014,7 +1000,7 @@ scoped_refptr<SSLSocketParams> HttpStreamFactoryImpl::Job::GenerateSSLParams(
scoped_refptr<SSLSocketParams> ssl_params(
new SSLSocketParams(tcp_params, socks_params, http_proxy_params,
- proxy_scheme, host_and_port,
+ proxy_scheme, origin_server,
ssl_config_, load_flags,
ShouldForceSpdySSL(),
want_spdy_over_npn));
@@ -1023,24 +1009,6 @@ scoped_refptr<SSLSocketParams> HttpStreamFactoryImpl::Job::GenerateSSLParams(
}
-void HttpStreamFactoryImpl::Job::MarkBrokenAlternateProtocolAndFallback() {
- // We have to:
- // * Reset the endpoint to be the unmodified URL specified destination.
- // * Mark the endpoint as broken so we don't try again.
- // * Set the alternate protocol mode to kDoNotUseAlternateProtocol so we
- // ignore future Alternate-Protocol headers from the HostPortPair.
- // * Reset the connection and go back to STATE_INIT_CONNECTION.
-
- endpoint_ = HostPortPair(request_info_.url.HostNoBrackets(),
- request_info_.url.EffectiveIntPort());
-
- session_->mutable_alternate_protocols()->MarkBrokenAlternateProtocolFor(
- endpoint_);
-
- alternate_protocol_mode_ = kDoNotUseAlternateProtocol;
- ReturnToStateInitConnection(false /* close connection */);
-}
-
int HttpStreamFactoryImpl::Job::ReconsiderProxyAfterError(int error) {
DCHECK(!pac_request_);