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 |