| 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/string_util.h" | 9 #include "base/string_util.h" |
| 10 #include "base/trace_event.h" | 10 #include "base/trace_event.h" |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 45 using_proxy_(false), | 45 using_proxy_(false), |
| 46 using_tunnel_(false), | 46 using_tunnel_(false), |
| 47 establishing_tunnel_(false), | 47 establishing_tunnel_(false), |
| 48 request_headers_bytes_sent_(0), | 48 request_headers_bytes_sent_(0), |
| 49 header_buf_capacity_(0), | 49 header_buf_capacity_(0), |
| 50 header_buf_len_(0), | 50 header_buf_len_(0), |
| 51 header_buf_body_offset_(-1), | 51 header_buf_body_offset_(-1), |
| 52 header_buf_http_offset_(-1), | 52 header_buf_http_offset_(-1), |
| 53 content_length_(-1), // -1 means unspecified. | 53 content_length_(-1), // -1 means unspecified. |
| 54 content_read_(0), | 54 content_read_(0), |
| 55 read_buf_(NULL), | |
| 56 read_buf_len_(0), | 55 read_buf_len_(0), |
| 57 next_state_(STATE_NONE) { | 56 next_state_(STATE_NONE) { |
| 58 #if defined(OS_WIN) | 57 #if defined(OS_WIN) |
| 59 // TODO(port): Port the SSLConfigService class to Linux and Mac OS X. | 58 // TODO(port): Port the SSLConfigService class to Linux and Mac OS X. |
| 60 session->ssl_config_service()->GetSSLConfig(&ssl_config_); | 59 session->ssl_config_service()->GetSSLConfig(&ssl_config_); |
| 61 #endif | 60 #endif |
| 62 } | 61 } |
| 63 | 62 |
| 64 int HttpNetworkTransaction::Start(const HttpRequestInfo* request_info, | 63 int HttpNetworkTransaction::Start(const HttpRequestInfo* request_info, |
| 65 CompletionCallback* callback) { | 64 CompletionCallback* callback) { |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 127 AuthPath(target)); | 126 AuthPath(target)); |
| 128 | 127 |
| 129 next_state_ = STATE_INIT_CONNECTION; | 128 next_state_ = STATE_INIT_CONNECTION; |
| 130 connection_.set_socket(NULL); | 129 connection_.set_socket(NULL); |
| 131 connection_.Reset(); | 130 connection_.Reset(); |
| 132 | 131 |
| 133 // Reset the other member variables. | 132 // Reset the other member variables. |
| 134 ResetStateForRestart(); | 133 ResetStateForRestart(); |
| 135 } | 134 } |
| 136 | 135 |
| 137 int HttpNetworkTransaction::Read(char* buf, int buf_len, | 136 int HttpNetworkTransaction::Read(IOBuffer* buf, int buf_len, |
| 138 CompletionCallback* callback) { | 137 CompletionCallback* callback) { |
| 139 DCHECK(response_.headers); | 138 DCHECK(response_.headers); |
| 140 DCHECK(buf); | 139 DCHECK(buf); |
| 141 DCHECK(buf_len > 0); | 140 DCHECK(buf_len > 0); |
| 142 | 141 |
| 143 if (!connection_.is_initialized()) | 142 if (!connection_.is_initialized()) |
| 144 return 0; // connection_ has been reset. Treat like EOF. | 143 return 0; // connection_ has been reset. Treat like EOF. |
| 145 | 144 |
| 146 read_buf_ = buf; | 145 read_buf_ = buf; |
| 147 read_buf_len_ = buf_len; | 146 read_buf_len_ = buf_len; |
| (...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 719 | 718 |
| 720 next_state_ = STATE_READ_BODY_COMPLETE; | 719 next_state_ = STATE_READ_BODY_COMPLETE; |
| 721 | 720 |
| 722 // We may have already consumed the indicated content length. | 721 // We may have already consumed the indicated content length. |
| 723 if (content_length_ != -1 && content_read_ >= content_length_) | 722 if (content_length_ != -1 && content_read_ >= content_length_) |
| 724 return 0; | 723 return 0; |
| 725 | 724 |
| 726 // We may have some data remaining in the header buffer. | 725 // We may have some data remaining in the header buffer. |
| 727 if (header_buf_.get() && header_buf_body_offset_ < header_buf_len_) { | 726 if (header_buf_.get() && header_buf_body_offset_ < header_buf_len_) { |
| 728 int n = std::min(read_buf_len_, header_buf_len_ - header_buf_body_offset_); | 727 int n = std::min(read_buf_len_, header_buf_len_ - header_buf_body_offset_); |
| 729 memcpy(read_buf_, header_buf_.get() + header_buf_body_offset_, n); | 728 memcpy(read_buf_->data(), header_buf_.get() + header_buf_body_offset_, n); |
| 730 header_buf_body_offset_ += n; | 729 header_buf_body_offset_ += n; |
| 731 if (header_buf_body_offset_ == header_buf_len_) { | 730 if (header_buf_body_offset_ == header_buf_len_) { |
| 732 header_buf_.reset(); | 731 header_buf_.reset(); |
| 733 header_buf_capacity_ = 0; | 732 header_buf_capacity_ = 0; |
| 734 header_buf_len_ = 0; | 733 header_buf_len_ = 0; |
| 735 header_buf_body_offset_ = -1; | 734 header_buf_body_offset_ = -1; |
| 736 } | 735 } |
| 737 return n; | 736 return n; |
| 738 } | 737 } |
| 739 | 738 |
| 740 return connection_.socket()->Read(read_buf_, read_buf_len_, &io_callback_); | 739 return connection_.socket()->Read(read_buf_->data(), read_buf_len_, |
| 740 &io_callback_); |
| 741 } | 741 } |
| 742 | 742 |
| 743 int HttpNetworkTransaction::DoReadBodyComplete(int result) { | 743 int HttpNetworkTransaction::DoReadBodyComplete(int result) { |
| 744 // We are done with the Read call. | 744 // We are done with the Read call. |
| 745 | 745 |
| 746 bool unfiltered_eof = (result == 0); | 746 bool unfiltered_eof = (result == 0); |
| 747 | 747 |
| 748 // Filter incoming data if appropriate. FilterBuf may return an error. | 748 // Filter incoming data if appropriate. FilterBuf may return an error. |
| 749 if (result > 0 && chunked_decoder_.get()) { | 749 if (result > 0 && chunked_decoder_.get()) { |
| 750 result = chunked_decoder_->FilterBuf(read_buf_, result); | 750 result = chunked_decoder_->FilterBuf(read_buf_->data(), result); |
| 751 if (result == 0 && !chunked_decoder_->reached_eof()) { | 751 if (result == 0 && !chunked_decoder_->reached_eof()) { |
| 752 // Don't signal completion of the Read call yet or else it'll look like | 752 // Don't signal completion of the Read call yet or else it'll look like |
| 753 // we received end-of-file. Wait for more data. | 753 // we received end-of-file. Wait for more data. |
| 754 next_state_ = STATE_READ_BODY; | 754 next_state_ = STATE_READ_BODY; |
| 755 return OK; | 755 return OK; |
| 756 } | 756 } |
| 757 } | 757 } |
| 758 | 758 |
| 759 bool done = false, keep_alive = false; | 759 bool done = false, keep_alive = false; |
| 760 if (result < 0) { | 760 if (result < 0) { |
| (...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1263 if (target == HttpAuth::AUTH_PROXY) { | 1263 if (target == HttpAuth::AUTH_PROXY) { |
| 1264 auth_info->host = ASCIIToWide(proxy_info_.proxy_server()); | 1264 auth_info->host = ASCIIToWide(proxy_info_.proxy_server()); |
| 1265 } else { | 1265 } else { |
| 1266 DCHECK(target == HttpAuth::AUTH_SERVER); | 1266 DCHECK(target == HttpAuth::AUTH_SERVER); |
| 1267 auth_info->host = ASCIIToWide(request_->url.host()); | 1267 auth_info->host = ASCIIToWide(request_->url.host()); |
| 1268 } | 1268 } |
| 1269 response_.auth_challenge = auth_info; | 1269 response_.auth_challenge = auth_info; |
| 1270 } | 1270 } |
| 1271 | 1271 |
| 1272 } // namespace net | 1272 } // namespace net |
| OLD | NEW |