Commit e05fe063 authored by tbansal's avatar tbansal Committed by Commit bot

Bypass QUIC proxy on ERR_QUIC_HANDSHAKE_FAILED

Also, fixed variable names to comply with style guide.

BUG=459426

Review URL: https://codereview.chromium.org/939083003

Cr-Commit-Position: refs/heads/master@{#317109}
parent 4cf440af
...@@ -904,7 +904,8 @@ int HttpStreamFactoryImpl::Job::DoInitConnectionComplete(int result) { ...@@ -904,7 +904,8 @@ int HttpStreamFactoryImpl::Job::DoInitConnectionComplete(int result) {
} }
if (proxy_info_.is_quic() && using_quic_ && if (proxy_info_.is_quic() && using_quic_ &&
result == ERR_QUIC_PROTOCOL_ERROR) { (result == ERR_QUIC_PROTOCOL_ERROR ||
result == ERR_QUIC_HANDSHAKE_FAILED)) {
using_quic_ = false; using_quic_ = false;
return ReconsiderProxyAfterError(result); return ReconsiderProxyAfterError(result);
} }
...@@ -1320,6 +1321,7 @@ int HttpStreamFactoryImpl::Job::ReconsiderProxyAfterError(int error) { ...@@ -1320,6 +1321,7 @@ int HttpStreamFactoryImpl::Job::ReconsiderProxyAfterError(int error) {
// This can happen when trying to talk SSL to a non-SSL server (Like a // This can happen when trying to talk SSL to a non-SSL server (Like a
// captive portal). // captive portal).
case ERR_QUIC_PROTOCOL_ERROR: case ERR_QUIC_PROTOCOL_ERROR:
case ERR_QUIC_HANDSHAKE_FAILED:
case ERR_SSL_PROTOCOL_ERROR: case ERR_SSL_PROTOCOL_ERROR:
break; break;
case ERR_SOCKS_CONNECTION_HOST_UNREACHABLE: case ERR_SOCKS_CONNECTION_HOST_UNREACHABLE:
......
...@@ -617,61 +617,66 @@ TEST_P(HttpStreamFactoryTest, JobNotifiesProxy) { ...@@ -617,61 +617,66 @@ TEST_P(HttpStreamFactoryTest, JobNotifiesProxy) {
} }
TEST_P(HttpStreamFactoryTest, UnreachableQuicProxyMarkedAsBad) { TEST_P(HttpStreamFactoryTest, UnreachableQuicProxyMarkedAsBad) {
scoped_ptr<ProxyService> proxy_service_; for (int i = 1; i <= 2; i++) {
proxy_service_.reset( int mock_error =
ProxyService::CreateFixedFromPacResult("QUIC bad:99; DIRECT")); i == 1 ? ERR_QUIC_PROTOCOL_ERROR : ERR_QUIC_HANDSHAKE_FAILED;
HttpNetworkSession::Params params_; scoped_ptr<ProxyService> proxy_service;
params_.enable_quic = true; proxy_service.reset(
scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_( ProxyService::CreateFixedFromPacResult("QUIC bad:99; DIRECT"));
new SSLConfigServiceDefaults);
HttpServerPropertiesImpl http_server_properties; HttpNetworkSession::Params params;
MockClientSocketFactory socket_factory_; params.enable_quic = true;
params_.client_socket_factory = &socket_factory_; scoped_refptr<SSLConfigServiceDefaults> ssl_config_service(
MockHostResolver host_resolver_; new SSLConfigServiceDefaults);
params_.host_resolver = &host_resolver_; HttpServerPropertiesImpl http_server_properties;
TransportSecurityState transport_security_state_; MockClientSocketFactory socket_factory;
params_.transport_security_state = &transport_security_state_; params.client_socket_factory = &socket_factory;
params_.proxy_service = proxy_service_.get(); MockHostResolver host_resolver;
params_.ssl_config_service = ssl_config_service_.get(); params.host_resolver = &host_resolver;
params_.http_server_properties = http_server_properties.GetWeakPtr(); TransportSecurityState transport_security_state;
params.transport_security_state = &transport_security_state;
scoped_refptr<HttpNetworkSession> session; params.proxy_service = proxy_service.get();
session = new HttpNetworkSession(params_); params.ssl_config_service = ssl_config_service.get();
session->quic_stream_factory()->set_require_confirmation(false); params.http_server_properties = http_server_properties.GetWeakPtr();
StaticSocketDataProvider socket_data1; scoped_refptr<HttpNetworkSession> session;
socket_data1.set_connect_data(MockConnect(ASYNC, ERR_QUIC_PROTOCOL_ERROR)); session = new HttpNetworkSession(params);
socket_factory_.AddSocketDataProvider(&socket_data1); session->quic_stream_factory()->set_require_confirmation(false);
// Second connection attempt succeeds StaticSocketDataProvider socket_data1;
StaticSocketDataProvider socket_data2; socket_data1.set_connect_data(MockConnect(ASYNC, mock_error));
socket_data2.set_connect_data(MockConnect(ASYNC, OK)); socket_factory.AddSocketDataProvider(&socket_data1);
socket_factory_.AddSocketDataProvider(&socket_data2);
// Second connection attempt succeeds.
// Now request a stream. It should succeed using the second proxy in the StaticSocketDataProvider socket_data2;
// list. socket_data2.set_connect_data(MockConnect(ASYNC, OK));
HttpRequestInfo request_info; socket_factory.AddSocketDataProvider(&socket_data2);
request_info.method = "GET";
request_info.url = GURL("http://www.google.com"); // Now request a stream. It should succeed using the second proxy in the
// list.
SSLConfig ssl_config; HttpRequestInfo request_info;
StreamRequestWaiter waiter; request_info.method = "GET";
scoped_ptr<HttpStreamRequest> request( request_info.url = GURL("http://www.google.com");
session->http_stream_factory()->RequestStream(
request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, &waiter, SSLConfig ssl_config;
BoundNetLog())); StreamRequestWaiter waiter;
waiter.WaitForStream(); scoped_ptr<HttpStreamRequest> request(
session->http_stream_factory()->RequestStream(
// The proxy that failed should now be known to the proxy_service as bad. request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, &waiter,
const ProxyRetryInfoMap& retry_info = BoundNetLog()));
session->proxy_service()->proxy_retry_info(); waiter.WaitForStream();
// proxy_headers_handler.proxy_info_used.proxy_retry_info();
EXPECT_EQ(1u, retry_info.size()); // The proxy that failed should now be known to the proxy_service as bad.
EXPECT_TRUE(waiter.used_proxy_info().is_direct()); const ProxyRetryInfoMap& retry_info =
session->proxy_service()->proxy_retry_info();
ProxyRetryInfoMap::const_iterator iter = retry_info.find("quic://bad:99"); // proxy_headers_handler.proxy_info_used.proxy_retry_info();
EXPECT_TRUE(iter != retry_info.end()); EXPECT_EQ(1u, retry_info.size()) << i;
// EXPECT_TRUE(waiter.used_proxy_info().is_direct());
ProxyRetryInfoMap::const_iterator iter = retry_info.find("quic://bad:99");
EXPECT_TRUE(iter != retry_info.end()) << i;
}
} }
TEST_P(HttpStreamFactoryTest, PrivacyModeDisablesChannelId) { TEST_P(HttpStreamFactoryTest, PrivacyModeDisablesChannelId) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment