| 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 584 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 595 DCHECK_NE(rv, ERR_IO_PENDING); | 595 DCHECK_NE(rv, ERR_IO_PENDING); |
| 596 DCHECK(!callback_.is_null()); | 596 DCHECK(!callback_.is_null()); |
| 597 | 597 |
| 598 // Since Run may result in Read being called, clear user_callback_ up front. | 598 // Since Run may result in Read being called, clear user_callback_ up front. |
| 599 CompletionCallback c = callback_; | 599 CompletionCallback c = callback_; |
| 600 callback_.Reset(); | 600 callback_.Reset(); |
| 601 c.Run(rv); | 601 c.Run(rv); |
| 602 } | 602 } |
| 603 | 603 |
| 604 void HttpNetworkTransaction::OnIOComplete(int result) { | 604 void HttpNetworkTransaction::OnIOComplete(int result) { |
| 605 // TODO(vadimt): Remove ScopedTracker below once crbug.com/424359 is fixed. | |
| 606 tracked_objects::ScopedTracker tracking_profile1( | |
| 607 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
| 608 "424359 HttpNetworkTransaction::OnIOComplete 1")); | |
| 609 | |
| 610 int rv = DoLoop(result); | 605 int rv = DoLoop(result); |
| 611 | |
| 612 // TODO(vadimt): Remove ScopedTracker below once crbug.com/424359 is fixed. | |
| 613 tracked_objects::ScopedTracker tracking_profile2( | |
| 614 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
| 615 "424359 HttpNetworkTransaction::OnIOComplete 2")); | |
| 616 | |
| 617 if (rv != ERR_IO_PENDING) | 606 if (rv != ERR_IO_PENDING) |
| 618 DoCallback(rv); | 607 DoCallback(rv); |
| 619 } | 608 } |
| 620 | 609 |
| 621 int HttpNetworkTransaction::DoLoop(int result) { | 610 int HttpNetworkTransaction::DoLoop(int result) { |
| 611 // TODO(pkasting): Remove ScopedTracker below once crbug.com/424359 is fixed. |
| 612 tracked_objects::ScopedTracker tracking_profile( |
| 613 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 614 "424359 HttpNetworkTransaction::DoLoop")); |
| 615 |
| 622 DCHECK(next_state_ != STATE_NONE); | 616 DCHECK(next_state_ != STATE_NONE); |
| 623 | 617 |
| 624 int rv = result; | 618 int rv = result; |
| 625 do { | 619 do { |
| 626 State state = next_state_; | 620 State state = next_state_; |
| 627 next_state_ = STATE_NONE; | 621 next_state_ = STATE_NONE; |
| 628 switch (state) { | 622 switch (state) { |
| 629 case STATE_NOTIFY_BEFORE_CREATE_STREAM: | 623 case STATE_NOTIFY_BEFORE_CREATE_STREAM: |
| 630 DCHECK_EQ(OK, rv); | 624 DCHECK_EQ(OK, rv); |
| 631 rv = DoNotifyBeforeCreateStream(); | 625 rv = DoNotifyBeforeCreateStream(); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 717 NOTREACHED() << "bad state"; | 711 NOTREACHED() << "bad state"; |
| 718 rv = ERR_FAILED; | 712 rv = ERR_FAILED; |
| 719 break; | 713 break; |
| 720 } | 714 } |
| 721 } while (rv != ERR_IO_PENDING && next_state_ != STATE_NONE); | 715 } while (rv != ERR_IO_PENDING && next_state_ != STATE_NONE); |
| 722 | 716 |
| 723 return rv; | 717 return rv; |
| 724 } | 718 } |
| 725 | 719 |
| 726 int HttpNetworkTransaction::DoNotifyBeforeCreateStream() { | 720 int HttpNetworkTransaction::DoNotifyBeforeCreateStream() { |
| 721 // TODO(pkasting): Remove ScopedTracker below once crbug.com/424359 is fixed. |
| 722 tracked_objects::ScopedTracker tracking_profile( |
| 723 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 724 "424359 HttpNetworkTransaction::DoNotifyBeforeCreateStream")); |
| 725 |
| 727 next_state_ = STATE_CREATE_STREAM; | 726 next_state_ = STATE_CREATE_STREAM; |
| 728 bool defer = false; | 727 bool defer = false; |
| 729 if (!before_network_start_callback_.is_null()) | 728 if (!before_network_start_callback_.is_null()) |
| 730 before_network_start_callback_.Run(&defer); | 729 before_network_start_callback_.Run(&defer); |
| 731 if (!defer) | 730 if (!defer) |
| 732 return OK; | 731 return OK; |
| 733 return ERR_IO_PENDING; | 732 return ERR_IO_PENDING; |
| 734 } | 733 } |
| 735 | 734 |
| 736 int HttpNetworkTransaction::DoCreateStream() { | 735 int HttpNetworkTransaction::DoCreateStream() { |
| 736 // TODO(pkasting): Remove ScopedTracker below once crbug.com/424359 is fixed. |
| 737 tracked_objects::ScopedTracker tracking_profile( |
| 738 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 739 "424359 HttpNetworkTransaction::DoCreateStream")); |
| 740 |
| 737 next_state_ = STATE_CREATE_STREAM_COMPLETE; | 741 next_state_ = STATE_CREATE_STREAM_COMPLETE; |
| 738 if (ForWebSocketHandshake()) { | 742 if (ForWebSocketHandshake()) { |
| 739 stream_request_.reset( | 743 stream_request_.reset( |
| 740 session_->http_stream_factory_for_websocket() | 744 session_->http_stream_factory_for_websocket() |
| 741 ->RequestWebSocketHandshakeStream( | 745 ->RequestWebSocketHandshakeStream( |
| 742 *request_, | 746 *request_, |
| 743 priority_, | 747 priority_, |
| 744 server_ssl_config_, | 748 server_ssl_config_, |
| 745 proxy_ssl_config_, | 749 proxy_ssl_config_, |
| 746 this, | 750 this, |
| 747 websocket_handshake_stream_base_create_helper_, | 751 websocket_handshake_stream_base_create_helper_, |
| 748 net_log_)); | 752 net_log_)); |
| 749 } else { | 753 } else { |
| 750 stream_request_.reset( | 754 stream_request_.reset( |
| 751 session_->http_stream_factory()->RequestStream( | 755 session_->http_stream_factory()->RequestStream( |
| 752 *request_, | 756 *request_, |
| 753 priority_, | 757 priority_, |
| 754 server_ssl_config_, | 758 server_ssl_config_, |
| 755 proxy_ssl_config_, | 759 proxy_ssl_config_, |
| 756 this, | 760 this, |
| 757 net_log_)); | 761 net_log_)); |
| 758 } | 762 } |
| 759 DCHECK(stream_request_.get()); | 763 DCHECK(stream_request_.get()); |
| 760 return ERR_IO_PENDING; | 764 return ERR_IO_PENDING; |
| 761 } | 765 } |
| 762 | 766 |
| 763 int HttpNetworkTransaction::DoCreateStreamComplete(int result) { | 767 int HttpNetworkTransaction::DoCreateStreamComplete(int result) { |
| 768 // TODO(pkasting): Remove ScopedTracker below once crbug.com/424359 is fixed. |
| 769 tracked_objects::ScopedTracker tracking_profile( |
| 770 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 771 "424359 HttpNetworkTransaction::DoCreateStreamComplete")); |
| 772 |
| 764 if (result == OK) { | 773 if (result == OK) { |
| 765 next_state_ = STATE_INIT_STREAM; | 774 next_state_ = STATE_INIT_STREAM; |
| 766 DCHECK(stream_.get()); | 775 DCHECK(stream_.get()); |
| 767 } else if (result == ERR_SSL_CLIENT_AUTH_CERT_NEEDED) { | 776 } else if (result == ERR_SSL_CLIENT_AUTH_CERT_NEEDED) { |
| 768 result = HandleCertificateRequest(result); | 777 result = HandleCertificateRequest(result); |
| 769 } else if (result == ERR_HTTPS_PROXY_TUNNEL_RESPONSE) { | 778 } else if (result == ERR_HTTPS_PROXY_TUNNEL_RESPONSE) { |
| 770 // Return OK and let the caller read the proxy's error page | 779 // Return OK and let the caller read the proxy's error page |
| 771 next_state_ = STATE_NONE; | 780 next_state_ = STATE_NONE; |
| 772 return OK; | 781 return OK; |
| 773 } else if (result == ERR_HTTP_1_1_REQUIRED || | 782 } else if (result == ERR_HTTP_1_1_REQUIRED || |
| 774 result == ERR_PROXY_HTTP_1_1_REQUIRED) { | 783 result == ERR_PROXY_HTTP_1_1_REQUIRED) { |
| 775 return HandleHttp11Required(result); | 784 return HandleHttp11Required(result); |
| 776 } | 785 } |
| 777 | 786 |
| 778 // Handle possible handshake errors that may have occurred if the stream | 787 // Handle possible handshake errors that may have occurred if the stream |
| 779 // used SSL for one or more of the layers. | 788 // used SSL for one or more of the layers. |
| 780 result = HandleSSLHandshakeError(result); | 789 result = HandleSSLHandshakeError(result); |
| 781 | 790 |
| 782 // At this point we are done with the stream_request_. | 791 // At this point we are done with the stream_request_. |
| 783 stream_request_.reset(); | 792 stream_request_.reset(); |
| 784 return result; | 793 return result; |
| 785 } | 794 } |
| 786 | 795 |
| 787 int HttpNetworkTransaction::DoInitStream() { | 796 int HttpNetworkTransaction::DoInitStream() { |
| 797 // TODO(pkasting): Remove ScopedTracker below once crbug.com/424359 is fixed. |
| 798 tracked_objects::ScopedTracker tracking_profile( |
| 799 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 800 "424359 HttpNetworkTransaction::DoInitStream")); |
| 801 |
| 788 DCHECK(stream_.get()); | 802 DCHECK(stream_.get()); |
| 789 next_state_ = STATE_INIT_STREAM_COMPLETE; | 803 next_state_ = STATE_INIT_STREAM_COMPLETE; |
| 790 return stream_->InitializeStream(request_, priority_, net_log_, io_callback_); | 804 return stream_->InitializeStream(request_, priority_, net_log_, io_callback_); |
| 791 } | 805 } |
| 792 | 806 |
| 793 int HttpNetworkTransaction::DoInitStreamComplete(int result) { | 807 int HttpNetworkTransaction::DoInitStreamComplete(int result) { |
| 808 // TODO(pkasting): Remove ScopedTracker below once crbug.com/424359 is fixed. |
| 809 tracked_objects::ScopedTracker tracking_profile( |
| 810 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 811 "424359 HttpNetworkTransaction::DoInitStreamComplete")); |
| 812 |
| 794 if (result == OK) { | 813 if (result == OK) { |
| 795 next_state_ = STATE_GENERATE_PROXY_AUTH_TOKEN; | 814 next_state_ = STATE_GENERATE_PROXY_AUTH_TOKEN; |
| 796 } else { | 815 } else { |
| 797 if (result < 0) | 816 if (result < 0) |
| 798 result = HandleIOError(result); | 817 result = HandleIOError(result); |
| 799 | 818 |
| 800 // The stream initialization failed, so this stream will never be useful. | 819 // The stream initialization failed, so this stream will never be useful. |
| 801 if (stream_) | 820 if (stream_) |
| 802 total_received_bytes_ += stream_->GetTotalReceivedBytes(); | 821 total_received_bytes_ += stream_->GetTotalReceivedBytes(); |
| 803 stream_.reset(); | 822 stream_.reset(); |
| 804 } | 823 } |
| 805 | 824 |
| 806 return result; | 825 return result; |
| 807 } | 826 } |
| 808 | 827 |
| 809 int HttpNetworkTransaction::DoGenerateProxyAuthToken() { | 828 int HttpNetworkTransaction::DoGenerateProxyAuthToken() { |
| 829 // TODO(pkasting): Remove ScopedTracker below once crbug.com/424359 is fixed. |
| 830 tracked_objects::ScopedTracker tracking_profile( |
| 831 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 832 "424359 HttpNetworkTransaction::DoGenerateProxyAuthToken")); |
| 833 |
| 810 next_state_ = STATE_GENERATE_PROXY_AUTH_TOKEN_COMPLETE; | 834 next_state_ = STATE_GENERATE_PROXY_AUTH_TOKEN_COMPLETE; |
| 811 if (!ShouldApplyProxyAuth()) | 835 if (!ShouldApplyProxyAuth()) |
| 812 return OK; | 836 return OK; |
| 813 HttpAuth::Target target = HttpAuth::AUTH_PROXY; | 837 HttpAuth::Target target = HttpAuth::AUTH_PROXY; |
| 814 if (!auth_controllers_[target].get()) | 838 if (!auth_controllers_[target].get()) |
| 815 auth_controllers_[target] = | 839 auth_controllers_[target] = |
| 816 new HttpAuthController(target, | 840 new HttpAuthController(target, |
| 817 AuthURL(target), | 841 AuthURL(target), |
| 818 session_->http_auth_cache(), | 842 session_->http_auth_cache(), |
| 819 session_->http_auth_handler_factory()); | 843 session_->http_auth_handler_factory()); |
| 820 return auth_controllers_[target]->MaybeGenerateAuthToken(request_, | 844 return auth_controllers_[target]->MaybeGenerateAuthToken(request_, |
| 821 io_callback_, | 845 io_callback_, |
| 822 net_log_); | 846 net_log_); |
| 823 } | 847 } |
| 824 | 848 |
| 825 int HttpNetworkTransaction::DoGenerateProxyAuthTokenComplete(int rv) { | 849 int HttpNetworkTransaction::DoGenerateProxyAuthTokenComplete(int rv) { |
| 850 // TODO(pkasting): Remove ScopedTracker below once crbug.com/424359 is fixed. |
| 851 tracked_objects::ScopedTracker tracking_profile( |
| 852 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 853 "424359 HttpNetworkTransaction::DoGenerateProxyAuthTokenComplete")); |
| 854 |
| 826 DCHECK_NE(ERR_IO_PENDING, rv); | 855 DCHECK_NE(ERR_IO_PENDING, rv); |
| 827 if (rv == OK) | 856 if (rv == OK) |
| 828 next_state_ = STATE_GENERATE_SERVER_AUTH_TOKEN; | 857 next_state_ = STATE_GENERATE_SERVER_AUTH_TOKEN; |
| 829 return rv; | 858 return rv; |
| 830 } | 859 } |
| 831 | 860 |
| 832 int HttpNetworkTransaction::DoGenerateServerAuthToken() { | 861 int HttpNetworkTransaction::DoGenerateServerAuthToken() { |
| 862 // TODO(pkasting): Remove ScopedTracker below once crbug.com/424359 is fixed. |
| 863 tracked_objects::ScopedTracker tracking_profile( |
| 864 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 865 "424359 HttpNetworkTransaction::DoGenerateServerAuthToken")); |
| 866 |
| 833 next_state_ = STATE_GENERATE_SERVER_AUTH_TOKEN_COMPLETE; | 867 next_state_ = STATE_GENERATE_SERVER_AUTH_TOKEN_COMPLETE; |
| 834 HttpAuth::Target target = HttpAuth::AUTH_SERVER; | 868 HttpAuth::Target target = HttpAuth::AUTH_SERVER; |
| 835 if (!auth_controllers_[target].get()) { | 869 if (!auth_controllers_[target].get()) { |
| 836 auth_controllers_[target] = | 870 auth_controllers_[target] = |
| 837 new HttpAuthController(target, | 871 new HttpAuthController(target, |
| 838 AuthURL(target), | 872 AuthURL(target), |
| 839 session_->http_auth_cache(), | 873 session_->http_auth_cache(), |
| 840 session_->http_auth_handler_factory()); | 874 session_->http_auth_handler_factory()); |
| 841 if (request_->load_flags & LOAD_DO_NOT_USE_EMBEDDED_IDENTITY) | 875 if (request_->load_flags & LOAD_DO_NOT_USE_EMBEDDED_IDENTITY) |
| 842 auth_controllers_[target]->DisableEmbeddedIdentity(); | 876 auth_controllers_[target]->DisableEmbeddedIdentity(); |
| 843 } | 877 } |
| 844 if (!ShouldApplyServerAuth()) | 878 if (!ShouldApplyServerAuth()) |
| 845 return OK; | 879 return OK; |
| 846 return auth_controllers_[target]->MaybeGenerateAuthToken(request_, | 880 return auth_controllers_[target]->MaybeGenerateAuthToken(request_, |
| 847 io_callback_, | 881 io_callback_, |
| 848 net_log_); | 882 net_log_); |
| 849 } | 883 } |
| 850 | 884 |
| 851 int HttpNetworkTransaction::DoGenerateServerAuthTokenComplete(int rv) { | 885 int HttpNetworkTransaction::DoGenerateServerAuthTokenComplete(int rv) { |
| 886 // TODO(pkasting): Remove ScopedTracker below once crbug.com/424359 is fixed. |
| 887 tracked_objects::ScopedTracker tracking_profile( |
| 888 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 889 "424359 HttpNetworkTransaction::DoGenerateServerAuthTokenComplete")); |
| 890 |
| 852 DCHECK_NE(ERR_IO_PENDING, rv); | 891 DCHECK_NE(ERR_IO_PENDING, rv); |
| 853 if (rv == OK) | 892 if (rv == OK) |
| 854 next_state_ = STATE_INIT_REQUEST_BODY; | 893 next_state_ = STATE_INIT_REQUEST_BODY; |
| 855 return rv; | 894 return rv; |
| 856 } | 895 } |
| 857 | 896 |
| 858 void HttpNetworkTransaction::BuildRequestHeaders( | 897 void HttpNetworkTransaction::BuildRequestHeaders( |
| 859 bool using_http_proxy_without_tunnel) { | 898 bool using_http_proxy_without_tunnel) { |
| 860 request_headers_.SetHeader(HttpRequestHeaders::kHost, | 899 request_headers_.SetHeader(HttpRequestHeaders::kHost, |
| 861 GetHostAndOptionalPort(request_->url)); | 900 GetHostAndOptionalPort(request_->url)); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 907 if (using_http_proxy_without_tunnel && | 946 if (using_http_proxy_without_tunnel && |
| 908 !before_proxy_headers_sent_callback_.is_null()) | 947 !before_proxy_headers_sent_callback_.is_null()) |
| 909 before_proxy_headers_sent_callback_.Run(proxy_info_, &request_headers_); | 948 before_proxy_headers_sent_callback_.Run(proxy_info_, &request_headers_); |
| 910 | 949 |
| 911 response_.did_use_http_auth = | 950 response_.did_use_http_auth = |
| 912 request_headers_.HasHeader(HttpRequestHeaders::kAuthorization) || | 951 request_headers_.HasHeader(HttpRequestHeaders::kAuthorization) || |
| 913 request_headers_.HasHeader(HttpRequestHeaders::kProxyAuthorization); | 952 request_headers_.HasHeader(HttpRequestHeaders::kProxyAuthorization); |
| 914 } | 953 } |
| 915 | 954 |
| 916 int HttpNetworkTransaction::DoInitRequestBody() { | 955 int HttpNetworkTransaction::DoInitRequestBody() { |
| 956 // TODO(pkasting): Remove ScopedTracker below once crbug.com/424359 is fixed. |
| 957 tracked_objects::ScopedTracker tracking_profile( |
| 958 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 959 "424359 HttpNetworkTransaction::DoInitRequestBody")); |
| 960 |
| 917 next_state_ = STATE_INIT_REQUEST_BODY_COMPLETE; | 961 next_state_ = STATE_INIT_REQUEST_BODY_COMPLETE; |
| 918 int rv = OK; | 962 int rv = OK; |
| 919 if (request_->upload_data_stream) | 963 if (request_->upload_data_stream) |
| 920 rv = request_->upload_data_stream->Init(io_callback_); | 964 rv = request_->upload_data_stream->Init(io_callback_); |
| 921 return rv; | 965 return rv; |
| 922 } | 966 } |
| 923 | 967 |
| 924 int HttpNetworkTransaction::DoInitRequestBodyComplete(int result) { | 968 int HttpNetworkTransaction::DoInitRequestBodyComplete(int result) { |
| 969 // TODO(pkasting): Remove ScopedTracker below once crbug.com/424359 is fixed. |
| 970 tracked_objects::ScopedTracker tracking_profile( |
| 971 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 972 "424359 HttpNetworkTransaction::DoInitRequestBodyComplete")); |
| 973 |
| 925 if (result == OK) | 974 if (result == OK) |
| 926 next_state_ = STATE_BUILD_REQUEST; | 975 next_state_ = STATE_BUILD_REQUEST; |
| 927 return result; | 976 return result; |
| 928 } | 977 } |
| 929 | 978 |
| 930 int HttpNetworkTransaction::DoBuildRequest() { | 979 int HttpNetworkTransaction::DoBuildRequest() { |
| 980 // TODO(pkasting): Remove ScopedTracker below once crbug.com/424359 is fixed. |
| 981 tracked_objects::ScopedTracker tracking_profile( |
| 982 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 983 "424359 HttpNetworkTransaction::DoBuildRequest")); |
| 984 |
| 931 next_state_ = STATE_BUILD_REQUEST_COMPLETE; | 985 next_state_ = STATE_BUILD_REQUEST_COMPLETE; |
| 932 headers_valid_ = false; | 986 headers_valid_ = false; |
| 933 | 987 |
| 934 // This is constructed lazily (instead of within our Start method), so that | 988 // This is constructed lazily (instead of within our Start method), so that |
| 935 // we have proxy info available. | 989 // we have proxy info available. |
| 936 if (request_headers_.IsEmpty()) { | 990 if (request_headers_.IsEmpty()) { |
| 937 bool using_http_proxy_without_tunnel = UsingHttpProxyWithoutTunnel(); | 991 bool using_http_proxy_without_tunnel = UsingHttpProxyWithoutTunnel(); |
| 938 BuildRequestHeaders(using_http_proxy_without_tunnel); | 992 BuildRequestHeaders(using_http_proxy_without_tunnel); |
| 939 } | 993 } |
| 940 | 994 |
| 941 return OK; | 995 return OK; |
| 942 } | 996 } |
| 943 | 997 |
| 944 int HttpNetworkTransaction::DoBuildRequestComplete(int result) { | 998 int HttpNetworkTransaction::DoBuildRequestComplete(int result) { |
| 999 // TODO(pkasting): Remove ScopedTracker below once crbug.com/424359 is fixed. |
| 1000 tracked_objects::ScopedTracker tracking_profile( |
| 1001 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 1002 "424359 HttpNetworkTransaction::DoBuildRequestComplete")); |
| 1003 |
| 945 if (result == OK) | 1004 if (result == OK) |
| 946 next_state_ = STATE_SEND_REQUEST; | 1005 next_state_ = STATE_SEND_REQUEST; |
| 947 return result; | 1006 return result; |
| 948 } | 1007 } |
| 949 | 1008 |
| 950 int HttpNetworkTransaction::DoSendRequest() { | 1009 int HttpNetworkTransaction::DoSendRequest() { |
| 1010 // TODO(pkasting): Remove ScopedTracker below once crbug.com/424359 is fixed. |
| 1011 tracked_objects::ScopedTracker tracking_profile( |
| 1012 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 1013 "424359 HttpNetworkTransaction::DoSendRequest")); |
| 1014 |
| 951 send_start_time_ = base::TimeTicks::Now(); | 1015 send_start_time_ = base::TimeTicks::Now(); |
| 952 next_state_ = STATE_SEND_REQUEST_COMPLETE; | 1016 next_state_ = STATE_SEND_REQUEST_COMPLETE; |
| 953 | 1017 |
| 954 return stream_->SendRequest(request_headers_, &response_, io_callback_); | 1018 return stream_->SendRequest(request_headers_, &response_, io_callback_); |
| 955 } | 1019 } |
| 956 | 1020 |
| 957 int HttpNetworkTransaction::DoSendRequestComplete(int result) { | 1021 int HttpNetworkTransaction::DoSendRequestComplete(int result) { |
| 1022 // TODO(pkasting): Remove ScopedTracker below once crbug.com/424359 is fixed. |
| 1023 tracked_objects::ScopedTracker tracking_profile( |
| 1024 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 1025 "424359 HttpNetworkTransaction::DoSendRequestComplete")); |
| 1026 |
| 958 send_end_time_ = base::TimeTicks::Now(); | 1027 send_end_time_ = base::TimeTicks::Now(); |
| 959 if (result < 0) | 1028 if (result < 0) |
| 960 return HandleIOError(result); | 1029 return HandleIOError(result); |
| 961 response_.network_accessed = true; | 1030 response_.network_accessed = true; |
| 962 next_state_ = STATE_READ_HEADERS; | 1031 next_state_ = STATE_READ_HEADERS; |
| 963 return OK; | 1032 return OK; |
| 964 } | 1033 } |
| 965 | 1034 |
| 966 int HttpNetworkTransaction::DoReadHeaders() { | 1035 int HttpNetworkTransaction::DoReadHeaders() { |
| 1036 // TODO(pkasting): Remove ScopedTracker below once crbug.com/424359 is fixed. |
| 1037 tracked_objects::ScopedTracker tracking_profile( |
| 1038 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 1039 "424359 HttpNetworkTransaction::DoReadHeaders")); |
| 1040 |
| 967 next_state_ = STATE_READ_HEADERS_COMPLETE; | 1041 next_state_ = STATE_READ_HEADERS_COMPLETE; |
| 968 return stream_->ReadResponseHeaders(io_callback_); | 1042 return stream_->ReadResponseHeaders(io_callback_); |
| 969 } | 1043 } |
| 970 | 1044 |
| 971 int HttpNetworkTransaction::DoReadHeadersComplete(int result) { | 1045 int HttpNetworkTransaction::DoReadHeadersComplete(int result) { |
| 1046 // TODO(pkasting): Remove ScopedTracker below once crbug.com/424359 is fixed. |
| 1047 tracked_objects::ScopedTracker tracking_profile( |
| 1048 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 1049 "424359 HttpNetworkTransaction::DoReadHeadersComplete")); |
| 1050 |
| 972 // We can get a certificate error or ERR_SSL_CLIENT_AUTH_CERT_NEEDED here | 1051 // We can get a certificate error or ERR_SSL_CLIENT_AUTH_CERT_NEEDED here |
| 973 // due to SSL renegotiation. | 1052 // due to SSL renegotiation. |
| 974 if (IsCertificateError(result)) { | 1053 if (IsCertificateError(result)) { |
| 975 // We don't handle a certificate error during SSL renegotiation, so we | 1054 // We don't handle a certificate error during SSL renegotiation, so we |
| 976 // have to return an error that's not in the certificate error range | 1055 // have to return an error that's not in the certificate error range |
| 977 // (-2xx). | 1056 // (-2xx). |
| 978 LOG(ERROR) << "Got a server certificate with error " << result | 1057 LOG(ERROR) << "Got a server certificate with error " << result |
| 979 << " during SSL renegotiation"; | 1058 << " during SSL renegotiation"; |
| 980 result = ERR_CERT_ERROR_IN_SSL_RENEGOTIATION; | 1059 result = ERR_CERT_ERROR_IN_SSL_RENEGOTIATION; |
| 981 } else if (result == ERR_SSL_CLIENT_AUTH_CERT_NEEDED) { | 1060 } else if (result == ERR_SSL_CLIENT_AUTH_CERT_NEEDED) { |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1063 return rv; | 1142 return rv; |
| 1064 | 1143 |
| 1065 if (IsSecureRequest()) | 1144 if (IsSecureRequest()) |
| 1066 stream_->GetSSLInfo(&response_.ssl_info); | 1145 stream_->GetSSLInfo(&response_.ssl_info); |
| 1067 | 1146 |
| 1068 headers_valid_ = true; | 1147 headers_valid_ = true; |
| 1069 return OK; | 1148 return OK; |
| 1070 } | 1149 } |
| 1071 | 1150 |
| 1072 int HttpNetworkTransaction::DoReadBody() { | 1151 int HttpNetworkTransaction::DoReadBody() { |
| 1152 // TODO(pkasting): Remove ScopedTracker below once crbug.com/424359 is fixed. |
| 1153 tracked_objects::ScopedTracker tracking_profile( |
| 1154 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 1155 "424359 HttpNetworkTransaction::DoReadBody")); |
| 1156 |
| 1073 DCHECK(read_buf_.get()); | 1157 DCHECK(read_buf_.get()); |
| 1074 DCHECK_GT(read_buf_len_, 0); | 1158 DCHECK_GT(read_buf_len_, 0); |
| 1075 DCHECK(stream_ != NULL); | 1159 DCHECK(stream_ != NULL); |
| 1076 | 1160 |
| 1077 next_state_ = STATE_READ_BODY_COMPLETE; | 1161 next_state_ = STATE_READ_BODY_COMPLETE; |
| 1078 return stream_->ReadResponseBody( | 1162 return stream_->ReadResponseBody( |
| 1079 read_buf_.get(), read_buf_len_, io_callback_); | 1163 read_buf_.get(), read_buf_len_, io_callback_); |
| 1080 } | 1164 } |
| 1081 | 1165 |
| 1082 int HttpNetworkTransaction::DoReadBodyComplete(int result) { | 1166 int HttpNetworkTransaction::DoReadBodyComplete(int result) { |
| 1167 // TODO(pkasting): Remove ScopedTracker below once crbug.com/424359 is fixed. |
| 1168 tracked_objects::ScopedTracker tracking_profile( |
| 1169 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 1170 "424359 HttpNetworkTransaction::DoReadBodyComplete")); |
| 1171 |
| 1083 // We are done with the Read call. | 1172 // We are done with the Read call. |
| 1084 bool done = false; | 1173 bool done = false; |
| 1085 if (result <= 0) { | 1174 if (result <= 0) { |
| 1086 DCHECK_NE(ERR_IO_PENDING, result); | 1175 DCHECK_NE(ERR_IO_PENDING, result); |
| 1087 done = true; | 1176 done = true; |
| 1088 } | 1177 } |
| 1089 | 1178 |
| 1090 bool keep_alive = false; | 1179 bool keep_alive = false; |
| 1091 if (stream_->IsResponseBodyComplete()) { | 1180 if (stream_->IsResponseBodyComplete()) { |
| 1092 // Note: Just because IsResponseBodyComplete is true, we're not | 1181 // Note: Just because IsResponseBodyComplete is true, we're not |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1118 } | 1207 } |
| 1119 | 1208 |
| 1120 // Clear these to avoid leaving around old state. | 1209 // Clear these to avoid leaving around old state. |
| 1121 read_buf_ = NULL; | 1210 read_buf_ = NULL; |
| 1122 read_buf_len_ = 0; | 1211 read_buf_len_ = 0; |
| 1123 | 1212 |
| 1124 return result; | 1213 return result; |
| 1125 } | 1214 } |
| 1126 | 1215 |
| 1127 int HttpNetworkTransaction::DoDrainBodyForAuthRestart() { | 1216 int HttpNetworkTransaction::DoDrainBodyForAuthRestart() { |
| 1217 // TODO(pkasting): Remove ScopedTracker below once crbug.com/424359 is fixed. |
| 1218 tracked_objects::ScopedTracker tracking_profile( |
| 1219 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 1220 "424359 HttpNetworkTransaction::DoDrainBodyForAuthRestart")); |
| 1221 |
| 1128 // This method differs from DoReadBody only in the next_state_. So we just | 1222 // This method differs from DoReadBody only in the next_state_. So we just |
| 1129 // call DoReadBody and override the next_state_. Perhaps there is a more | 1223 // call DoReadBody and override the next_state_. Perhaps there is a more |
| 1130 // elegant way for these two methods to share code. | 1224 // elegant way for these two methods to share code. |
| 1131 int rv = DoReadBody(); | 1225 int rv = DoReadBody(); |
| 1132 DCHECK(next_state_ == STATE_READ_BODY_COMPLETE); | 1226 DCHECK(next_state_ == STATE_READ_BODY_COMPLETE); |
| 1133 next_state_ = STATE_DRAIN_BODY_FOR_AUTH_RESTART_COMPLETE; | 1227 next_state_ = STATE_DRAIN_BODY_FOR_AUTH_RESTART_COMPLETE; |
| 1134 return rv; | 1228 return rv; |
| 1135 } | 1229 } |
| 1136 | 1230 |
| 1137 // TODO(wtc): This method and the DoReadBodyComplete method are almost | 1231 // TODO(wtc): This method and the DoReadBodyComplete method are almost |
| 1138 // the same. Figure out a good way for these two methods to share code. | 1232 // the same. Figure out a good way for these two methods to share code. |
| 1139 int HttpNetworkTransaction::DoDrainBodyForAuthRestartComplete(int result) { | 1233 int HttpNetworkTransaction::DoDrainBodyForAuthRestartComplete(int result) { |
| 1234 // TODO(pkasting): Remove ScopedTracker below once crbug.com/424359 is fixed. |
| 1235 tracked_objects::ScopedTracker tracking_profile( |
| 1236 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 1237 "424359 HttpNetworkTransaction::DoDrainBodyForAuthRestartComplete")); |
| 1238 |
| 1140 // keep_alive defaults to true because the very reason we're draining the | 1239 // keep_alive defaults to true because the very reason we're draining the |
| 1141 // response body is to reuse the connection for auth restart. | 1240 // response body is to reuse the connection for auth restart. |
| 1142 bool done = false, keep_alive = true; | 1241 bool done = false, keep_alive = true; |
| 1143 if (result < 0) { | 1242 if (result < 0) { |
| 1144 // Error or closed connection while reading the socket. | 1243 // Error or closed connection while reading the socket. |
| 1145 done = true; | 1244 done = true; |
| 1146 keep_alive = false; | 1245 keep_alive = false; |
| 1147 } else if (stream_->IsResponseBodyComplete()) { | 1246 } else if (stream_->IsResponseBodyComplete()) { |
| 1148 done = true; | 1247 done = true; |
| 1149 } | 1248 } |
| (...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1553 description = base::StringPrintf("Unknown state 0x%08X (%u)", state, | 1652 description = base::StringPrintf("Unknown state 0x%08X (%u)", state, |
| 1554 state); | 1653 state); |
| 1555 break; | 1654 break; |
| 1556 } | 1655 } |
| 1557 return description; | 1656 return description; |
| 1558 } | 1657 } |
| 1559 | 1658 |
| 1560 #undef STATE_CASE | 1659 #undef STATE_CASE |
| 1561 | 1660 |
| 1562 } // namespace net | 1661 } // namespace net |
| OLD | NEW |