Chromium Code Reviews| 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 <set> | 7 #include <set> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 92 } | 92 } |
| 93 | 93 |
| 94 } // namespace | 94 } // namespace |
| 95 | 95 |
| 96 //----------------------------------------------------------------------------- | 96 //----------------------------------------------------------------------------- |
| 97 | 97 |
| 98 HttpNetworkTransaction::HttpNetworkTransaction(HttpNetworkSession* session) | 98 HttpNetworkTransaction::HttpNetworkTransaction(HttpNetworkSession* session) |
| 99 : pending_auth_target_(HttpAuth::AUTH_NONE), | 99 : pending_auth_target_(HttpAuth::AUTH_NONE), |
| 100 ALLOW_THIS_IN_INITIALIZER_LIST( | 100 ALLOW_THIS_IN_INITIALIZER_LIST( |
| 101 io_callback_(this, &HttpNetworkTransaction::OnIOComplete)), | 101 io_callback_(this, &HttpNetworkTransaction::OnIOComplete)), |
| 102 ALLOW_THIS_IN_INITIALIZER_LIST(delegate_callback_( | |
| 103 new CancelableCompletionCallback<HttpNetworkTransaction>( | |
| 104 this, &HttpNetworkTransaction::OnIOComplete))), | |
| 102 user_callback_(NULL), | 105 user_callback_(NULL), |
| 103 session_(session), | 106 session_(session), |
| 104 request_(NULL), | 107 request_(NULL), |
| 105 headers_valid_(false), | 108 headers_valid_(false), |
| 106 logged_response_time_(false), | 109 logged_response_time_(false), |
| 107 request_headers_(), | 110 request_headers_(), |
| 108 read_buf_len_(0), | 111 read_buf_len_(0), |
| 109 next_state_(STATE_NONE), | 112 next_state_(STATE_NONE), |
| 110 establishing_tunnel_(false) { | 113 establishing_tunnel_(false) { |
| 111 session->ssl_config_service()->GetSSLConfig(&ssl_config_); | 114 session->ssl_config_service()->GetSSLConfig(&ssl_config_); |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 139 // HTTP, it can vary depending on whether or not we're pipelining. It's | 142 // HTTP, it can vary depending on whether or not we're pipelining. It's |
| 140 // stream dependent, so the different subtypes should be implementing | 143 // stream dependent, so the different subtypes should be implementing |
| 141 // their solutions. | 144 // their solutions. |
| 142 HttpResponseBodyDrainer* drainer = | 145 HttpResponseBodyDrainer* drainer = |
| 143 new HttpResponseBodyDrainer(stream_.release()); | 146 new HttpResponseBodyDrainer(stream_.release()); |
| 144 drainer->Start(session_); | 147 drainer->Start(session_); |
| 145 // |drainer| will delete itself. | 148 // |drainer| will delete itself. |
| 146 } | 149 } |
| 147 } | 150 } |
| 148 } | 151 } |
| 152 | |
| 153 delegate_callback_->Cancel(); | |
| 149 } | 154 } |
| 150 | 155 |
| 151 int HttpNetworkTransaction::Start(const HttpRequestInfo* request_info, | 156 int HttpNetworkTransaction::Start(const HttpRequestInfo* request_info, |
| 152 CompletionCallback* callback, | 157 CompletionCallback* callback, |
| 153 const BoundNetLog& net_log) { | 158 const BoundNetLog& net_log) { |
| 154 SIMPLE_STATS_COUNTER("HttpNetworkTransaction.Count"); | 159 SIMPLE_STATS_COUNTER("HttpNetworkTransaction.Count"); |
| 155 | 160 |
| 156 net_log_ = net_log; | 161 net_log_ = net_log; |
| 157 request_ = request_info; | 162 request_ = request_info; |
| 158 start_time_ = base::Time::Now(); | 163 start_time_ = base::Time::Now(); |
| (...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 507 case STATE_GENERATE_PROXY_AUTH_TOKEN_COMPLETE: | 512 case STATE_GENERATE_PROXY_AUTH_TOKEN_COMPLETE: |
| 508 rv = DoGenerateProxyAuthTokenComplete(rv); | 513 rv = DoGenerateProxyAuthTokenComplete(rv); |
| 509 break; | 514 break; |
| 510 case STATE_GENERATE_SERVER_AUTH_TOKEN: | 515 case STATE_GENERATE_SERVER_AUTH_TOKEN: |
| 511 DCHECK_EQ(OK, rv); | 516 DCHECK_EQ(OK, rv); |
| 512 rv = DoGenerateServerAuthToken(); | 517 rv = DoGenerateServerAuthToken(); |
| 513 break; | 518 break; |
| 514 case STATE_GENERATE_SERVER_AUTH_TOKEN_COMPLETE: | 519 case STATE_GENERATE_SERVER_AUTH_TOKEN_COMPLETE: |
| 515 rv = DoGenerateServerAuthTokenComplete(rv); | 520 rv = DoGenerateServerAuthTokenComplete(rv); |
| 516 break; | 521 break; |
| 522 case STATE_BUILD_REQUEST: | |
| 523 DCHECK_EQ(OK, rv); | |
| 524 net_log_.BeginEvent(NetLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST, NULL); | |
| 525 rv = DoBuildRequest(); | |
| 526 break; | |
| 527 case STATE_BUILD_REQUEST_COMPLETE: | |
| 528 rv = DoBuildRequestComplete(rv); | |
| 529 break; | |
| 517 case STATE_SEND_REQUEST: | 530 case STATE_SEND_REQUEST: |
| 518 DCHECK_EQ(OK, rv); | 531 DCHECK_EQ(OK, rv); |
| 519 net_log_.BeginEvent(NetLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST, NULL); | |
| 520 rv = DoSendRequest(); | 532 rv = DoSendRequest(); |
| 521 break; | 533 break; |
| 522 case STATE_SEND_REQUEST_COMPLETE: | 534 case STATE_SEND_REQUEST_COMPLETE: |
| 523 rv = DoSendRequestComplete(rv); | 535 rv = DoSendRequestComplete(rv); |
| 524 net_log_.EndEventWithNetErrorCode( | 536 net_log_.EndEventWithNetErrorCode( |
| 525 NetLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST, rv); | 537 NetLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST, rv); |
| 526 break; | 538 break; |
| 527 case STATE_READ_HEADERS: | 539 case STATE_READ_HEADERS: |
| 528 DCHECK_EQ(OK, rv); | 540 DCHECK_EQ(OK, rv); |
| 529 net_log_.BeginEvent(NetLog::TYPE_HTTP_TRANSACTION_READ_HEADERS, NULL); | 541 net_log_.BeginEvent(NetLog::TYPE_HTTP_TRANSACTION_READ_HEADERS, NULL); |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 654 if (!ShouldApplyServerAuth()) | 666 if (!ShouldApplyServerAuth()) |
| 655 return OK; | 667 return OK; |
| 656 return auth_controllers_[target]->MaybeGenerateAuthToken(request_, | 668 return auth_controllers_[target]->MaybeGenerateAuthToken(request_, |
| 657 &io_callback_, | 669 &io_callback_, |
| 658 net_log_); | 670 net_log_); |
| 659 } | 671 } |
| 660 | 672 |
| 661 int HttpNetworkTransaction::DoGenerateServerAuthTokenComplete(int rv) { | 673 int HttpNetworkTransaction::DoGenerateServerAuthTokenComplete(int rv) { |
| 662 DCHECK_NE(ERR_IO_PENDING, rv); | 674 DCHECK_NE(ERR_IO_PENDING, rv); |
| 663 if (rv == OK) | 675 if (rv == OK) |
| 676 next_state_ = STATE_BUILD_REQUEST; | |
| 677 return rv; | |
| 678 } | |
| 679 | |
| 680 int HttpNetworkTransaction::DoBuildRequest() { | |
| 681 next_state_ = STATE_BUILD_REQUEST_COMPLETE; | |
| 682 | |
| 683 request_body_.reset(NULL); | |
|
willchan no longer on Chromium
2011/03/26 01:46:49
Shouldn't request_body_ already be NULL?
Matt Perry
2011/03/28 22:51:01
What if the transaction is restarted?
willchan no longer on Chromium
2011/03/29 20:46:27
Good point. I guess I'd expect to reset request_bo
| |
| 684 if (request_->upload_data) { | |
| 685 int error_code; | |
| 686 request_body_.reset( | |
| 687 UploadDataStream::Create(request_->upload_data, &error_code)); | |
| 688 if (!request_body_.get()) | |
| 689 return error_code; | |
| 690 } | |
| 691 | |
| 692 headers_valid_ = false; | |
| 693 | |
| 694 // This is constructed lazily (instead of within our Start method), so that | |
| 695 // we have proxy info available. | |
| 696 if (request_headers_.IsEmpty()) { | |
| 697 bool using_proxy = (proxy_info_.is_http() || proxy_info_.is_https()) && | |
| 698 !is_https_request(); | |
| 699 HttpUtil::BuildRequestHeaders(request_, request_body_.get(), | |
| 700 auth_controllers_, | |
| 701 ShouldApplyServerAuth(), | |
| 702 ShouldApplyProxyAuth(), using_proxy, | |
| 703 &request_headers_); | |
| 704 } | |
| 705 | |
| 706 delegate_callback_->AddRef(); // balanced in DoSendRequestComplete | |
| 707 if (session_->network_delegate()) { | |
| 708 return session_->network_delegate()->NotifyBeforeSendHeaders( | |
| 709 request_->request_id, &request_headers_, delegate_callback_); | |
| 710 } | |
| 711 | |
| 712 return OK; | |
| 713 } | |
| 714 | |
| 715 int HttpNetworkTransaction::DoBuildRequestComplete(int result) { | |
| 716 delegate_callback_->Release(); // balanced in DoBuildRequest | |
| 717 | |
| 718 if (result == OK) | |
| 664 next_state_ = STATE_SEND_REQUEST; | 719 next_state_ = STATE_SEND_REQUEST; |
| 665 return rv; | 720 return result; |
| 666 } | 721 } |
| 667 | 722 |
| 668 int HttpNetworkTransaction::DoSendRequest() { | 723 int HttpNetworkTransaction::DoSendRequest() { |
| 669 next_state_ = STATE_SEND_REQUEST_COMPLETE; | 724 next_state_ = STATE_SEND_REQUEST_COMPLETE; |
| 670 | 725 |
| 671 UploadDataStream* request_body = NULL; | 726 return stream_->SendRequest( |
| 672 if (request_->upload_data) { | 727 request_headers_, request_body_.release(), &response_, &io_callback_); |
| 673 int error_code; | |
| 674 request_body = UploadDataStream::Create(request_->upload_data, &error_code); | |
| 675 if (!request_body) | |
| 676 return error_code; | |
| 677 } | |
| 678 | |
| 679 // This is constructed lazily (instead of within our Start method), so that | |
| 680 // we have proxy info available. | |
| 681 if (request_headers_.IsEmpty()) { | |
| 682 bool using_proxy = (proxy_info_.is_http()|| proxy_info_.is_https()) && | |
| 683 !is_https_request(); | |
| 684 HttpUtil::BuildRequestHeaders(request_, request_body, auth_controllers_, | |
| 685 ShouldApplyServerAuth(), | |
| 686 ShouldApplyProxyAuth(), using_proxy, | |
| 687 &request_headers_); | |
| 688 | |
| 689 if (session_->network_delegate()) | |
| 690 session_->network_delegate()->NotifySendHttpRequest(&request_headers_); | |
| 691 } | |
| 692 | |
| 693 headers_valid_ = false; | |
| 694 return stream_->SendRequest(request_headers_, request_body, &response_, | |
| 695 &io_callback_); | |
| 696 } | 728 } |
| 697 | 729 |
| 698 int HttpNetworkTransaction::DoSendRequestComplete(int result) { | 730 int HttpNetworkTransaction::DoSendRequestComplete(int result) { |
| 699 if (result < 0) | 731 if (result < 0) |
| 700 return HandleIOError(result); | 732 return HandleIOError(result); |
| 701 next_state_ = STATE_READ_HEADERS; | 733 next_state_ = STATE_READ_HEADERS; |
| 702 return OK; | 734 return OK; |
| 703 } | 735 } |
| 704 | 736 |
| 705 int HttpNetworkTransaction::DoReadHeaders() { | 737 int HttpNetworkTransaction::DoReadHeaders() { |
| (...skipping 525 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1231 #define STATE_CASE(s) \ | 1263 #define STATE_CASE(s) \ |
| 1232 case s: \ | 1264 case s: \ |
| 1233 description = base::StringPrintf("%s (0x%08X)", #s, s); \ | 1265 description = base::StringPrintf("%s (0x%08X)", #s, s); \ |
| 1234 break | 1266 break |
| 1235 | 1267 |
| 1236 std::string HttpNetworkTransaction::DescribeState(State state) { | 1268 std::string HttpNetworkTransaction::DescribeState(State state) { |
| 1237 std::string description; | 1269 std::string description; |
| 1238 switch (state) { | 1270 switch (state) { |
| 1239 STATE_CASE(STATE_CREATE_STREAM); | 1271 STATE_CASE(STATE_CREATE_STREAM); |
| 1240 STATE_CASE(STATE_CREATE_STREAM_COMPLETE); | 1272 STATE_CASE(STATE_CREATE_STREAM_COMPLETE); |
| 1273 STATE_CASE(STATE_BUILD_REQUEST); | |
| 1274 STATE_CASE(STATE_BUILD_REQUEST_COMPLETE); | |
| 1241 STATE_CASE(STATE_SEND_REQUEST); | 1275 STATE_CASE(STATE_SEND_REQUEST); |
| 1242 STATE_CASE(STATE_SEND_REQUEST_COMPLETE); | 1276 STATE_CASE(STATE_SEND_REQUEST_COMPLETE); |
| 1243 STATE_CASE(STATE_READ_HEADERS); | 1277 STATE_CASE(STATE_READ_HEADERS); |
| 1244 STATE_CASE(STATE_READ_HEADERS_COMPLETE); | 1278 STATE_CASE(STATE_READ_HEADERS_COMPLETE); |
| 1245 STATE_CASE(STATE_READ_BODY); | 1279 STATE_CASE(STATE_READ_BODY); |
| 1246 STATE_CASE(STATE_READ_BODY_COMPLETE); | 1280 STATE_CASE(STATE_READ_BODY_COMPLETE); |
| 1247 STATE_CASE(STATE_DRAIN_BODY_FOR_AUTH_RESTART); | 1281 STATE_CASE(STATE_DRAIN_BODY_FOR_AUTH_RESTART); |
| 1248 STATE_CASE(STATE_DRAIN_BODY_FOR_AUTH_RESTART_COMPLETE); | 1282 STATE_CASE(STATE_DRAIN_BODY_FOR_AUTH_RESTART_COMPLETE); |
| 1249 STATE_CASE(STATE_NONE); | 1283 STATE_CASE(STATE_NONE); |
| 1250 default: | 1284 default: |
| 1251 description = base::StringPrintf("Unknown state 0x%08X (%u)", state, | 1285 description = base::StringPrintf("Unknown state 0x%08X (%u)", state, |
| 1252 state); | 1286 state); |
| 1253 break; | 1287 break; |
| 1254 } | 1288 } |
| 1255 return description; | 1289 return description; |
| 1256 } | 1290 } |
| 1257 | 1291 |
| 1258 #undef STATE_CASE | 1292 #undef STATE_CASE |
| 1259 | 1293 |
| 1260 } // namespace net | 1294 } // namespace net |
| OLD | NEW |