| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 "base/format_macros.h" | 7 #include "base/format_macros.h" |
| 8 #include "base/scoped_ptr.h" | 8 #include "base/scoped_ptr.h" |
| 9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
| 10 #include "base/field_trial.h" | 10 #include "base/field_trial.h" |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 g_next_protos = new std::string(next_protos); | 233 g_next_protos = new std::string(next_protos); |
| 234 } | 234 } |
| 235 | 235 |
| 236 // static | 236 // static |
| 237 void HttpNetworkTransaction::IgnoreCertificateErrors(bool enabled) { | 237 void HttpNetworkTransaction::IgnoreCertificateErrors(bool enabled) { |
| 238 g_ignore_certificate_errors = enabled; | 238 g_ignore_certificate_errors = enabled; |
| 239 } | 239 } |
| 240 | 240 |
| 241 int HttpNetworkTransaction::Start(const HttpRequestInfo* request_info, | 241 int HttpNetworkTransaction::Start(const HttpRequestInfo* request_info, |
| 242 CompletionCallback* callback, | 242 CompletionCallback* callback, |
| 243 LoadLog* load_log) { | 243 const BoundNetLog& net_log) { |
| 244 SIMPLE_STATS_COUNTER("HttpNetworkTransaction.Count"); | 244 SIMPLE_STATS_COUNTER("HttpNetworkTransaction.Count"); |
| 245 | 245 |
| 246 load_log_ = load_log; | 246 net_log_ = net_log; |
| 247 request_ = request_info; | 247 request_ = request_info; |
| 248 start_time_ = base::Time::Now(); | 248 start_time_ = base::Time::Now(); |
| 249 | 249 |
| 250 next_state_ = STATE_RESOLVE_PROXY; | 250 next_state_ = STATE_RESOLVE_PROXY; |
| 251 int rv = DoLoop(OK); | 251 int rv = DoLoop(OK); |
| 252 if (rv == ERR_IO_PENDING) | 252 if (rv == ERR_IO_PENDING) |
| 253 user_callback_ = callback; | 253 user_callback_ = callback; |
| 254 return rv; | 254 return rv; |
| 255 } | 255 } |
| 256 | 256 |
| (...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 535 TRACE_EVENT_BEGIN("http.ssl_connect", request_, request_->url.spec()); | 535 TRACE_EVENT_BEGIN("http.ssl_connect", request_, request_->url.spec()); |
| 536 rv = DoSSLConnect(); | 536 rv = DoSSLConnect(); |
| 537 break; | 537 break; |
| 538 case STATE_SSL_CONNECT_COMPLETE: | 538 case STATE_SSL_CONNECT_COMPLETE: |
| 539 rv = DoSSLConnectComplete(rv); | 539 rv = DoSSLConnectComplete(rv); |
| 540 TRACE_EVENT_END("http.ssl_connect", request_, request_->url.spec()); | 540 TRACE_EVENT_END("http.ssl_connect", request_, request_->url.spec()); |
| 541 break; | 541 break; |
| 542 case STATE_SEND_REQUEST: | 542 case STATE_SEND_REQUEST: |
| 543 DCHECK_EQ(OK, rv); | 543 DCHECK_EQ(OK, rv); |
| 544 TRACE_EVENT_BEGIN("http.send_request", request_, request_->url.spec()); | 544 TRACE_EVENT_BEGIN("http.send_request", request_, request_->url.spec()); |
| 545 LoadLog::BeginEvent(load_log_, | 545 net_log_.BeginEvent(NetLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST); |
| 546 LoadLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST); | |
| 547 rv = DoSendRequest(); | 546 rv = DoSendRequest(); |
| 548 break; | 547 break; |
| 549 case STATE_SEND_REQUEST_COMPLETE: | 548 case STATE_SEND_REQUEST_COMPLETE: |
| 550 rv = DoSendRequestComplete(rv); | 549 rv = DoSendRequestComplete(rv); |
| 551 TRACE_EVENT_END("http.send_request", request_, request_->url.spec()); | 550 TRACE_EVENT_END("http.send_request", request_, request_->url.spec()); |
| 552 LoadLog::EndEvent(load_log_, | 551 net_log_.EndEvent(NetLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST); |
| 553 LoadLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST); | |
| 554 break; | 552 break; |
| 555 case STATE_READ_HEADERS: | 553 case STATE_READ_HEADERS: |
| 556 DCHECK_EQ(OK, rv); | 554 DCHECK_EQ(OK, rv); |
| 557 TRACE_EVENT_BEGIN("http.read_headers", request_, request_->url.spec()); | 555 TRACE_EVENT_BEGIN("http.read_headers", request_, request_->url.spec()); |
| 558 LoadLog::BeginEvent(load_log_, | 556 net_log_.BeginEvent(NetLog::TYPE_HTTP_TRANSACTION_READ_HEADERS); |
| 559 LoadLog::TYPE_HTTP_TRANSACTION_READ_HEADERS); | |
| 560 rv = DoReadHeaders(); | 557 rv = DoReadHeaders(); |
| 561 break; | 558 break; |
| 562 case STATE_READ_HEADERS_COMPLETE: | 559 case STATE_READ_HEADERS_COMPLETE: |
| 563 rv = DoReadHeadersComplete(rv); | 560 rv = DoReadHeadersComplete(rv); |
| 564 TRACE_EVENT_END("http.read_headers", request_, request_->url.spec()); | 561 TRACE_EVENT_END("http.read_headers", request_, request_->url.spec()); |
| 565 LoadLog::EndEvent(load_log_, | 562 net_log_.EndEvent(NetLog::TYPE_HTTP_TRANSACTION_READ_HEADERS); |
| 566 LoadLog::TYPE_HTTP_TRANSACTION_READ_HEADERS); | |
| 567 break; | 563 break; |
| 568 case STATE_READ_BODY: | 564 case STATE_READ_BODY: |
| 569 DCHECK_EQ(OK, rv); | 565 DCHECK_EQ(OK, rv); |
| 570 TRACE_EVENT_BEGIN("http.read_body", request_, request_->url.spec()); | 566 TRACE_EVENT_BEGIN("http.read_body", request_, request_->url.spec()); |
| 571 LoadLog::BeginEvent(load_log_, | 567 net_log_.BeginEvent(NetLog::TYPE_HTTP_TRANSACTION_READ_BODY); |
| 572 LoadLog::TYPE_HTTP_TRANSACTION_READ_BODY); | |
| 573 rv = DoReadBody(); | 568 rv = DoReadBody(); |
| 574 break; | 569 break; |
| 575 case STATE_READ_BODY_COMPLETE: | 570 case STATE_READ_BODY_COMPLETE: |
| 576 rv = DoReadBodyComplete(rv); | 571 rv = DoReadBodyComplete(rv); |
| 577 TRACE_EVENT_END("http.read_body", request_, request_->url.spec()); | 572 TRACE_EVENT_END("http.read_body", request_, request_->url.spec()); |
| 578 LoadLog::EndEvent(load_log_, | 573 net_log_.EndEvent(NetLog::TYPE_HTTP_TRANSACTION_READ_BODY); |
| 579 LoadLog::TYPE_HTTP_TRANSACTION_READ_BODY); | |
| 580 break; | 574 break; |
| 581 case STATE_DRAIN_BODY_FOR_AUTH_RESTART: | 575 case STATE_DRAIN_BODY_FOR_AUTH_RESTART: |
| 582 DCHECK_EQ(OK, rv); | 576 DCHECK_EQ(OK, rv); |
| 583 TRACE_EVENT_BEGIN("http.drain_body_for_auth_restart", | 577 TRACE_EVENT_BEGIN("http.drain_body_for_auth_restart", |
| 584 request_, request_->url.spec()); | 578 request_, request_->url.spec()); |
| 585 LoadLog::BeginEvent( | 579 net_log_.BeginEvent( |
| 586 load_log_, | 580 NetLog::TYPE_HTTP_TRANSACTION_DRAIN_BODY_FOR_AUTH_RESTART); |
| 587 LoadLog::TYPE_HTTP_TRANSACTION_DRAIN_BODY_FOR_AUTH_RESTART); | |
| 588 rv = DoDrainBodyForAuthRestart(); | 581 rv = DoDrainBodyForAuthRestart(); |
| 589 break; | 582 break; |
| 590 case STATE_DRAIN_BODY_FOR_AUTH_RESTART_COMPLETE: | 583 case STATE_DRAIN_BODY_FOR_AUTH_RESTART_COMPLETE: |
| 591 rv = DoDrainBodyForAuthRestartComplete(rv); | 584 rv = DoDrainBodyForAuthRestartComplete(rv); |
| 592 TRACE_EVENT_END("http.drain_body_for_auth_restart", | 585 TRACE_EVENT_END("http.drain_body_for_auth_restart", |
| 593 request_, request_->url.spec()); | 586 request_, request_->url.spec()); |
| 594 LoadLog::EndEvent( | 587 net_log_.EndEvent( |
| 595 load_log_, | 588 NetLog::TYPE_HTTP_TRANSACTION_DRAIN_BODY_FOR_AUTH_RESTART); |
| 596 LoadLog::TYPE_HTTP_TRANSACTION_DRAIN_BODY_FOR_AUTH_RESTART); | |
| 597 break; | 589 break; |
| 598 case STATE_SPDY_SEND_REQUEST: | 590 case STATE_SPDY_SEND_REQUEST: |
| 599 DCHECK_EQ(OK, rv); | 591 DCHECK_EQ(OK, rv); |
| 600 TRACE_EVENT_BEGIN("http.send_request", request_, request_->url.spec()); | 592 TRACE_EVENT_BEGIN("http.send_request", request_, request_->url.spec()); |
| 601 LoadLog::BeginEvent(load_log_, | 593 net_log_.BeginEvent(NetLog::TYPE_SPDY_TRANSACTION_SEND_REQUEST); |
| 602 LoadLog::TYPE_SPDY_TRANSACTION_SEND_REQUEST); | |
| 603 rv = DoSpdySendRequest(); | 594 rv = DoSpdySendRequest(); |
| 604 break; | 595 break; |
| 605 case STATE_SPDY_SEND_REQUEST_COMPLETE: | 596 case STATE_SPDY_SEND_REQUEST_COMPLETE: |
| 606 rv = DoSpdySendRequestComplete(rv); | 597 rv = DoSpdySendRequestComplete(rv); |
| 607 TRACE_EVENT_END("http.send_request", request_, request_->url.spec()); | 598 TRACE_EVENT_END("http.send_request", request_, request_->url.spec()); |
| 608 LoadLog::EndEvent(load_log_, | 599 net_log_.EndEvent(NetLog::TYPE_SPDY_TRANSACTION_SEND_REQUEST); |
| 609 LoadLog::TYPE_SPDY_TRANSACTION_SEND_REQUEST); | |
| 610 break; | 600 break; |
| 611 case STATE_SPDY_READ_HEADERS: | 601 case STATE_SPDY_READ_HEADERS: |
| 612 DCHECK_EQ(OK, rv); | 602 DCHECK_EQ(OK, rv); |
| 613 TRACE_EVENT_BEGIN("http.read_headers", request_, request_->url.spec()); | 603 TRACE_EVENT_BEGIN("http.read_headers", request_, request_->url.spec()); |
| 614 LoadLog::BeginEvent(load_log_, | 604 net_log_.BeginEvent(NetLog::TYPE_SPDY_TRANSACTION_READ_HEADERS); |
| 615 LoadLog::TYPE_SPDY_TRANSACTION_READ_HEADERS); | |
| 616 rv = DoSpdyReadHeaders(); | 605 rv = DoSpdyReadHeaders(); |
| 617 break; | 606 break; |
| 618 case STATE_SPDY_READ_HEADERS_COMPLETE: | 607 case STATE_SPDY_READ_HEADERS_COMPLETE: |
| 619 rv = DoSpdyReadHeadersComplete(rv); | 608 rv = DoSpdyReadHeadersComplete(rv); |
| 620 TRACE_EVENT_END("http.read_headers", request_, request_->url.spec()); | 609 TRACE_EVENT_END("http.read_headers", request_, request_->url.spec()); |
| 621 LoadLog::EndEvent(load_log_, | 610 net_log_.EndEvent(NetLog::TYPE_SPDY_TRANSACTION_READ_HEADERS); |
| 622 LoadLog::TYPE_SPDY_TRANSACTION_READ_HEADERS); | |
| 623 break; | 611 break; |
| 624 case STATE_SPDY_READ_BODY: | 612 case STATE_SPDY_READ_BODY: |
| 625 DCHECK_EQ(OK, rv); | 613 DCHECK_EQ(OK, rv); |
| 626 TRACE_EVENT_BEGIN("http.read_body", request_, request_->url.spec()); | 614 TRACE_EVENT_BEGIN("http.read_body", request_, request_->url.spec()); |
| 627 LoadLog::BeginEvent(load_log_, | 615 net_log_.BeginEvent(NetLog::TYPE_SPDY_TRANSACTION_READ_BODY); |
| 628 LoadLog::TYPE_SPDY_TRANSACTION_READ_BODY); | |
| 629 rv = DoSpdyReadBody(); | 616 rv = DoSpdyReadBody(); |
| 630 break; | 617 break; |
| 631 case STATE_SPDY_READ_BODY_COMPLETE: | 618 case STATE_SPDY_READ_BODY_COMPLETE: |
| 632 rv = DoSpdyReadBodyComplete(rv); | 619 rv = DoSpdyReadBodyComplete(rv); |
| 633 TRACE_EVENT_END("http.read_body", request_, request_->url.spec()); | 620 TRACE_EVENT_END("http.read_body", request_, request_->url.spec()); |
| 634 LoadLog::EndEvent(load_log_, | 621 net_log_.EndEvent(NetLog::TYPE_SPDY_TRANSACTION_READ_BODY); |
| 635 LoadLog::TYPE_SPDY_TRANSACTION_READ_BODY); | |
| 636 break; | 622 break; |
| 637 default: | 623 default: |
| 638 NOTREACHED() << "bad state"; | 624 NOTREACHED() << "bad state"; |
| 639 rv = ERR_FAILED; | 625 rv = ERR_FAILED; |
| 640 break; | 626 break; |
| 641 } | 627 } |
| 642 } while (rv != ERR_IO_PENDING && next_state_ != STATE_NONE); | 628 } while (rv != ERR_IO_PENDING && next_state_ != STATE_NONE); |
| 643 | 629 |
| 644 return rv; | 630 return rv; |
| 645 } | 631 } |
| 646 | 632 |
| 647 int HttpNetworkTransaction::DoResolveProxy() { | 633 int HttpNetworkTransaction::DoResolveProxy() { |
| 648 DCHECK(!pac_request_); | 634 DCHECK(!pac_request_); |
| 649 | 635 |
| 650 next_state_ = STATE_RESOLVE_PROXY_COMPLETE; | 636 next_state_ = STATE_RESOLVE_PROXY_COMPLETE; |
| 651 | 637 |
| 652 if (request_->load_flags & LOAD_BYPASS_PROXY) { | 638 if (request_->load_flags & LOAD_BYPASS_PROXY) { |
| 653 proxy_info_.UseDirect(); | 639 proxy_info_.UseDirect(); |
| 654 return OK; | 640 return OK; |
| 655 } | 641 } |
| 656 | 642 |
| 657 return session_->proxy_service()->ResolveProxy( | 643 return session_->proxy_service()->ResolveProxy( |
| 658 request_->url, &proxy_info_, &io_callback_, &pac_request_, load_log_); | 644 request_->url, &proxy_info_, &io_callback_, &pac_request_, net_log_); |
| 659 } | 645 } |
| 660 | 646 |
| 661 int HttpNetworkTransaction::DoResolveProxyComplete(int result) { | 647 int HttpNetworkTransaction::DoResolveProxyComplete(int result) { |
| 662 pac_request_ = NULL; | 648 pac_request_ = NULL; |
| 663 | 649 |
| 664 if (result != OK) | 650 if (result != OK) |
| 665 return result; | 651 return result; |
| 666 | 652 |
| 667 // Remove unsupported proxies from the list. | 653 // Remove unsupported proxies from the list. |
| 668 proxy_info_.RemoveProxiesWithoutScheme( | 654 proxy_info_.RemoveProxiesWithoutScheme( |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 754 | 740 |
| 755 // If the user is refreshing the page, bypass the host cache. | 741 // If the user is refreshing the page, bypass the host cache. |
| 756 bool disable_resolver_cache = request_->load_flags & LOAD_BYPASS_CACHE || | 742 bool disable_resolver_cache = request_->load_flags & LOAD_BYPASS_CACHE || |
| 757 request_->load_flags & LOAD_DISABLE_CACHE; | 743 request_->load_flags & LOAD_DISABLE_CACHE; |
| 758 | 744 |
| 759 TCPSocketParams tcp_params(host, port, request_->priority, request_->referrer, | 745 TCPSocketParams tcp_params(host, port, request_->priority, request_->referrer, |
| 760 disable_resolver_cache); | 746 disable_resolver_cache); |
| 761 | 747 |
| 762 int rv = connection_->Init(connection_group, tcp_params, request_->priority, | 748 int rv = connection_->Init(connection_group, tcp_params, request_->priority, |
| 763 &io_callback_, session_->tcp_socket_pool(), | 749 &io_callback_, session_->tcp_socket_pool(), |
| 764 load_log_); | 750 net_log_); |
| 765 return rv; | 751 return rv; |
| 766 } | 752 } |
| 767 | 753 |
| 768 int HttpNetworkTransaction::DoInitConnectionComplete(int result) { | 754 int HttpNetworkTransaction::DoInitConnectionComplete(int result) { |
| 769 if (result < 0) { | 755 if (result < 0) { |
| 770 if (alternate_protocol_mode_ == kUsingAlternateProtocol) { | 756 if (alternate_protocol_mode_ == kUsingAlternateProtocol) { |
| 771 // Mark the alternate protocol as broken and fallback. | 757 // Mark the alternate protocol as broken and fallback. |
| 772 MarkBrokenAlternateProtocolAndFallback(); | 758 MarkBrokenAlternateProtocolAndFallback(); |
| 773 return OK; | 759 return OK; |
| 774 } | 760 } |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 820 HostResolver::RequestInfo req_info(request_->url.HostNoBrackets(), | 806 HostResolver::RequestInfo req_info(request_->url.HostNoBrackets(), |
| 821 request_->url.EffectiveIntPort()); | 807 request_->url.EffectiveIntPort()); |
| 822 req_info.set_referrer(request_->referrer); | 808 req_info.set_referrer(request_->referrer); |
| 823 req_info.set_priority(request_->priority); | 809 req_info.set_priority(request_->priority); |
| 824 | 810 |
| 825 if (proxy_info_.proxy_server().scheme() == ProxyServer::SCHEME_SOCKS5) | 811 if (proxy_info_.proxy_server().scheme() == ProxyServer::SCHEME_SOCKS5) |
| 826 s = new SOCKS5ClientSocket(s, req_info); | 812 s = new SOCKS5ClientSocket(s, req_info); |
| 827 else | 813 else |
| 828 s = new SOCKSClientSocket(s, req_info, session_->host_resolver()); | 814 s = new SOCKSClientSocket(s, req_info, session_->host_resolver()); |
| 829 connection_->set_socket(s); | 815 connection_->set_socket(s); |
| 830 return connection_->socket()->Connect(&io_callback_, load_log_); | 816 return connection_->socket()->Connect(&io_callback_, net_log_); |
| 831 } | 817 } |
| 832 | 818 |
| 833 int HttpNetworkTransaction::DoSOCKSConnectComplete(int result) { | 819 int HttpNetworkTransaction::DoSOCKSConnectComplete(int result) { |
| 834 DCHECK_EQ(kSOCKSProxy, proxy_mode_); | 820 DCHECK_EQ(kSOCKSProxy, proxy_mode_); |
| 835 | 821 |
| 836 if (result == OK) { | 822 if (result == OK) { |
| 837 if (using_ssl_) { | 823 if (using_ssl_) { |
| 838 next_state_ = STATE_SSL_CONNECT; | 824 next_state_ = STATE_SSL_CONNECT; |
| 839 } else { | 825 } else { |
| 840 next_state_ = STATE_SEND_REQUEST; | 826 next_state_ = STATE_SEND_REQUEST; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 851 if (request_->load_flags & LOAD_VERIFY_EV_CERT) | 837 if (request_->load_flags & LOAD_VERIFY_EV_CERT) |
| 852 ssl_config_.verify_ev_cert = true; | 838 ssl_config_.verify_ev_cert = true; |
| 853 | 839 |
| 854 ssl_connect_start_time_ = base::TimeTicks::Now(); | 840 ssl_connect_start_time_ = base::TimeTicks::Now(); |
| 855 | 841 |
| 856 // Add a SSL socket on top of our existing transport socket. | 842 // Add a SSL socket on top of our existing transport socket. |
| 857 ClientSocket* s = connection_->release_socket(); | 843 ClientSocket* s = connection_->release_socket(); |
| 858 s = session_->socket_factory()->CreateSSLClientSocket( | 844 s = session_->socket_factory()->CreateSSLClientSocket( |
| 859 s, request_->url.HostNoBrackets(), ssl_config_); | 845 s, request_->url.HostNoBrackets(), ssl_config_); |
| 860 connection_->set_socket(s); | 846 connection_->set_socket(s); |
| 861 return connection_->socket()->Connect(&io_callback_, load_log_); | 847 return connection_->socket()->Connect(&io_callback_, net_log_); |
| 862 } | 848 } |
| 863 | 849 |
| 864 int HttpNetworkTransaction::DoSSLConnectComplete(int result) { | 850 int HttpNetworkTransaction::DoSSLConnectComplete(int result) { |
| 865 SSLClientSocket* ssl_socket = | 851 SSLClientSocket* ssl_socket = |
| 866 reinterpret_cast<SSLClientSocket*>(connection_->socket()); | 852 reinterpret_cast<SSLClientSocket*>(connection_->socket()); |
| 867 | 853 |
| 868 SSLClientSocket::NextProtoStatus status = | 854 SSLClientSocket::NextProtoStatus status = |
| 869 SSLClientSocket::kNextProtoUnsupported; | 855 SSLClientSocket::kNextProtoUnsupported; |
| 870 std::string proto; | 856 std::string proto; |
| 871 // GetNextProto will fail and and trigger a NOTREACHED if we pass in a socket | 857 // GetNextProto will fail and and trigger a NOTREACHED if we pass in a socket |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 962 | 948 |
| 963 if (establishing_tunnel_) { | 949 if (establishing_tunnel_) { |
| 964 BuildTunnelRequest(request_, authorization_headers, &request_headers_); | 950 BuildTunnelRequest(request_, authorization_headers, &request_headers_); |
| 965 } else { | 951 } else { |
| 966 BuildRequestHeaders(request_, authorization_headers, request_body, | 952 BuildRequestHeaders(request_, authorization_headers, request_body, |
| 967 proxy_mode_ == kHTTPProxy, &request_headers_); | 953 proxy_mode_ == kHTTPProxy, &request_headers_); |
| 968 } | 954 } |
| 969 } | 955 } |
| 970 | 956 |
| 971 headers_valid_ = false; | 957 headers_valid_ = false; |
| 972 http_stream_.reset(new HttpBasicStream(connection_.get(), load_log_)); | 958 http_stream_.reset(new HttpBasicStream(connection_.get(), net_log_)); |
| 973 | 959 |
| 974 return http_stream_->SendRequest(request_, request_headers_, | 960 return http_stream_->SendRequest(request_, request_headers_, |
| 975 request_body, &response_, &io_callback_); | 961 request_body, &response_, &io_callback_); |
| 976 } | 962 } |
| 977 | 963 |
| 978 int HttpNetworkTransaction::DoSendRequestComplete(int result) { | 964 int HttpNetworkTransaction::DoSendRequestComplete(int result) { |
| 979 if (result < 0) | 965 if (result < 0) |
| 980 return HandleIOError(result); | 966 return HandleIOError(result); |
| 981 | 967 |
| 982 next_state_ = STATE_READ_HEADERS; | 968 next_state_ = STATE_READ_HEADERS; |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1062 if (establishing_tunnel_) { | 1048 if (establishing_tunnel_) { |
| 1063 switch (response_.headers->response_code()) { | 1049 switch (response_.headers->response_code()) { |
| 1064 case 200: // OK | 1050 case 200: // OK |
| 1065 if (http_stream_->IsMoreDataBuffered()) { | 1051 if (http_stream_->IsMoreDataBuffered()) { |
| 1066 // The proxy sent extraneous data after the headers. | 1052 // The proxy sent extraneous data after the headers. |
| 1067 return ERR_TUNNEL_CONNECTION_FAILED; | 1053 return ERR_TUNNEL_CONNECTION_FAILED; |
| 1068 } | 1054 } |
| 1069 next_state_ = STATE_SSL_CONNECT; | 1055 next_state_ = STATE_SSL_CONNECT; |
| 1070 // Reset for the real request and response headers. | 1056 // Reset for the real request and response headers. |
| 1071 request_headers_.clear(); | 1057 request_headers_.clear(); |
| 1072 http_stream_.reset(new HttpBasicStream(connection_.get(), load_log_)); | 1058 http_stream_.reset(new HttpBasicStream(connection_.get(), net_log_)); |
| 1073 headers_valid_ = false; | 1059 headers_valid_ = false; |
| 1074 establishing_tunnel_ = false; | 1060 establishing_tunnel_ = false; |
| 1075 return OK; | 1061 return OK; |
| 1076 | 1062 |
| 1077 // We aren't able to CONNECT to the remote host through the proxy. We | 1063 // We aren't able to CONNECT to the remote host through the proxy. We |
| 1078 // need to be very suspicious about the response because an active network | 1064 // need to be very suspicious about the response because an active network |
| 1079 // attacker can force us into this state by masquerading as the proxy. | 1065 // attacker can force us into this state by masquerading as the proxy. |
| 1080 // The only safe thing to do here is to fail the connection because our | 1066 // The only safe thing to do here is to fail the connection because our |
| 1081 // client is expecting an SSL protected response. | 1067 // client is expecting an SSL protected response. |
| 1082 // See http://crbug.com/7338. | 1068 // See http://crbug.com/7338. |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1228 spdy_session = spdy_pool->GetSpdySessionFromSSLSocket( | 1214 spdy_session = spdy_pool->GetSpdySessionFromSSLSocket( |
| 1229 host_port_pair, session_, connection_.release()); | 1215 host_port_pair, session_, connection_.release()); |
| 1230 } | 1216 } |
| 1231 | 1217 |
| 1232 CHECK(spdy_session.get()); | 1218 CHECK(spdy_session.get()); |
| 1233 | 1219 |
| 1234 UploadDataStream* upload_data = request_->upload_data ? | 1220 UploadDataStream* upload_data = request_->upload_data ? |
| 1235 new UploadDataStream(request_->upload_data) : NULL; | 1221 new UploadDataStream(request_->upload_data) : NULL; |
| 1236 headers_valid_ = false; | 1222 headers_valid_ = false; |
| 1237 spdy_stream_ = spdy_session->GetOrCreateStream( | 1223 spdy_stream_ = spdy_session->GetOrCreateStream( |
| 1238 *request_, upload_data, load_log_); | 1224 *request_, upload_data, net_log_); |
| 1239 return spdy_stream_->SendRequest(upload_data, &response_, &io_callback_); | 1225 return spdy_stream_->SendRequest(upload_data, &response_, &io_callback_); |
| 1240 } | 1226 } |
| 1241 | 1227 |
| 1242 int HttpNetworkTransaction::DoSpdySendRequestComplete(int result) { | 1228 int HttpNetworkTransaction::DoSpdySendRequestComplete(int result) { |
| 1243 if (result < 0) | 1229 if (result < 0) |
| 1244 return result; | 1230 return result; |
| 1245 | 1231 |
| 1246 next_state_ = STATE_SPDY_READ_HEADERS; | 1232 next_state_ = STATE_SPDY_READ_HEADERS; |
| 1247 return OK; | 1233 return OK; |
| 1248 } | 1234 } |
| (...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1614 return ERR_ADDRESS_UNREACHABLE; | 1600 return ERR_ADDRESS_UNREACHABLE; |
| 1615 default: | 1601 default: |
| 1616 return error; | 1602 return error; |
| 1617 } | 1603 } |
| 1618 | 1604 |
| 1619 if (request_->load_flags & LOAD_BYPASS_PROXY) { | 1605 if (request_->load_flags & LOAD_BYPASS_PROXY) { |
| 1620 return error; | 1606 return error; |
| 1621 } | 1607 } |
| 1622 | 1608 |
| 1623 int rv = session_->proxy_service()->ReconsiderProxyAfterError( | 1609 int rv = session_->proxy_service()->ReconsiderProxyAfterError( |
| 1624 request_->url, &proxy_info_, &io_callback_, &pac_request_, load_log_); | 1610 request_->url, &proxy_info_, &io_callback_, &pac_request_, net_log_); |
| 1625 if (rv == OK || rv == ERR_IO_PENDING) { | 1611 if (rv == OK || rv == ERR_IO_PENDING) { |
| 1626 // If the error was during connection setup, there is no socket to | 1612 // If the error was during connection setup, there is no socket to |
| 1627 // disconnect. | 1613 // disconnect. |
| 1628 if (connection_->socket()) | 1614 if (connection_->socket()) |
| 1629 connection_->socket()->Disconnect(); | 1615 connection_->socket()->Disconnect(); |
| 1630 connection_->Reset(); | 1616 connection_->Reset(); |
| 1631 next_state_ = STATE_RESOLVE_PROXY_COMPLETE; | 1617 next_state_ = STATE_RESOLVE_PROXY_COMPLETE; |
| 1632 } else { | 1618 } else { |
| 1633 // If ReconsiderProxyAfterError() failed synchronously, it means | 1619 // If ReconsiderProxyAfterError() failed synchronously, it means |
| 1634 // there was nothing left to fall-back to, so fail the transaction | 1620 // there was nothing left to fall-back to, so fail the transaction |
| (...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1927 http_host_port_pair); | 1913 http_host_port_pair); |
| 1928 | 1914 |
| 1929 alternate_protocol_mode_ = kDoNotUseAlternateProtocol; | 1915 alternate_protocol_mode_ = kDoNotUseAlternateProtocol; |
| 1930 if (connection_->socket()) | 1916 if (connection_->socket()) |
| 1931 connection_->socket()->Disconnect(); | 1917 connection_->socket()->Disconnect(); |
| 1932 connection_->Reset(); | 1918 connection_->Reset(); |
| 1933 next_state_ = STATE_INIT_CONNECTION; | 1919 next_state_ = STATE_INIT_CONNECTION; |
| 1934 } | 1920 } |
| 1935 | 1921 |
| 1936 } // namespace net | 1922 } // namespace net |
| OLD | NEW |