| Index: net/http/http_network_transaction.cc
|
| diff --git a/net/http/http_network_transaction.cc b/net/http/http_network_transaction.cc
|
| index a5395d758bcc4c9d26ef115ca43da28ce9424a0c..e0105c60396fe3f891916b12114cff7c14da899b 100644
|
| --- a/net/http/http_network_transaction.cc
|
| +++ b/net/http/http_network_transaction.cc
|
| @@ -100,9 +100,9 @@ HttpNetworkTransaction::HttpNetworkTransaction(RequestPriority priority,
|
| total_sent_bytes_(0),
|
| next_state_(STATE_NONE),
|
| establishing_tunnel_(false),
|
| + enable_ip_based_pooling_(true),
|
| websocket_handshake_stream_base_create_helper_(NULL),
|
| - net_error_details_() {
|
| -}
|
| + net_error_details_() {}
|
|
|
| HttpNetworkTransaction::~HttpNetworkTransaction() {
|
| if (stream_.get()) {
|
| @@ -847,22 +847,13 @@ int HttpNetworkTransaction::DoCreateStream() {
|
| stream_request_.reset(
|
| session_->http_stream_factory_for_websocket()
|
| ->RequestWebSocketHandshakeStream(
|
| - *request_,
|
| - priority_,
|
| - server_ssl_config_,
|
| - proxy_ssl_config_,
|
| - this,
|
| - websocket_handshake_stream_base_create_helper_,
|
| - net_log_));
|
| + *request_, priority_, server_ssl_config_, proxy_ssl_config_,
|
| + this, websocket_handshake_stream_base_create_helper_,
|
| + enable_ip_based_pooling_, net_log_));
|
| } else {
|
| - stream_request_.reset(
|
| - session_->http_stream_factory()->RequestStream(
|
| - *request_,
|
| - priority_,
|
| - server_ssl_config_,
|
| - proxy_ssl_config_,
|
| - this,
|
| - net_log_));
|
| + stream_request_.reset(session_->http_stream_factory()->RequestStream(
|
| + *request_, priority_, server_ssl_config_, proxy_ssl_config_, this,
|
| + enable_ip_based_pooling_, net_log_));
|
| }
|
| DCHECK(stream_request_.get());
|
| return ERR_IO_PENDING;
|
| @@ -1292,6 +1283,10 @@ int HttpNetworkTransaction::DoReadHeadersComplete(int result) {
|
| return OK;
|
| }
|
|
|
| + if (response_.headers->response_code() == 421) {
|
| + return HandleIOError(ERR_MISDIRECTED_REQUEST);
|
| + }
|
| +
|
| if (IsSecureRequest()) {
|
| session_->http_stream_factory()->ProcessAlternativeServices(
|
| session_, response_.headers.get(), url::SchemeHostPort(request_->url));
|
| @@ -1546,6 +1541,18 @@ int HttpNetworkTransaction::HandleIOError(int error) {
|
| ResetConnectionAndRequestForResend();
|
| error = OK;
|
| break;
|
| + case ERR_MISDIRECTED_REQUEST:
|
| + // If this is the second try, just give up.
|
| + if (!enable_ip_based_pooling_)
|
| + return OK;
|
| + // Otherwise, since the response status was 421 Misdirected Request,
|
| + // retry the request with IP based pooling disabled.
|
| + enable_ip_based_pooling_ = false;
|
| + net_log_.AddEventWithNetErrorCode(
|
| + NetLogEventType::HTTP_TRANSACTION_RESTART_AFTER_ERROR, error);
|
| + ResetConnectionAndRequestForResend();
|
| + error = OK;
|
| + break;
|
| }
|
| return error;
|
| }
|
|
|