OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |