OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/http/http_network_transaction.h" | 5 #include "net/http/http_network_transaction.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <set> | 8 #include <set> |
9 #include <utility> | 9 #include <utility> |
10 #include <vector> | 10 #include <vector> |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
93 session_(session), | 93 session_(session), |
94 request_(NULL), | 94 request_(NULL), |
95 priority_(priority), | 95 priority_(priority), |
96 headers_valid_(false), | 96 headers_valid_(false), |
97 request_headers_(), | 97 request_headers_(), |
98 read_buf_len_(0), | 98 read_buf_len_(0), |
99 total_received_bytes_(0), | 99 total_received_bytes_(0), |
100 total_sent_bytes_(0), | 100 total_sent_bytes_(0), |
101 next_state_(STATE_NONE), | 101 next_state_(STATE_NONE), |
102 establishing_tunnel_(false), | 102 establishing_tunnel_(false), |
103 enable_ip_based_pooling_(true), | |
103 websocket_handshake_stream_base_create_helper_(NULL), | 104 websocket_handshake_stream_base_create_helper_(NULL), |
104 net_error_details_() { | 105 net_error_details_() {} |
105 } | |
106 | 106 |
107 HttpNetworkTransaction::~HttpNetworkTransaction() { | 107 HttpNetworkTransaction::~HttpNetworkTransaction() { |
108 if (stream_.get()) { | 108 if (stream_.get()) { |
109 // TODO(mbelshe): The stream_ should be able to compute whether or not the | 109 // TODO(mbelshe): The stream_ should be able to compute whether or not the |
110 // stream should be kept alive. No reason to compute here | 110 // stream should be kept alive. No reason to compute here |
111 // and pass it in. | 111 // and pass it in. |
112 if (!stream_->CanReuseConnection() || next_state_ != STATE_NONE) { | 112 if (!stream_->CanReuseConnection() || next_state_ != STATE_NONE) { |
113 stream_->Close(true /* not reusable */); | 113 stream_->Close(true /* not reusable */); |
114 } else if (stream_->IsResponseBodyComplete()) { | 114 } else if (stream_->IsResponseBodyComplete()) { |
115 // If the response body is complete, we can just reuse the socket. | 115 // If the response body is complete, we can just reuse the socket. |
(...skipping 724 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
840 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 840 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
841 "424359 HttpNetworkTransaction::DoCreateStream")); | 841 "424359 HttpNetworkTransaction::DoCreateStream")); |
842 | 842 |
843 response_.network_accessed = true; | 843 response_.network_accessed = true; |
844 | 844 |
845 next_state_ = STATE_CREATE_STREAM_COMPLETE; | 845 next_state_ = STATE_CREATE_STREAM_COMPLETE; |
846 if (ForWebSocketHandshake()) { | 846 if (ForWebSocketHandshake()) { |
847 stream_request_.reset( | 847 stream_request_.reset( |
848 session_->http_stream_factory_for_websocket() | 848 session_->http_stream_factory_for_websocket() |
849 ->RequestWebSocketHandshakeStream( | 849 ->RequestWebSocketHandshakeStream( |
850 *request_, | 850 *request_, priority_, server_ssl_config_, proxy_ssl_config_, |
851 priority_, | 851 this, websocket_handshake_stream_base_create_helper_, |
852 server_ssl_config_, | 852 enable_ip_based_pooling_, net_log_)); |
853 proxy_ssl_config_, | |
854 this, | |
855 websocket_handshake_stream_base_create_helper_, | |
856 net_log_)); | |
857 } else { | 853 } else { |
858 stream_request_.reset( | 854 stream_request_.reset(session_->http_stream_factory()->RequestStream( |
859 session_->http_stream_factory()->RequestStream( | 855 *request_, priority_, server_ssl_config_, proxy_ssl_config_, this, |
860 *request_, | 856 enable_ip_based_pooling_, net_log_)); |
861 priority_, | |
862 server_ssl_config_, | |
863 proxy_ssl_config_, | |
864 this, | |
865 net_log_)); | |
866 } | 857 } |
867 DCHECK(stream_request_.get()); | 858 DCHECK(stream_request_.get()); |
868 return ERR_IO_PENDING; | 859 return ERR_IO_PENDING; |
869 } | 860 } |
870 | 861 |
871 int HttpNetworkTransaction::DoCreateStreamComplete(int result) { | 862 int HttpNetworkTransaction::DoCreateStreamComplete(int result) { |
872 // If |result| is ERR_HTTPS_PROXY_TUNNEL_RESPONSE, then | 863 // If |result| is ERR_HTTPS_PROXY_TUNNEL_RESPONSE, then |
873 // DoCreateStreamComplete is being called from OnHttpsProxyTunnelResponse, | 864 // DoCreateStreamComplete is being called from OnHttpsProxyTunnelResponse, |
874 // which resets the stream request first. Therefore, we have to grab the | 865 // which resets the stream request first. Therefore, we have to grab the |
875 // connection attempts in *that* function instead of here in that case. | 866 // connection attempts in *that* function instead of here in that case. |
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1285 // We treat any other 1xx in this same way (although in practice getting | 1276 // We treat any other 1xx in this same way (although in practice getting |
1286 // a 1xx that isn't a 100 is rare). | 1277 // a 1xx that isn't a 100 is rare). |
1287 // Unless this is a WebSocket request, in which case we pass it on up. | 1278 // Unless this is a WebSocket request, in which case we pass it on up. |
1288 if (response_.headers->response_code() / 100 == 1 && | 1279 if (response_.headers->response_code() / 100 == 1 && |
1289 !ForWebSocketHandshake()) { | 1280 !ForWebSocketHandshake()) { |
1290 response_.headers = new HttpResponseHeaders(std::string()); | 1281 response_.headers = new HttpResponseHeaders(std::string()); |
1291 next_state_ = STATE_READ_HEADERS; | 1282 next_state_ = STATE_READ_HEADERS; |
1292 return OK; | 1283 return OK; |
1293 } | 1284 } |
1294 | 1285 |
1286 if (response_.headers->response_code() == 421) { | |
1287 return HandleIOError(ERR_MISDIRECTED_REQUEST); | |
1288 } | |
1289 | |
1295 if (IsSecureRequest()) { | 1290 if (IsSecureRequest()) { |
1296 session_->http_stream_factory()->ProcessAlternativeServices( | 1291 session_->http_stream_factory()->ProcessAlternativeServices( |
1297 session_, response_.headers.get(), url::SchemeHostPort(request_->url)); | 1292 session_, response_.headers.get(), url::SchemeHostPort(request_->url)); |
1298 } | 1293 } |
1299 | 1294 |
1300 if (IsSecureRequest()) | 1295 if (IsSecureRequest()) |
1301 stream_->GetSSLInfo(&response_.ssl_info); | 1296 stream_->GetSSLInfo(&response_.ssl_info); |
1302 | 1297 |
1303 int rv = HandleAuthChallenge(); | 1298 int rv = HandleAuthChallenge(); |
1304 if (rv != OK) | 1299 if (rv != OK) |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1539 } | 1534 } |
1540 break; | 1535 break; |
1541 case ERR_SPDY_PING_FAILED: | 1536 case ERR_SPDY_PING_FAILED: |
1542 case ERR_SPDY_SERVER_REFUSED_STREAM: | 1537 case ERR_SPDY_SERVER_REFUSED_STREAM: |
1543 case ERR_QUIC_HANDSHAKE_FAILED: | 1538 case ERR_QUIC_HANDSHAKE_FAILED: |
1544 net_log_.AddEventWithNetErrorCode( | 1539 net_log_.AddEventWithNetErrorCode( |
1545 NetLogEventType::HTTP_TRANSACTION_RESTART_AFTER_ERROR, error); | 1540 NetLogEventType::HTTP_TRANSACTION_RESTART_AFTER_ERROR, error); |
1546 ResetConnectionAndRequestForResend(); | 1541 ResetConnectionAndRequestForResend(); |
1547 error = OK; | 1542 error = OK; |
1548 break; | 1543 break; |
1544 case ERR_MISDIRECTED_REQUEST: | |
1545 // 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.
| |
1546 if (!enable_ip_based_pooling_) | |
1547 return OK; | |
1548 enable_ip_based_pooling_ = false; | |
1549 net_log_.AddEventWithNetErrorCode( | |
1550 NetLogEventType::HTTP_TRANSACTION_RESTART_AFTER_ERROR, error); | |
1551 ResetConnectionAndRequestForResend(); | |
1552 error = OK; | |
1553 break; | |
1549 } | 1554 } |
1550 return error; | 1555 return error; |
1551 } | 1556 } |
1552 | 1557 |
1553 void HttpNetworkTransaction::ResetStateForRestart() { | 1558 void HttpNetworkTransaction::ResetStateForRestart() { |
1554 ResetStateForAuthRestart(); | 1559 ResetStateForAuthRestart(); |
1555 if (stream_) { | 1560 if (stream_) { |
1556 total_received_bytes_ += stream_->GetTotalReceivedBytes(); | 1561 total_received_bytes_ += stream_->GetTotalReceivedBytes(); |
1557 total_sent_bytes_ += stream_->GetTotalSentBytes(); | 1562 total_sent_bytes_ += stream_->GetTotalSentBytes(); |
1558 } | 1563 } |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1705 DCHECK(stream_request_); | 1710 DCHECK(stream_request_); |
1706 | 1711 |
1707 // Since the transaction can restart with auth credentials, it may create a | 1712 // Since the transaction can restart with auth credentials, it may create a |
1708 // stream more than once. Accumulate all of the connection attempts across | 1713 // stream more than once. Accumulate all of the connection attempts across |
1709 // those streams by appending them to the vector: | 1714 // those streams by appending them to the vector: |
1710 for (const auto& attempt : stream_request_->connection_attempts()) | 1715 for (const auto& attempt : stream_request_->connection_attempts()) |
1711 connection_attempts_.push_back(attempt); | 1716 connection_attempts_.push_back(attempt); |
1712 } | 1717 } |
1713 | 1718 |
1714 } // namespace net | 1719 } // namespace net |
OLD | NEW |