Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(214)

Unified Diff: net/http/http_stream_factory_impl_job.cc

Issue 2814633003: Extract Proxy Resolution out of HttpStreamFactoryImpl::Job (Closed)
Patch Set: fix remaining tests Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: net/http/http_stream_factory_impl_job.cc
diff --git a/net/http/http_stream_factory_impl_job.cc b/net/http/http_stream_factory_impl_job.cc
index 6bda6d0e72c65aaea554657031a0b3d03918004e..49a134ed6fa84ddde9abf04c816489b001d06e6f 100644
--- a/net/http/http_stream_factory_impl_job.cc
+++ b/net/http/http_stream_factory_impl_job.cc
@@ -40,7 +40,6 @@
#include "net/log/net_log_event_type.h"
#include "net/log/net_log_source.h"
#include "net/log/net_log_source_type.h"
-#include "net/quic/chromium/quic_http_stream.h"
#include "net/socket/client_socket_handle.h"
#include "net/socket/client_socket_pool.h"
#include "net/socket/client_socket_pool_manager.h"
@@ -149,23 +148,12 @@ std::unique_ptr<base::Value> NetLogHttpStreamProtoCallback(
return std::move(dict);
}
-// Returns parameters associated with the proxy resolution.
-std::unique_ptr<base::Value> NetLogHttpStreamJobProxyServerResolved(
- const ProxyServer& proxy_server,
- NetLogCaptureMode /* capture_mode */) {
- std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
-
- dict->SetString("proxy_server", proxy_server.is_valid()
- ? proxy_server.ToPacString()
- : std::string());
- return std::move(dict);
-}
-
HttpStreamFactoryImpl::Job::Job(Delegate* delegate,
JobType job_type,
HttpNetworkSession* session,
const HttpRequestInfo& request_info,
RequestPriority priority,
+ ProxyInfo proxy_info,
const SSLConfig& server_ssl_config,
const SSLConfig& proxy_ssl_config,
HostPortPair destination,
@@ -177,6 +165,7 @@ HttpStreamFactoryImpl::Job::Job(Delegate* delegate,
session,
request_info,
priority,
+ proxy_info,
server_ssl_config,
proxy_ssl_config,
destination,
@@ -191,6 +180,7 @@ HttpStreamFactoryImpl::Job::Job(Delegate* delegate,
HttpNetworkSession* session,
const HttpRequestInfo& request_info,
RequestPriority priority,
+ ProxyInfo proxy_info,
const SSLConfig& server_ssl_config,
const SSLConfig& proxy_ssl_config,
HostPortPair destination,
@@ -201,6 +191,7 @@ HttpStreamFactoryImpl::Job::Job(Delegate* delegate,
NetLog* net_log)
: request_info_(request_info),
priority_(priority),
+ proxy_info_(proxy_info),
server_ssl_config_(server_ssl_config),
proxy_ssl_config_(proxy_ssl_config),
net_log_(
@@ -210,7 +201,6 @@ HttpStreamFactoryImpl::Job::Job(Delegate* delegate,
session_(session),
state_(STATE_NONE),
next_state_(STATE_NONE),
- pac_request_(NULL),
destination_(destination),
origin_url_(origin_url),
alternative_service_(alternative_service),
@@ -222,8 +212,8 @@ HttpStreamFactoryImpl::Job::Job(Delegate* delegate,
origin_url_.SchemeIs(url::kWssScheme)),
using_spdy_(false),
using_quic_(false),
- quic_request_(session_->quic_stream_factory(),
- session_->http_server_properties()),
+ reconsider_proxy_(false),
+ quic_request_(session_->quic_stream_factory()->CreateStreamRequest()),
using_existing_quic_session_(false),
establishing_tunnel_(false),
was_alpn_negotiated_(false),
@@ -271,9 +261,6 @@ HttpStreamFactoryImpl::Job::~Job() {
connection_.reset();
}
- if (pac_request_)
- session_->proxy_service()->CancelPacRequest(pac_request_);
-
// The stream could be in a partial state. It is not reusable.
if (stream_.get() && next_state_ != STATE_DONE)
stream_->Close(true /* not reusable */);
@@ -318,8 +305,6 @@ int HttpStreamFactoryImpl::Job::RestartTunnelWithProxyAuth() {
LoadState HttpStreamFactoryImpl::Job::GetLoadState() const {
switch (next_state_) {
- case STATE_RESOLVE_PROXY_COMPLETE:
- return session_->proxy_service()->GetLoadState(pac_request_);
case STATE_INIT_CONNECTION_COMPLETE:
case STATE_CREATE_STREAM_COMPLETE:
return using_quic_ ? LOAD_STATE_CONNECTING : connection_->GetLoadState();
@@ -688,13 +673,6 @@ int HttpStreamFactoryImpl::Job::DoLoop(int result) {
DCHECK_EQ(OK, rv);
rv = DoStart();
break;
- case STATE_RESOLVE_PROXY:
- DCHECK_EQ(OK, rv);
- rv = DoResolveProxy();
- break;
- case STATE_RESOLVE_PROXY_COMPLETE:
- rv = DoResolveProxyComplete(rv);
- break;
case STATE_WAIT:
DCHECK_EQ(OK, rv);
rv = DoWait();
@@ -761,75 +739,7 @@ int HttpStreamFactoryImpl::Job::DoStart() {
return ERR_UNSAFE_PORT;
}
- next_state_ = STATE_RESOLVE_PROXY;
- return OK;
-}
-
-int HttpStreamFactoryImpl::Job::DoResolveProxy() {
- DCHECK(!pac_request_);
- DCHECK(session_);
-
- next_state_ = STATE_RESOLVE_PROXY_COMPLETE;
-
- if (request_info_.load_flags & LOAD_BYPASS_PROXY) {
- proxy_info_.UseDirect();
- return OK;
- }
-
- // If an alternative proxy server was provided, use that.
- if (alternative_proxy_server_.is_valid()) {
- proxy_info_.UseProxyServer(alternative_proxy_server_);
- return OK;
- }
-
- return session_->proxy_service()->ResolveProxy(
- origin_url_, request_info_.method, &proxy_info_, io_callback_,
- &pac_request_, session_->params().proxy_delegate, net_log_);
-}
-
-int HttpStreamFactoryImpl::Job::DoResolveProxyComplete(int result) {
- pac_request_ = NULL;
-
- net_log_.AddEvent(
- NetLogEventType::HTTP_STREAM_JOB_PROXY_SERVER_RESOLVED,
- base::Bind(
- &NetLogHttpStreamJobProxyServerResolved,
- proxy_info_.is_empty() ? ProxyServer() : proxy_info_.proxy_server()));
-
- if (result == OK) {
- // Remove unsupported proxies from the list.
- int supported_proxies =
- ProxyServer::SCHEME_DIRECT | ProxyServer::SCHEME_HTTP |
- ProxyServer::SCHEME_HTTPS | ProxyServer::SCHEME_SOCKS4 |
- ProxyServer::SCHEME_SOCKS5;
-
- if (session_->IsQuicEnabled())
- supported_proxies |= ProxyServer::SCHEME_QUIC;
-
- proxy_info_.RemoveProxiesWithoutScheme(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.
- result = ERR_NO_SUPPORTED_PROXIES;
- } else if (using_quic_ &&
- (!proxy_info_.is_quic() && !proxy_info_.is_direct())) {
- // QUIC can not be spoken to non-QUIC proxies. This error should not be
- // user visible, because the non-alternative Job should be resumed.
- result = ERR_NO_SUPPORTED_PROXIES;
- }
- }
-
- if (result != OK) {
- return result;
- }
-
next_state_ = STATE_WAIT;
-
- delegate_->OnResolveProxyComplete(this, request_info_, priority_,
- server_ssl_config_, proxy_ssl_config_,
- stream_type_);
-
return OK;
}
@@ -875,6 +785,18 @@ int HttpStreamFactoryImpl::Job::DoInitConnectionImpl() {
FROM_HERE_WITH_EXPLICIT_FUNCTION(
"462812 HttpStreamFactoryImpl::Job::DoInitConnection"));
DCHECK(!connection_->is_initialized());
+
+ 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;
+ } else if (using_quic_ &&
+ (!proxy_info_.is_quic() && !proxy_info_.is_direct())) {
+ // QUIC can not be spoken to non-QUIC proxies. This error should not be
+ // user visible, because the non-alternative Job should be resumed.
+ return ERR_NO_SUPPORTED_PROXIES;
+ }
+
DCHECK(proxy_info_.proxy_server().is_valid());
next_state_ = STATE_INIT_CONNECTION_COMPLETE;
@@ -939,9 +861,9 @@ int HttpStreamFactoryImpl::Job::DoInitConnectionImpl() {
ssl_config = &server_ssl_config_;
}
int rv =
- quic_request_.Request(destination, request_info_.privacy_mode,
- ssl_config->GetCertVerifyFlags(), url,
- request_info_.method, net_log_, io_callback_);
+ quic_request_->Request(destination, request_info_.privacy_mode,
+ ssl_config->GetCertVerifyFlags(), url,
+ request_info_.method, net_log_, io_callback_);
if (rv == OK) {
using_existing_quic_session_ = true;
} else {
@@ -949,7 +871,7 @@ int HttpStreamFactoryImpl::Job::DoInitConnectionImpl() {
// delay the main job.
if (rv == ERR_IO_PENDING) {
delegate_->MaybeSetWaitTimeForMainJob(
- quic_request_.GetTimeDelayForWaitingJob());
+ quic_request_->GetTimeDelayForWaitingJob());
}
}
return rv;
@@ -1129,13 +1051,13 @@ int HttpStreamFactoryImpl::Job::DoInitConnectionComplete(int result) {
if (stream_type_ == HttpStreamRequest::BIDIRECTIONAL_STREAM) {
bidirectional_stream_impl_ =
- quic_request_.CreateBidirectionalStreamImpl();
+ quic_request_->CreateBidirectionalStreamImpl();
if (!bidirectional_stream_impl_) {
// Quic session is closed before stream can be created.
return ERR_CONNECTION_CLOSED;
}
} else {
- stream_ = quic_request_.CreateStream();
+ stream_ = quic_request_->CreateStream();
if (!stream_) {
// Quic session is closed before stream can be created.
return ERR_CONNECTION_CLOSED;
@@ -1147,6 +1069,7 @@ int HttpStreamFactoryImpl::Job::DoInitConnectionComplete(int result) {
if (result < 0 && !ssl_started)
return ReconsiderProxyAfterError(result);
+
establishing_tunnel_ = false;
// Handle SSL errors below.
@@ -1413,19 +1336,7 @@ void HttpStreamFactoryImpl::Job::InitSSLConfig(SSLConfig* ssl_config,
ssl_config->channel_id_enabled = false;
}
-
int HttpStreamFactoryImpl::Job::ReconsiderProxyAfterError(int error) {
- DCHECK(!pac_request_);
- DCHECK(session_);
-
- // A failure to resolve the hostname or any error related to establishing a
- // TCP connection could be grounds for trying a new proxy configuration.
- //
- // Why do this when a hostname cannot be resolved? Some URLs only make sense
- // to proxy servers. The hostname in those URLs might fail to resolve if we
- // are still using a non-proxy config. We need to check if a proxy config
- // now exists that corresponds to a proxy server that could load the URL.
- //
switch (error) {
case ERR_PROXY_CONNECTION_FAILED:
case ERR_NAME_NOT_RESOLVED:
@@ -1464,46 +1375,16 @@ int HttpStreamFactoryImpl::Job::ReconsiderProxyAfterError(int error) {
return error;
}
- // Do not bypass non-QUIC proxy on ERR_MSG_TOO_BIG.
- if (!proxy_info_.is_quic() && error == ERR_MSG_TOO_BIG)
- return error;
-
- if (request_info_.load_flags & LOAD_BYPASS_PROXY)
- return error;
-
// Alternative proxy server job should not use fallback proxies, and instead
// return. This would resume the main job (if possible) which may try the
// fallback proxies.
- if (alternative_proxy_server_.is_valid()) {
+ if (job_type() == ALTERNATIVE && alternative_proxy_server().is_valid()) {
DCHECK_EQ(STATE_NONE, next_state_);
return error;
}
- if (proxy_info_.is_https() && proxy_ssl_config_.send_client_cert) {
- session_->ssl_client_auth_cache()->Remove(
- proxy_info_.proxy_server().host_port_pair());
- }
-
- int rv = session_->proxy_service()->ReconsiderProxyAfterError(
- request_info_.url, request_info_.method, error, &proxy_info_,
- io_callback_, &pac_request_, session_->params().proxy_delegate, net_log_);
- if (rv == OK || rv == ERR_IO_PENDING) {
- // If the error was during connection setup, there is no socket to
- // disconnect.
- if (connection_->socket())
- connection_->socket()->Disconnect();
- connection_->Reset();
- delegate_->RemoveRequestFromSpdySessionRequestMapForJob(this);
- next_state_ = STATE_RESOLVE_PROXY_COMPLETE;
- } else {
- // If ReconsiderProxyAfterError() failed synchronously, it means
- // there was nothing left to fall-back to, so fail the transaction
- // with the last connection error we got.
- // TODO(eroman): This is a confusing contract, make it more obvious.
- rv = error;
- }
-
- return rv;
+ reconsider_proxy_ = true;
+ return error;
}
int HttpStreamFactoryImpl::Job::HandleCertificateError(int error) {

Powered by Google App Engine
This is Rietveld 408576698