| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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/scoped_ptr.h" | 7 #include "base/scoped_ptr.h" |
| 8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
| 9 #include "base/field_trial.h" | 9 #include "base/field_trial.h" |
| 10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
| 11 #include "base/trace_event.h" | 11 #include "base/trace_event.h" |
| 12 #include "build/build_config.h" | 12 #include "build/build_config.h" |
| 13 #include "net/base/client_socket_factory.h" | 13 #include "net/base/client_socket_factory.h" |
| 14 #include "net/base/connection_type_histograms.h" | 14 #include "net/base/connection_type_histograms.h" |
| 15 #include "net/base/dns_resolution_observer.h" | 15 #include "net/base/dns_resolution_observer.h" |
| 16 #include "net/base/host_resolver.h" | 16 #include "net/base/host_resolver.h" |
| 17 #include "net/base/io_buffer.h" | 17 #include "net/base/io_buffer.h" |
| 18 #include "net/base/load_flags.h" | 18 #include "net/base/load_flags.h" |
| 19 #include "net/base/net_errors.h" | 19 #include "net/base/net_errors.h" |
| 20 #include "net/base/net_util.h" | 20 #include "net/base/net_util.h" |
| 21 #include "net/base/ssl_client_socket.h" | 21 #include "net/base/ssl_client_socket.h" |
| 22 #include "net/base/upload_data_stream.h" | 22 #include "net/base/upload_data_stream.h" |
| 23 #include "net/http/http_auth.h" | 23 #include "net/http/http_auth.h" |
| 24 #include "net/http/http_auth_handler.h" | 24 #include "net/http/http_auth_handler.h" |
| 25 #include "net/http/http_basic_stream.h" |
| 25 #include "net/http/http_chunked_decoder.h" | 26 #include "net/http/http_chunked_decoder.h" |
| 26 #include "net/http/http_network_session.h" | 27 #include "net/http/http_network_session.h" |
| 27 #include "net/http/http_request_info.h" | 28 #include "net/http/http_request_info.h" |
| 28 #include "net/http/http_response_headers.h" | 29 #include "net/http/http_response_headers.h" |
| 29 #include "net/http/http_util.h" | 30 #include "net/http/http_util.h" |
| 30 | 31 |
| 31 using base::Time; | 32 using base::Time; |
| 32 | 33 |
| 33 namespace net { | 34 namespace net { |
| 34 | 35 |
| (...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 575 // needed. | 576 // needed. |
| 576 LogTCPConnectedMetrics(); | 577 LogTCPConnectedMetrics(); |
| 577 if (using_ssl_ && !using_tunnel_) { | 578 if (using_ssl_ && !using_tunnel_) { |
| 578 next_state_ = STATE_SSL_CONNECT; | 579 next_state_ = STATE_SSL_CONNECT; |
| 579 } else { | 580 } else { |
| 580 next_state_ = STATE_WRITE_HEADERS; | 581 next_state_ = STATE_WRITE_HEADERS; |
| 581 if (using_tunnel_) | 582 if (using_tunnel_) |
| 582 establishing_tunnel_ = true; | 583 establishing_tunnel_ = true; |
| 583 } | 584 } |
| 584 } | 585 } |
| 586 http_stream_.reset(new HttpBasicStream(&connection_)); |
| 585 return OK; | 587 return OK; |
| 586 } | 588 } |
| 587 | 589 |
| 588 int HttpNetworkTransaction::DoSSLConnect() { | 590 int HttpNetworkTransaction::DoSSLConnect() { |
| 589 next_state_ = STATE_SSL_CONNECT_COMPLETE; | 591 next_state_ = STATE_SSL_CONNECT_COMPLETE; |
| 590 | 592 |
| 591 // Add a SSL socket on top of our existing transport socket. | 593 // Add a SSL socket on top of our existing transport socket. |
| 592 ClientSocket* s = connection_.release_socket(); | 594 ClientSocket* s = connection_.release_socket(); |
| 593 s = socket_factory_->CreateSSLClientSocket( | 595 s = socket_factory_->CreateSSLClientSocket( |
| 594 s, request_->url.HostNoBrackets(), ssl_config_); | 596 s, request_->url.HostNoBrackets(), ssl_config_); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 650 // out the first bytes of the request headers. | 652 // out the first bytes of the request headers. |
| 651 if (request_headers_bytes_sent_ == 0) { | 653 if (request_headers_bytes_sent_ == 0) { |
| 652 response_.request_time = Time::Now(); | 654 response_.request_time = Time::Now(); |
| 653 } | 655 } |
| 654 | 656 |
| 655 request_headers_->SetDataOffset(request_headers_bytes_sent_); | 657 request_headers_->SetDataOffset(request_headers_bytes_sent_); |
| 656 int buf_len = static_cast<int>(request_headers_->headers_.size() - | 658 int buf_len = static_cast<int>(request_headers_->headers_.size() - |
| 657 request_headers_bytes_sent_); | 659 request_headers_bytes_sent_); |
| 658 DCHECK_GT(buf_len, 0); | 660 DCHECK_GT(buf_len, 0); |
| 659 | 661 |
| 660 return connection_.socket()->Write(request_headers_, buf_len, &io_callback_); | 662 return http_stream_->Write(request_headers_, buf_len, &io_callback_); |
| 661 } | 663 } |
| 662 | 664 |
| 663 int HttpNetworkTransaction::DoWriteHeadersComplete(int result) { | 665 int HttpNetworkTransaction::DoWriteHeadersComplete(int result) { |
| 664 if (result < 0) | 666 if (result < 0) |
| 665 return HandleIOError(result); | 667 return HandleIOError(result); |
| 666 | 668 |
| 667 request_headers_bytes_sent_ += result; | 669 request_headers_bytes_sent_ += result; |
| 668 if (request_headers_bytes_sent_ < request_headers_->headers_.size()) { | 670 if (request_headers_bytes_sent_ < request_headers_->headers_.size()) { |
| 669 next_state_ = STATE_WRITE_HEADERS; | 671 next_state_ = STATE_WRITE_HEADERS; |
| 670 } else if (!establishing_tunnel_ && request_body_stream_.get() && | 672 } else if (!establishing_tunnel_ && request_body_stream_.get() && |
| 671 request_body_stream_->size()) { | 673 request_body_stream_->size()) { |
| 672 next_state_ = STATE_WRITE_BODY; | 674 next_state_ = STATE_WRITE_BODY; |
| 673 } else { | 675 } else { |
| 674 next_state_ = STATE_READ_HEADERS; | 676 next_state_ = STATE_READ_HEADERS; |
| 675 } | 677 } |
| 676 return OK; | 678 return OK; |
| 677 } | 679 } |
| 678 | 680 |
| 679 int HttpNetworkTransaction::DoWriteBody() { | 681 int HttpNetworkTransaction::DoWriteBody() { |
| 680 next_state_ = STATE_WRITE_BODY_COMPLETE; | 682 next_state_ = STATE_WRITE_BODY_COMPLETE; |
| 681 | 683 |
| 682 DCHECK(request_body_stream_.get()); | 684 DCHECK(request_body_stream_.get()); |
| 683 DCHECK(request_body_stream_->size()); | 685 DCHECK(request_body_stream_->size()); |
| 684 | 686 |
| 685 int buf_len = static_cast<int>(request_body_stream_->buf_len()); | 687 int buf_len = static_cast<int>(request_body_stream_->buf_len()); |
| 686 | 688 |
| 687 return connection_.socket()->Write(request_body_stream_->buf(), buf_len, | 689 return http_stream_->Write(request_body_stream_->buf(), buf_len, |
| 688 &io_callback_); | 690 &io_callback_); |
| 689 } | 691 } |
| 690 | 692 |
| 691 int HttpNetworkTransaction::DoWriteBodyComplete(int result) { | 693 int HttpNetworkTransaction::DoWriteBodyComplete(int result) { |
| 692 if (result < 0) | 694 if (result < 0) |
| 693 return HandleIOError(result); | 695 return HandleIOError(result); |
| 694 | 696 |
| 695 request_body_stream_->DidConsume(result); | 697 request_body_stream_->DidConsume(result); |
| 696 | 698 |
| 697 if (request_body_stream_->position() < request_body_stream_->size()) { | 699 if (request_body_stream_->position() < request_body_stream_->size()) { |
| 698 next_state_ = STATE_WRITE_BODY; | 700 next_state_ = STATE_WRITE_BODY; |
| 699 } else { | 701 } else { |
| 700 next_state_ = STATE_READ_HEADERS; | 702 next_state_ = STATE_READ_HEADERS; |
| 701 } | 703 } |
| 702 return OK; | 704 return OK; |
| 703 } | 705 } |
| 704 | 706 |
| 705 int HttpNetworkTransaction::DoReadHeaders() { | 707 int HttpNetworkTransaction::DoReadHeaders() { |
| 706 next_state_ = STATE_READ_HEADERS_COMPLETE; | 708 next_state_ = STATE_READ_HEADERS_COMPLETE; |
| 707 | 709 |
| 708 // Grow the read buffer if necessary. | 710 // Grow the read buffer if necessary. |
| 709 if (header_buf_len_ == header_buf_capacity_) { | 711 if (header_buf_len_ == header_buf_capacity_) { |
| 710 header_buf_capacity_ += kHeaderBufInitialSize; | 712 header_buf_capacity_ += kHeaderBufInitialSize; |
| 711 header_buf_->Realloc(header_buf_capacity_); | 713 header_buf_->Realloc(header_buf_capacity_); |
| 712 } | 714 } |
| 713 | 715 |
| 714 int buf_len = header_buf_capacity_ - header_buf_len_; | 716 int buf_len = header_buf_capacity_ - header_buf_len_; |
| 715 header_buf_->set_data(header_buf_len_); | 717 header_buf_->set_data(header_buf_len_); |
| 716 | 718 |
| 717 return connection_.socket()->Read(header_buf_, buf_len, &io_callback_); | 719 return http_stream_->Read(header_buf_, buf_len, &io_callback_); |
| 718 } | 720 } |
| 719 | 721 |
| 720 int HttpNetworkTransaction::HandleConnectionClosedBeforeEndOfHeaders() { | 722 int HttpNetworkTransaction::HandleConnectionClosedBeforeEndOfHeaders() { |
| 721 if (establishing_tunnel_) { | 723 if (establishing_tunnel_) { |
| 722 // The connection was closed before the tunnel could be established. | 724 // The connection was closed before the tunnel could be established. |
| 723 return ERR_TUNNEL_CONNECTION_FAILED; | 725 return ERR_TUNNEL_CONNECTION_FAILED; |
| 724 } | 726 } |
| 725 | 727 |
| 726 if (has_found_status_line_start()) { | 728 if (has_found_status_line_start()) { |
| 727 // Assume EOF is end-of-headers. | 729 // Assume EOF is end-of-headers. |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 838 if (header_buf_body_offset_ == header_buf_len_) { | 840 if (header_buf_body_offset_ == header_buf_len_) { |
| 839 header_buf_->Reset(); | 841 header_buf_->Reset(); |
| 840 header_buf_capacity_ = 0; | 842 header_buf_capacity_ = 0; |
| 841 header_buf_len_ = 0; | 843 header_buf_len_ = 0; |
| 842 header_buf_body_offset_ = -1; | 844 header_buf_body_offset_ = -1; |
| 843 } | 845 } |
| 844 return n; | 846 return n; |
| 845 } | 847 } |
| 846 | 848 |
| 847 reading_body_from_socket_ = true; | 849 reading_body_from_socket_ = true; |
| 848 return connection_.socket()->Read(read_buf_, read_buf_len_, &io_callback_); | 850 return http_stream_->Read(read_buf_, read_buf_len_, &io_callback_); |
| 849 } | 851 } |
| 850 | 852 |
| 851 int HttpNetworkTransaction::DoReadBodyComplete(int result) { | 853 int HttpNetworkTransaction::DoReadBodyComplete(int result) { |
| 852 // We are done with the Read call. | 854 // We are done with the Read call. |
| 853 DCHECK(!establishing_tunnel_) << | 855 DCHECK(!establishing_tunnel_) << |
| 854 "We should never read a response body of a tunnel."; | 856 "We should never read a response body of a tunnel."; |
| 855 | 857 |
| 856 bool unfiltered_eof = (result == 0 && reading_body_from_socket_); | 858 bool unfiltered_eof = (result == 0 && reading_body_from_socket_); |
| 857 reading_body_from_socket_ = false; | 859 reading_body_from_socket_ = false; |
| 858 | 860 |
| (...skipping 766 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1625 host_and_port = proxy_info_.proxy_server().host_and_port(); | 1627 host_and_port = proxy_info_.proxy_server().host_and_port(); |
| 1626 } else { | 1628 } else { |
| 1627 DCHECK(target == HttpAuth::AUTH_SERVER); | 1629 DCHECK(target == HttpAuth::AUTH_SERVER); |
| 1628 host_and_port = GetHostAndPort(request_->url); | 1630 host_and_port = GetHostAndPort(request_->url); |
| 1629 } | 1631 } |
| 1630 auth_info->host_and_port = ASCIIToWide(host_and_port); | 1632 auth_info->host_and_port = ASCIIToWide(host_and_port); |
| 1631 response_.auth_challenge = auth_info; | 1633 response_.auth_challenge = auth_info; |
| 1632 } | 1634 } |
| 1633 | 1635 |
| 1634 } // namespace net | 1636 } // namespace net |
| OLD | NEW |