Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(340)

Side by Side Diff: net/http/http_network_transaction.cc

Issue 6698009: Add request_id to HttpRequestInfo and pass it to the NetworkDelegate for events. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: test fixes Created 9 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698