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) {
}
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;
return ReconsiderProxyAfterError(result);
}
......@@ -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
// captive portal).
case ERR_QUIC_PROTOCOL_ERROR:
case ERR_QUIC_HANDSHAKE_FAILED:
case ERR_SSL_PROTOCOL_ERROR:
break;
case ERR_SOCKS_CONNECTION_HOST_UNREACHABLE:
......
......@@ -617,61 +617,66 @@ TEST_P(HttpStreamFactoryTest, JobNotifiesProxy) {
}
TEST_P(HttpStreamFactoryTest, UnreachableQuicProxyMarkedAsBad) {
scoped_ptr<ProxyService> proxy_service_;
proxy_service_.reset(
ProxyService::CreateFixedFromPacResult("QUIC bad:99; DIRECT"));
HttpNetworkSession::Params params_;
params_.enable_quic = true;
scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_(
new SSLConfigServiceDefaults);
HttpServerPropertiesImpl http_server_properties;
MockClientSocketFactory socket_factory_;
params_.client_socket_factory = &socket_factory_;
MockHostResolver host_resolver_;
params_.host_resolver = &host_resolver_;
TransportSecurityState transport_security_state_;
params_.transport_security_state = &transport_security_state_;
params_.proxy_service = proxy_service_.get();
params_.ssl_config_service = ssl_config_service_.get();
params_.http_server_properties = http_server_properties.GetWeakPtr();
scoped_refptr<HttpNetworkSession> session;
session = new HttpNetworkSession(params_);
session->quic_stream_factory()->set_require_confirmation(false);
StaticSocketDataProvider socket_data1;
socket_data1.set_connect_data(MockConnect(ASYNC, ERR_QUIC_PROTOCOL_ERROR));
socket_factory_.AddSocketDataProvider(&socket_data1);
// Second connection attempt succeeds
StaticSocketDataProvider socket_data2;
socket_data2.set_connect_data(MockConnect(ASYNC, OK));
socket_factory_.AddSocketDataProvider(&socket_data2);
// Now request a stream. It should succeed using the second proxy in the
// list.
HttpRequestInfo request_info;
request_info.method = "GET";
request_info.url = GURL("http://www.google.com");
SSLConfig ssl_config;
StreamRequestWaiter waiter;
scoped_ptr<HttpStreamRequest> request(
session->http_stream_factory()->RequestStream(
request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, &waiter,
BoundNetLog()));
waiter.WaitForStream();
// The proxy that failed should now be known to the proxy_service as bad.
const ProxyRetryInfoMap& retry_info =
session->proxy_service()->proxy_retry_info();
// proxy_headers_handler.proxy_info_used.proxy_retry_info();
EXPECT_EQ(1u, retry_info.size());
EXPECT_TRUE(waiter.used_proxy_info().is_direct());
ProxyRetryInfoMap::const_iterator iter = retry_info.find("quic://bad:99");
EXPECT_TRUE(iter != retry_info.end());
for (int i = 1; i <= 2; i++) {
int mock_error =
i == 1 ? ERR_QUIC_PROTOCOL_ERROR : ERR_QUIC_HANDSHAKE_FAILED;
scoped_ptr<ProxyService> proxy_service;
proxy_service.reset(
ProxyService::CreateFixedFromPacResult("QUIC bad:99; DIRECT"));
HttpNetworkSession::Params params;
params.enable_quic = true;
scoped_refptr<SSLConfigServiceDefaults> ssl_config_service(
new SSLConfigServiceDefaults);
HttpServerPropertiesImpl http_server_properties;
MockClientSocketFactory socket_factory;
params.client_socket_factory = &socket_factory;
MockHostResolver host_resolver;
params.host_resolver = &host_resolver;
TransportSecurityState transport_security_state;
params.transport_security_state = &transport_security_state;
params.proxy_service = proxy_service.get();
params.ssl_config_service = ssl_config_service.get();
params.http_server_properties = http_server_properties.GetWeakPtr();
scoped_refptr<HttpNetworkSession> session;
session = new HttpNetworkSession(params);
session->quic_stream_factory()->set_require_confirmation(false);
StaticSocketDataProvider socket_data1;
socket_data1.set_connect_data(MockConnect(ASYNC, mock_error));
socket_factory.AddSocketDataProvider(&socket_data1);
// Second connection attempt succeeds.
StaticSocketDataProvider socket_data2;
socket_data2.set_connect_data(MockConnect(ASYNC, OK));
socket_factory.AddSocketDataProvider(&socket_data2);
// Now request a stream. It should succeed using the second proxy in the
// list.
HttpRequestInfo request_info;
request_info.method = "GET";
request_info.url = GURL("http://www.google.com");
SSLConfig ssl_config;
StreamRequestWaiter waiter;
scoped_ptr<HttpStreamRequest> request(
session->http_stream_factory()->RequestStream(
request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, &waiter,
BoundNetLog()));
waiter.WaitForStream();
// The proxy that failed should now be known to the proxy_service as bad.
const ProxyRetryInfoMap& retry_info =
session->proxy_service()->proxy_retry_info();
// proxy_headers_handler.proxy_info_used.proxy_retry_info();
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) {
......
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