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 |