| 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 <set> | 7 #include <set> | 
| 8 #include <vector> | 8 #include <vector> | 
| 9 | 9 | 
| 10 #include "base/bind.h" | 10 #include "base/bind.h" | 
| (...skipping 552 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 563     total_received_bytes_ += stream_->GetTotalReceivedBytes(); | 563     total_received_bytes_ += stream_->GetTotalReceivedBytes(); | 
| 564   stream_.reset(stream); | 564   stream_.reset(stream); | 
| 565   stream_request_.reset();  // we're done with the stream request | 565   stream_request_.reset();  // we're done with the stream request | 
| 566   OnIOComplete(ERR_HTTPS_PROXY_TUNNEL_RESPONSE); | 566   OnIOComplete(ERR_HTTPS_PROXY_TUNNEL_RESPONSE); | 
| 567 } | 567 } | 
| 568 | 568 | 
| 569 bool HttpNetworkTransaction::is_https_request() const { | 569 bool HttpNetworkTransaction::is_https_request() const { | 
| 570   return request_->url.SchemeIs("https"); | 570   return request_->url.SchemeIs("https"); | 
| 571 } | 571 } | 
| 572 | 572 | 
|  | 573 bool HttpNetworkTransaction::UsingHttpProxyWithoutTunnel() const { | 
|  | 574   return (proxy_info_.is_http() || proxy_info_.is_https()) && | 
|  | 575          !(request_->url.SchemeIs("https") || request_->url.SchemeIsWSOrWSS()); | 
|  | 576 } | 
|  | 577 | 
| 573 void HttpNetworkTransaction::DoCallback(int rv) { | 578 void HttpNetworkTransaction::DoCallback(int rv) { | 
| 574   DCHECK_NE(rv, ERR_IO_PENDING); | 579   DCHECK_NE(rv, ERR_IO_PENDING); | 
| 575   DCHECK(!callback_.is_null()); | 580   DCHECK(!callback_.is_null()); | 
| 576 | 581 | 
| 577   // Since Run may result in Read being called, clear user_callback_ up front. | 582   // Since Run may result in Read being called, clear user_callback_ up front. | 
| 578   CompletionCallback c = callback_; | 583   CompletionCallback c = callback_; | 
| 579   callback_.Reset(); | 584   callback_.Reset(); | 
| 580   c.Run(rv); | 585   c.Run(rv); | 
| 581 } | 586 } | 
| 582 | 587 | 
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 827                                                            net_log_); | 832                                                            net_log_); | 
| 828 } | 833 } | 
| 829 | 834 | 
| 830 int HttpNetworkTransaction::DoGenerateServerAuthTokenComplete(int rv) { | 835 int HttpNetworkTransaction::DoGenerateServerAuthTokenComplete(int rv) { | 
| 831   DCHECK_NE(ERR_IO_PENDING, rv); | 836   DCHECK_NE(ERR_IO_PENDING, rv); | 
| 832   if (rv == OK) | 837   if (rv == OK) | 
| 833     next_state_ = STATE_INIT_REQUEST_BODY; | 838     next_state_ = STATE_INIT_REQUEST_BODY; | 
| 834   return rv; | 839   return rv; | 
| 835 } | 840 } | 
| 836 | 841 | 
| 837 void HttpNetworkTransaction::BuildRequestHeaders(bool using_proxy) { | 842 void HttpNetworkTransaction::BuildRequestHeaders( | 
|  | 843     bool using_http_proxy_without_tunnel) { | 
| 838   request_headers_.SetHeader(HttpRequestHeaders::kHost, | 844   request_headers_.SetHeader(HttpRequestHeaders::kHost, | 
| 839                              GetHostAndOptionalPort(request_->url)); | 845                              GetHostAndOptionalPort(request_->url)); | 
| 840 | 846 | 
| 841   // For compat with HTTP/1.0 servers and proxies: | 847   // For compat with HTTP/1.0 servers and proxies: | 
| 842   if (using_proxy) { | 848   if (using_http_proxy_without_tunnel) { | 
| 843     request_headers_.SetHeader(HttpRequestHeaders::kProxyConnection, | 849     request_headers_.SetHeader(HttpRequestHeaders::kProxyConnection, | 
| 844                                "keep-alive"); | 850                                "keep-alive"); | 
| 845   } else { | 851   } else { | 
| 846     request_headers_.SetHeader(HttpRequestHeaders::kConnection, "keep-alive"); | 852     request_headers_.SetHeader(HttpRequestHeaders::kConnection, "keep-alive"); | 
| 847   } | 853   } | 
| 848 | 854 | 
| 849   // Add a content length header? | 855   // Add a content length header? | 
| 850   if (request_->upload_data_stream) { | 856   if (request_->upload_data_stream) { | 
| 851     if (request_->upload_data_stream->is_chunked()) { | 857     if (request_->upload_data_stream->is_chunked()) { | 
| 852       request_headers_.SetHeader( | 858       request_headers_.SetHeader( | 
| (...skipping 22 matching lines...) Expand all  Loading... | 
| 875 | 881 | 
| 876   if (ShouldApplyProxyAuth() && HaveAuth(HttpAuth::AUTH_PROXY)) | 882   if (ShouldApplyProxyAuth() && HaveAuth(HttpAuth::AUTH_PROXY)) | 
| 877     auth_controllers_[HttpAuth::AUTH_PROXY]->AddAuthorizationHeader( | 883     auth_controllers_[HttpAuth::AUTH_PROXY]->AddAuthorizationHeader( | 
| 878         &request_headers_); | 884         &request_headers_); | 
| 879   if (ShouldApplyServerAuth() && HaveAuth(HttpAuth::AUTH_SERVER)) | 885   if (ShouldApplyServerAuth() && HaveAuth(HttpAuth::AUTH_SERVER)) | 
| 880     auth_controllers_[HttpAuth::AUTH_SERVER]->AddAuthorizationHeader( | 886     auth_controllers_[HttpAuth::AUTH_SERVER]->AddAuthorizationHeader( | 
| 881         &request_headers_); | 887         &request_headers_); | 
| 882 | 888 | 
| 883   request_headers_.MergeFrom(request_->extra_headers); | 889   request_headers_.MergeFrom(request_->extra_headers); | 
| 884 | 890 | 
| 885   if (using_proxy && !before_proxy_headers_sent_callback_.is_null()) | 891   if (using_http_proxy_without_tunnel && | 
|  | 892       !before_proxy_headers_sent_callback_.is_null()) | 
| 886     before_proxy_headers_sent_callback_.Run(proxy_info_, &request_headers_); | 893     before_proxy_headers_sent_callback_.Run(proxy_info_, &request_headers_); | 
| 887 | 894 | 
| 888   response_.did_use_http_auth = | 895   response_.did_use_http_auth = | 
| 889       request_headers_.HasHeader(HttpRequestHeaders::kAuthorization) || | 896       request_headers_.HasHeader(HttpRequestHeaders::kAuthorization) || | 
| 890       request_headers_.HasHeader(HttpRequestHeaders::kProxyAuthorization); | 897       request_headers_.HasHeader(HttpRequestHeaders::kProxyAuthorization); | 
| 891 } | 898 } | 
| 892 | 899 | 
| 893 int HttpNetworkTransaction::DoInitRequestBody() { | 900 int HttpNetworkTransaction::DoInitRequestBody() { | 
| 894   next_state_ = STATE_INIT_REQUEST_BODY_COMPLETE; | 901   next_state_ = STATE_INIT_REQUEST_BODY_COMPLETE; | 
| 895   int rv = OK; | 902   int rv = OK; | 
| 896   if (request_->upload_data_stream) | 903   if (request_->upload_data_stream) | 
| 897     rv = request_->upload_data_stream->Init(io_callback_); | 904     rv = request_->upload_data_stream->Init(io_callback_); | 
| 898   return rv; | 905   return rv; | 
| 899 } | 906 } | 
| 900 | 907 | 
| 901 int HttpNetworkTransaction::DoInitRequestBodyComplete(int result) { | 908 int HttpNetworkTransaction::DoInitRequestBodyComplete(int result) { | 
| 902   if (result == OK) | 909   if (result == OK) | 
| 903     next_state_ = STATE_BUILD_REQUEST; | 910     next_state_ = STATE_BUILD_REQUEST; | 
| 904   return result; | 911   return result; | 
| 905 } | 912 } | 
| 906 | 913 | 
| 907 int HttpNetworkTransaction::DoBuildRequest() { | 914 int HttpNetworkTransaction::DoBuildRequest() { | 
| 908   next_state_ = STATE_BUILD_REQUEST_COMPLETE; | 915   next_state_ = STATE_BUILD_REQUEST_COMPLETE; | 
| 909   headers_valid_ = false; | 916   headers_valid_ = false; | 
| 910 | 917 | 
| 911   // This is constructed lazily (instead of within our Start method), so that | 918   // This is constructed lazily (instead of within our Start method), so that | 
| 912   // we have proxy info available. | 919   // we have proxy info available. | 
| 913   if (request_headers_.IsEmpty()) { | 920   if (request_headers_.IsEmpty()) { | 
| 914     bool using_proxy = (proxy_info_.is_http() || proxy_info_.is_https()) && | 921     bool using_http_proxy_without_tunnel = UsingHttpProxyWithoutTunnel(); | 
| 915                         !is_https_request(); | 922     BuildRequestHeaders(using_http_proxy_without_tunnel); | 
| 916     BuildRequestHeaders(using_proxy); |  | 
| 917   } | 923   } | 
| 918 | 924 | 
| 919   return OK; | 925   return OK; | 
| 920 } | 926 } | 
| 921 | 927 | 
| 922 int HttpNetworkTransaction::DoBuildRequestComplete(int result) { | 928 int HttpNetworkTransaction::DoBuildRequestComplete(int result) { | 
| 923   if (result == OK) | 929   if (result == OK) | 
| 924     next_state_ = STATE_SEND_REQUEST; | 930     next_state_ = STATE_SEND_REQUEST; | 
| 925   return result; | 931   return result; | 
| 926 } | 932 } | 
| (...skipping 483 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1410   } | 1416   } | 
| 1411 | 1417 | 
| 1412   // We need to clear request_headers_ because it contains the real request | 1418   // We need to clear request_headers_ because it contains the real request | 
| 1413   // headers, but we may need to resend the CONNECT request first to recreate | 1419   // headers, but we may need to resend the CONNECT request first to recreate | 
| 1414   // the SSL tunnel. | 1420   // the SSL tunnel. | 
| 1415   request_headers_.Clear(); | 1421   request_headers_.Clear(); | 
| 1416   next_state_ = STATE_CREATE_STREAM;  // Resend the request. | 1422   next_state_ = STATE_CREATE_STREAM;  // Resend the request. | 
| 1417 } | 1423 } | 
| 1418 | 1424 | 
| 1419 bool HttpNetworkTransaction::ShouldApplyProxyAuth() const { | 1425 bool HttpNetworkTransaction::ShouldApplyProxyAuth() const { | 
| 1420   return !is_https_request() && | 1426   return UsingHttpProxyWithoutTunnel(); | 
| 1421       (proxy_info_.is_https() || proxy_info_.is_http()); |  | 
| 1422 } | 1427 } | 
| 1423 | 1428 | 
| 1424 bool HttpNetworkTransaction::ShouldApplyServerAuth() const { | 1429 bool HttpNetworkTransaction::ShouldApplyServerAuth() const { | 
| 1425   return !(request_->load_flags & LOAD_DO_NOT_SEND_AUTH_DATA); | 1430   return !(request_->load_flags & LOAD_DO_NOT_SEND_AUTH_DATA); | 
| 1426 } | 1431 } | 
| 1427 | 1432 | 
| 1428 int HttpNetworkTransaction::HandleAuthChallenge() { | 1433 int HttpNetworkTransaction::HandleAuthChallenge() { | 
| 1429   scoped_refptr<HttpResponseHeaders> headers(GetResponseHeaders()); | 1434   scoped_refptr<HttpResponseHeaders> headers(GetResponseHeaders()); | 
| 1430   DCHECK(headers.get()); | 1435   DCHECK(headers.get()); | 
| 1431 | 1436 | 
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1525       description = base::StringPrintf("Unknown state 0x%08X (%u)", state, | 1530       description = base::StringPrintf("Unknown state 0x%08X (%u)", state, | 
| 1526                                        state); | 1531                                        state); | 
| 1527       break; | 1532       break; | 
| 1528   } | 1533   } | 
| 1529   return description; | 1534   return description; | 
| 1530 } | 1535 } | 
| 1531 | 1536 | 
| 1532 #undef STATE_CASE | 1537 #undef STATE_CASE | 
| 1533 | 1538 | 
| 1534 }  // namespace net | 1539 }  // namespace net | 
| OLD | NEW | 
|---|