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

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: delegate callbcak 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;
517 case STATE_SEND_REQUEST: 522 case STATE_BUILD_REQUEST:
518 DCHECK_EQ(OK, rv); 523 DCHECK_EQ(OK, rv);
519 net_log_.BeginEvent(NetLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST, NULL); 524 net_log_.BeginEvent(NetLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST, NULL);
520 rv = DoSendRequest(); 525 rv = DoBuildRequest();
526 break;
527 case STATE_BUILD_REQUEST_COMPLETE:
528 rv = DoBuildRequestComplete(rv);
529 break;
530 case STATE_SEND_REQUEST:
531 rv = DoSendRequest(rv);
521 break; 532 break;
522 case STATE_SEND_REQUEST_COMPLETE: 533 case STATE_SEND_REQUEST_COMPLETE:
523 rv = DoSendRequestComplete(rv); 534 rv = DoSendRequestComplete(rv);
524 net_log_.EndEventWithNetErrorCode( 535 net_log_.EndEventWithNetErrorCode(
525 NetLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST, rv); 536 NetLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST, rv);
526 break; 537 break;
527 case STATE_READ_HEADERS: 538 case STATE_READ_HEADERS:
528 DCHECK_EQ(OK, rv); 539 DCHECK_EQ(OK, rv);
529 net_log_.BeginEvent(NetLog::TYPE_HTTP_TRANSACTION_READ_HEADERS, NULL); 540 net_log_.BeginEvent(NetLog::TYPE_HTTP_TRANSACTION_READ_HEADERS, NULL);
530 rv = DoReadHeaders(); 541 rv = DoReadHeaders();
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
654 if (!ShouldApplyServerAuth()) 665 if (!ShouldApplyServerAuth())
655 return OK; 666 return OK;
656 return auth_controllers_[target]->MaybeGenerateAuthToken(request_, 667 return auth_controllers_[target]->MaybeGenerateAuthToken(request_,
657 &io_callback_, 668 &io_callback_,
658 net_log_); 669 net_log_);
659 } 670 }
660 671
661 int HttpNetworkTransaction::DoGenerateServerAuthTokenComplete(int rv) { 672 int HttpNetworkTransaction::DoGenerateServerAuthTokenComplete(int rv) {
662 DCHECK_NE(ERR_IO_PENDING, rv); 673 DCHECK_NE(ERR_IO_PENDING, rv);
663 if (rv == OK) 674 if (rv == OK)
664 next_state_ = STATE_SEND_REQUEST; 675 next_state_ = STATE_BUILD_REQUEST;
665 return rv; 676 return rv;
666 } 677 }
667 678
668 int HttpNetworkTransaction::DoSendRequest() { 679 int HttpNetworkTransaction::DoBuildRequest() {
669 next_state_ = STATE_SEND_REQUEST_COMPLETE; 680 next_state_ = STATE_BUILD_REQUEST_COMPLETE;
670 681
671 UploadDataStream* request_body = NULL; 682 request_body_.reset(NULL);
672 if (request_->upload_data) { 683 if (request_->upload_data) {
673 int error_code; 684 int error_code;
674 request_body = UploadDataStream::Create(request_->upload_data, &error_code); 685 request_body_.reset(
675 if (!request_body) 686 UploadDataStream::Create(request_->upload_data, &error_code));
687 if (!request_body_.get())
676 return error_code; 688 return error_code;
677 } 689 }
678 690
691 headers_valid_ = false;
692
679 // This is constructed lazily (instead of within our Start method), so that 693 // This is constructed lazily (instead of within our Start method), so that
680 // we have proxy info available. 694 // we have proxy info available.
681 if (request_headers_.IsEmpty()) { 695 if (request_headers_.IsEmpty()) {
682 bool using_proxy = (proxy_info_.is_http()|| proxy_info_.is_https()) && 696 bool using_proxy = (proxy_info_.is_http() || proxy_info_.is_https()) &&
683 !is_https_request(); 697 !is_https_request();
684 HttpUtil::BuildRequestHeaders(request_, request_body, auth_controllers_, 698 HttpUtil::BuildRequestHeaders(request_, request_body_.get(),
699 auth_controllers_,
685 ShouldApplyServerAuth(), 700 ShouldApplyServerAuth(),
686 ShouldApplyProxyAuth(), using_proxy, 701 ShouldApplyProxyAuth(), using_proxy,
687 &request_headers_); 702 &request_headers_);
688
689 if (session_->network_delegate())
690 session_->network_delegate()->NotifySendHttpRequest(&request_headers_);
691 } 703 }
692 704
693 headers_valid_ = false; 705 return OK;
694 return stream_->SendRequest(request_headers_, request_body, &response_, 706 }
695 &io_callback_); 707
708 int HttpNetworkTransaction::DoBuildRequestComplete(int result) {
willchan no longer on Chromium 2011/03/22 23:05:35 Sorry for nitpicking like this, but to make it mor
Matt Perry 2011/03/24 00:11:25 Done. Though now I notice that delegate_callback_
willchan no longer on Chromium 2011/03/26 01:46:49 I think maybe you want to only create the delegate
Matt Perry 2011/03/28 22:51:01 Any reason to prefer doing it that way as opposed
willchan no longer on Chromium 2011/03/29 20:46:27 I don't know that this is possible today, but let'
709 next_state_ = STATE_SEND_REQUEST;
710 delegate_callback_->AddRef(); // balanced in DoSendRequest
711
712 if (session_->network_delegate()) {
713 if (session_->network_delegate()->NotifyBeforeSendHeaders(
714 request_->request_id, &request_headers_, delegate_callback_))
715 return ERR_IO_PENDING;
716 }
717
718 return OK;
719 }
720
721 int HttpNetworkTransaction::DoSendRequest(int result) {
722 next_state_ = STATE_SEND_REQUEST_COMPLETE;
723 delegate_callback_->Release(); // balanced in DoBuildRequestComplete
724
725 if (result == net::OK) {
726 return stream_->SendRequest(
727 request_headers_, request_body_.release(), &response_, &io_callback_);
728 }
729 return result;
696 } 730 }
697 731
698 int HttpNetworkTransaction::DoSendRequestComplete(int result) { 732 int HttpNetworkTransaction::DoSendRequestComplete(int result) {
699 if (result < 0) 733 if (result < 0)
700 return HandleIOError(result); 734 return HandleIOError(result);
701 next_state_ = STATE_READ_HEADERS; 735 next_state_ = STATE_READ_HEADERS;
702 return OK; 736 return OK;
703 } 737 }
704 738
705 int HttpNetworkTransaction::DoReadHeaders() { 739 int HttpNetworkTransaction::DoReadHeaders() {
(...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after
1113 case ERR_CONNECTION_ABORTED: 1147 case ERR_CONNECTION_ABORTED:
1114 if (ShouldResendRequest(error)) { 1148 if (ShouldResendRequest(error)) {
1115 ResetConnectionAndRequestForResend(); 1149 ResetConnectionAndRequestForResend();
1116 error = OK; 1150 error = OK;
1117 } 1151 }
1118 break; 1152 break;
1119 } 1153 }
1120 return error; 1154 return error;
1121 } 1155 }
1122 1156
1123 void HttpNetworkTransaction::ResetStateForRestart() { 1157 void HttpNetworkTransaction::ResetStateForRestart() {
willchan no longer on Chromium 2011/03/22 23:05:35 This is the core place where all state gets reset
Matt Perry 2011/03/24 00:11:25 Mark it how?
willchan no longer on Chromium 2011/03/26 01:46:49 Note that we will "restart" a transaction for auth
Matt Perry 2011/03/28 22:51:01 Oh I see now. FWIW, OnBeforeSendHeaders will be ca
willchan no longer on Chromium 2011/03/29 20:46:27 OIC, ok!
1124 ResetStateForAuthRestart(); 1158 ResetStateForAuthRestart();
1125 stream_.reset(); 1159 stream_.reset();
1126 } 1160 }
1127 1161
1128 void HttpNetworkTransaction::ResetStateForAuthRestart() { 1162 void HttpNetworkTransaction::ResetStateForAuthRestart() {
1129 pending_auth_target_ = HttpAuth::AUTH_NONE; 1163 pending_auth_target_ = HttpAuth::AUTH_NONE;
1130 read_buf_ = NULL; 1164 read_buf_ = NULL;
1131 read_buf_len_ = 0; 1165 read_buf_len_ = 0;
1132 headers_valid_ = false; 1166 headers_valid_ = false;
1133 request_headers_.Clear(); 1167 request_headers_.Clear();
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
1231 #define STATE_CASE(s) \ 1265 #define STATE_CASE(s) \
1232 case s: \ 1266 case s: \
1233 description = base::StringPrintf("%s (0x%08X)", #s, s); \ 1267 description = base::StringPrintf("%s (0x%08X)", #s, s); \
1234 break 1268 break
1235 1269
1236 std::string HttpNetworkTransaction::DescribeState(State state) { 1270 std::string HttpNetworkTransaction::DescribeState(State state) {
1237 std::string description; 1271 std::string description;
1238 switch (state) { 1272 switch (state) {
1239 STATE_CASE(STATE_CREATE_STREAM); 1273 STATE_CASE(STATE_CREATE_STREAM);
1240 STATE_CASE(STATE_CREATE_STREAM_COMPLETE); 1274 STATE_CASE(STATE_CREATE_STREAM_COMPLETE);
1275 STATE_CASE(STATE_BUILD_REQUEST);
1276 STATE_CASE(STATE_BUILD_REQUEST_COMPLETE);
1241 STATE_CASE(STATE_SEND_REQUEST); 1277 STATE_CASE(STATE_SEND_REQUEST);
1242 STATE_CASE(STATE_SEND_REQUEST_COMPLETE); 1278 STATE_CASE(STATE_SEND_REQUEST_COMPLETE);
1243 STATE_CASE(STATE_READ_HEADERS); 1279 STATE_CASE(STATE_READ_HEADERS);
1244 STATE_CASE(STATE_READ_HEADERS_COMPLETE); 1280 STATE_CASE(STATE_READ_HEADERS_COMPLETE);
1245 STATE_CASE(STATE_READ_BODY); 1281 STATE_CASE(STATE_READ_BODY);
1246 STATE_CASE(STATE_READ_BODY_COMPLETE); 1282 STATE_CASE(STATE_READ_BODY_COMPLETE);
1247 STATE_CASE(STATE_DRAIN_BODY_FOR_AUTH_RESTART); 1283 STATE_CASE(STATE_DRAIN_BODY_FOR_AUTH_RESTART);
1248 STATE_CASE(STATE_DRAIN_BODY_FOR_AUTH_RESTART_COMPLETE); 1284 STATE_CASE(STATE_DRAIN_BODY_FOR_AUTH_RESTART_COMPLETE);
1249 STATE_CASE(STATE_NONE); 1285 STATE_CASE(STATE_NONE);
1250 default: 1286 default:
1251 description = base::StringPrintf("Unknown state 0x%08X (%u)", state, 1287 description = base::StringPrintf("Unknown state 0x%08X (%u)", state,
1252 state); 1288 state);
1253 break; 1289 break;
1254 } 1290 }
1255 return description; 1291 return description;
1256 } 1292 }
1257 1293
1258 #undef STATE_CASE 1294 #undef STATE_CASE
1259 1295
1260 } // namespace net 1296 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698