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..d0c06db46a75fda6513f5909178b39bac2fc0f14 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,16 @@ int HttpNetworkTransaction::HandleIOError(int error) { |
ResetConnectionAndRequestForResend(); |
error = OK; |
break; |
+ case ERR_MISDIRECTED_REQUEST: |
+ // If this is the second try, just give up. |
Zhongyi Shi
2017/03/29 03:05:06
nit: it might be worth noting in the comments sayi
Bence
2017/03/29 16:46:07
Done.
|
+ if (!enable_ip_based_pooling_) |
+ return OK; |
+ enable_ip_based_pooling_ = false; |
+ net_log_.AddEventWithNetErrorCode( |
+ NetLogEventType::HTTP_TRANSACTION_RESTART_AFTER_ERROR, error); |
+ ResetConnectionAndRequestForResend(); |
+ error = OK; |
+ break; |
} |
return error; |
} |