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

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

Issue 1901533002: Implementation of network level throttler. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Destroy transaction before session in QuicUploadWriteError. Created 4 years, 1 month 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
« no previous file with comments | « net/http/http_network_transaction.h ('k') | net/http/http_network_transaction_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 <memory> 7 #include <memory>
8 #include <set> 8 #include <set>
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 session_->GetSSLConfig(*request_, &server_ssl_config_, &proxy_ssl_config_); 137 session_->GetSSLConfig(*request_, &server_ssl_config_, &proxy_ssl_config_);
138 138
139 if (request_->load_flags & LOAD_DISABLE_CERT_REVOCATION_CHECKING) { 139 if (request_->load_flags & LOAD_DISABLE_CERT_REVOCATION_CHECKING) {
140 server_ssl_config_.rev_checking_enabled = false; 140 server_ssl_config_.rev_checking_enabled = false;
141 proxy_ssl_config_.rev_checking_enabled = false; 141 proxy_ssl_config_.rev_checking_enabled = false;
142 } 142 }
143 143
144 if (request_->load_flags & LOAD_PREFETCH) 144 if (request_->load_flags & LOAD_PREFETCH)
145 response_.unused_since_prefetch = true; 145 response_.unused_since_prefetch = true;
146 146
147 next_state_ = STATE_NOTIFY_BEFORE_CREATE_STREAM; 147 next_state_ = STATE_THROTTLE;
148 int rv = DoLoop(OK); 148 int rv = DoLoop(OK);
149 if (rv == ERR_IO_PENDING) 149 if (rv == ERR_IO_PENDING)
150 callback_ = callback; 150 callback_ = callback;
151 return rv; 151 return rv;
152 } 152 }
153 153
154 int HttpNetworkTransaction::RestartIgnoringLastError( 154 int HttpNetworkTransaction::RestartIgnoringLastError(
155 const CompletionCallback& callback) { 155 const CompletionCallback& callback) {
156 DCHECK(!stream_.get()); 156 DCHECK(!stream_.get());
157 DCHECK(!stream_request_.get()); 157 DCHECK(!stream_request_.get());
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
363 void HttpNetworkTransaction::DoneReading() {} 363 void HttpNetworkTransaction::DoneReading() {}
364 364
365 const HttpResponseInfo* HttpNetworkTransaction::GetResponseInfo() const { 365 const HttpResponseInfo* HttpNetworkTransaction::GetResponseInfo() const {
366 return &response_; 366 return &response_;
367 } 367 }
368 368
369 LoadState HttpNetworkTransaction::GetLoadState() const { 369 LoadState HttpNetworkTransaction::GetLoadState() const {
370 // TODO(wtc): Define a new LoadState value for the 370 // TODO(wtc): Define a new LoadState value for the
371 // STATE_INIT_CONNECTION_COMPLETE state, which delays the HTTP request. 371 // STATE_INIT_CONNECTION_COMPLETE state, which delays the HTTP request.
372 switch (next_state_) { 372 switch (next_state_) {
373 case STATE_THROTTLE_COMPLETE:
374 return LOAD_STATE_THROTTLED;
373 case STATE_CREATE_STREAM: 375 case STATE_CREATE_STREAM:
374 return LOAD_STATE_WAITING_FOR_DELEGATE; 376 return LOAD_STATE_WAITING_FOR_DELEGATE;
375 case STATE_CREATE_STREAM_COMPLETE: 377 case STATE_CREATE_STREAM_COMPLETE:
376 return stream_request_->GetLoadState(); 378 return stream_request_->GetLoadState();
377 case STATE_GENERATE_PROXY_AUTH_TOKEN_COMPLETE: 379 case STATE_GENERATE_PROXY_AUTH_TOKEN_COMPLETE:
378 case STATE_GENERATE_SERVER_AUTH_TOKEN_COMPLETE: 380 case STATE_GENERATE_SERVER_AUTH_TOKEN_COMPLETE:
379 case STATE_SEND_REQUEST_COMPLETE: 381 case STATE_SEND_REQUEST_COMPLETE:
380 return LOAD_STATE_SENDING_REQUEST; 382 return LOAD_STATE_SENDING_REQUEST;
381 case STATE_READ_HEADERS_COMPLETE: 383 case STATE_READ_HEADERS_COMPLETE:
382 return LOAD_STATE_WAITING_FOR_RESPONSE; 384 return LOAD_STATE_WAITING_FOR_RESPONSE;
(...skipping 30 matching lines...) Expand all
413 415
414 void HttpNetworkTransaction::PopulateNetErrorDetails( 416 void HttpNetworkTransaction::PopulateNetErrorDetails(
415 NetErrorDetails* details) const { 417 NetErrorDetails* details) const {
416 *details = net_error_details_; 418 *details = net_error_details_;
417 if (stream_) 419 if (stream_)
418 stream_->PopulateNetErrorDetails(details); 420 stream_->PopulateNetErrorDetails(details);
419 } 421 }
420 422
421 void HttpNetworkTransaction::SetPriority(RequestPriority priority) { 423 void HttpNetworkTransaction::SetPriority(RequestPriority priority) {
422 priority_ = priority; 424 priority_ = priority;
425
426 // TODO: Note that if throttling is ever implemented below this
427 // level, either of the two below calls may result in request
428 // completion, callbacks, and the potential deletion of this object
429 // (like the call below to throttle_->SetPriority()). In that case,
430 // this code will need to be modified.
423 if (stream_request_) 431 if (stream_request_)
424 stream_request_->SetPriority(priority); 432 stream_request_->SetPriority(priority);
425 if (stream_) 433 if (stream_)
426 stream_->SetPriority(priority); 434 stream_->SetPriority(priority);
435
436 if (throttle_)
437 throttle_->SetPriority(priority);
438 // The above call may have resulted in deleting |*this|.
427 } 439 }
428 440
429 void HttpNetworkTransaction::SetWebSocketHandshakeStreamCreateHelper( 441 void HttpNetworkTransaction::SetWebSocketHandshakeStreamCreateHelper(
430 WebSocketHandshakeStreamBase::CreateHelper* create_helper) { 442 WebSocketHandshakeStreamBase::CreateHelper* create_helper) {
431 websocket_handshake_stream_base_create_helper_ = create_helper; 443 websocket_handshake_stream_base_create_helper_ = create_helper;
432 } 444 }
433 445
434 void HttpNetworkTransaction::SetBeforeNetworkStartCallback( 446 void HttpNetworkTransaction::SetBeforeNetworkStartCallback(
435 const BeforeNetworkStartCallback& callback) { 447 const BeforeNetworkStartCallback& callback) {
436 before_network_start_callback_ = callback; 448 before_network_start_callback_ = callback;
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
574 586
575 void HttpNetworkTransaction::OnQuicBroken() { 587 void HttpNetworkTransaction::OnQuicBroken() {
576 net_error_details_.quic_broken = true; 588 net_error_details_.quic_broken = true;
577 } 589 }
578 590
579 void HttpNetworkTransaction::GetConnectionAttempts( 591 void HttpNetworkTransaction::GetConnectionAttempts(
580 ConnectionAttempts* out) const { 592 ConnectionAttempts* out) const {
581 *out = connection_attempts_; 593 *out = connection_attempts_;
582 } 594 }
583 595
596 void HttpNetworkTransaction::OnThrottleStateChanged() {
597 // TODO(rdsmith): This DCHECK is dependent on the only transition
598 // being from throttled->unthrottled. That is true right now, but may not
599 // be so in the future.
600 DCHECK_EQ(STATE_THROTTLE_COMPLETE, next_state_);
601
602 net_log_.EndEvent(NetLogEventType::HTTP_TRANSACTION_THROTTLED);
603
604 DoLoop(OK);
605 }
606
584 bool HttpNetworkTransaction::IsSecureRequest() const { 607 bool HttpNetworkTransaction::IsSecureRequest() const {
585 return request_->url.SchemeIsCryptographic(); 608 return request_->url.SchemeIsCryptographic();
586 } 609 }
587 610
588 bool HttpNetworkTransaction::IsTokenBindingEnabled() const { 611 bool HttpNetworkTransaction::IsTokenBindingEnabled() const {
589 if (!IsSecureRequest()) 612 if (!IsSecureRequest())
590 return false; 613 return false;
591 SSLInfo ssl_info; 614 SSLInfo ssl_info;
592 stream_->GetSSLInfo(&ssl_info); 615 stream_->GetSSLInfo(&ssl_info);
593 return ssl_info.token_binding_negotiated && 616 return ssl_info.token_binding_negotiated &&
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
644 } 667 }
645 668
646 int HttpNetworkTransaction::DoLoop(int result) { 669 int HttpNetworkTransaction::DoLoop(int result) {
647 DCHECK(next_state_ != STATE_NONE); 670 DCHECK(next_state_ != STATE_NONE);
648 671
649 int rv = result; 672 int rv = result;
650 do { 673 do {
651 State state = next_state_; 674 State state = next_state_;
652 next_state_ = STATE_NONE; 675 next_state_ = STATE_NONE;
653 switch (state) { 676 switch (state) {
677 case STATE_THROTTLE:
678 DCHECK_EQ(OK, rv);
679 rv = DoThrottle();
680 break;
681 case STATE_THROTTLE_COMPLETE:
682 DCHECK_EQ(OK, rv);
683 rv = DoThrottleComplete();
684 break;
654 case STATE_NOTIFY_BEFORE_CREATE_STREAM: 685 case STATE_NOTIFY_BEFORE_CREATE_STREAM:
655 DCHECK_EQ(OK, rv); 686 DCHECK_EQ(OK, rv);
656 rv = DoNotifyBeforeCreateStream(); 687 rv = DoNotifyBeforeCreateStream();
657 break; 688 break;
658 case STATE_CREATE_STREAM: 689 case STATE_CREATE_STREAM:
659 DCHECK_EQ(OK, rv); 690 DCHECK_EQ(OK, rv);
660 rv = DoCreateStream(); 691 rv = DoCreateStream();
661 break; 692 break;
662 case STATE_CREATE_STREAM_COMPLETE: 693 case STATE_CREATE_STREAM_COMPLETE:
663 // TODO(zhongyi): remove liveness checks when crbug.com/652868 is 694 // TODO(zhongyi): remove liveness checks when crbug.com/652868 is
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
759 default: 790 default:
760 NOTREACHED() << "bad state"; 791 NOTREACHED() << "bad state";
761 rv = ERR_FAILED; 792 rv = ERR_FAILED;
762 break; 793 break;
763 } 794 }
764 } while (rv != ERR_IO_PENDING && next_state_ != STATE_NONE); 795 } while (rv != ERR_IO_PENDING && next_state_ != STATE_NONE);
765 796
766 return rv; 797 return rv;
767 } 798 }
768 799
800 int HttpNetworkTransaction::DoThrottle() {
801 throttle_ = session_->throttler()->CreateThrottle(
802 this, priority_, (request_->load_flags & LOAD_IGNORE_LIMITS) != 0);
803 next_state_ = STATE_THROTTLE_COMPLETE;
804
805 if (throttle_->IsThrottled()) {
806 net_log_.BeginEvent(NetLogEventType::HTTP_TRANSACTION_THROTTLED);
807 return ERR_IO_PENDING;
808 }
809
810 return OK;
811 }
812
813 int HttpNetworkTransaction::DoThrottleComplete() {
814 DCHECK(throttle_);
815 DCHECK(!throttle_->IsThrottled());
816
817 next_state_ = STATE_NOTIFY_BEFORE_CREATE_STREAM;
818
819 return OK;
820 }
821
769 int HttpNetworkTransaction::DoNotifyBeforeCreateStream() { 822 int HttpNetworkTransaction::DoNotifyBeforeCreateStream() {
770 next_state_ = STATE_CREATE_STREAM; 823 next_state_ = STATE_CREATE_STREAM;
771 bool defer = false; 824 bool defer = false;
772 if (!before_network_start_callback_.is_null()) 825 if (!before_network_start_callback_.is_null())
773 before_network_start_callback_.Run(&defer); 826 before_network_start_callback_.Run(&defer);
774 if (!defer) 827 if (!defer)
775 return OK; 828 return OK;
776 return ERR_IO_PENDING; 829 return ERR_IO_PENDING;
777 } 830 }
778 831
(...skipping 868 matching lines...) Expand 10 before | Expand all | Expand 10 after
1647 DCHECK(stream_request_); 1700 DCHECK(stream_request_);
1648 1701
1649 // Since the transaction can restart with auth credentials, it may create a 1702 // Since the transaction can restart with auth credentials, it may create a
1650 // stream more than once. Accumulate all of the connection attempts across 1703 // stream more than once. Accumulate all of the connection attempts across
1651 // those streams by appending them to the vector: 1704 // those streams by appending them to the vector:
1652 for (const auto& attempt : stream_request_->connection_attempts()) 1705 for (const auto& attempt : stream_request_->connection_attempts())
1653 connection_attempts_.push_back(attempt); 1706 connection_attempts_.push_back(attempt);
1654 } 1707 }
1655 1708
1656 } // namespace net 1709 } // namespace net
OLDNEW
« no previous file with comments | « net/http/http_network_transaction.h ('k') | net/http/http_network_transaction_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698