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

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

Issue 2932513004: Throttle HttpStreamFactoryImpl::Job to HTTP/2-supported servers (Closed)
Patch Set: add a pair of braces Created 3 years, 6 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
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_stream_factory_impl_job.h" 5 #include "net/http/http_stream_factory_impl_job.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
197 was_alpn_negotiated_(false), 197 was_alpn_negotiated_(false),
198 negotiated_protocol_(kProtoUnknown), 198 negotiated_protocol_(kProtoUnknown),
199 num_streams_(0), 199 num_streams_(0),
200 spdy_session_direct_( 200 spdy_session_direct_(
201 !(proxy_info.is_https() && origin_url_.SchemeIs(url::kHttpScheme))), 201 !(proxy_info.is_https() && origin_url_.SchemeIs(url::kHttpScheme))),
202 spdy_session_key_(GetSpdySessionKey(spdy_session_direct_, 202 spdy_session_key_(GetSpdySessionKey(spdy_session_direct_,
203 proxy_info_.proxy_server(), 203 proxy_info_.proxy_server(),
204 origin_url_, 204 origin_url_,
205 request_info_.privacy_mode)), 205 request_info_.privacy_mode)),
206 stream_type_(HttpStreamRequest::BIDIRECTIONAL_STREAM), 206 stream_type_(HttpStreamRequest::BIDIRECTIONAL_STREAM),
207 init_connection_already_resumed_(false),
207 ptr_factory_(this) { 208 ptr_factory_(this) {
208 DCHECK(session); 209 DCHECK(session);
209 if (alternative_protocol != kProtoUnknown) { 210 if (alternative_protocol != kProtoUnknown) {
210 // The job cannot have protocol requirements dictated by alternative service 211 // The job cannot have protocol requirements dictated by alternative service
211 // and have an alternative proxy server set at the same time, since 212 // and have an alternative proxy server set at the same time, since
212 // alternative services are used for requests that are fetched directly, 213 // alternative services are used for requests that are fetched directly,
213 // while the alternative proxy server is used for requests that should be 214 // while the alternative proxy server is used for requests that should be
214 // fetched using proxy. 215 // fetched using proxy.
215 DCHECK(!alternative_proxy_server_.is_valid()); 216 DCHECK(!alternative_proxy_server_.is_valid());
216 // If the alternative service protocol is specified, then the job type must 217 // If the alternative service protocol is specified, then the job type must
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after
547 RunLoop(result); 548 RunLoop(result);
548 } 549 }
549 550
550 void HttpStreamFactoryImpl::Job::RunLoop(int result) { 551 void HttpStreamFactoryImpl::Job::RunLoop(int result) {
551 TRACE_EVENT0(kNetTracingCategory, "HttpStreamFactoryImpl::Job::RunLoop"); 552 TRACE_EVENT0(kNetTracingCategory, "HttpStreamFactoryImpl::Job::RunLoop");
552 result = DoLoop(result); 553 result = DoLoop(result);
553 554
554 if (result == ERR_IO_PENDING) 555 if (result == ERR_IO_PENDING)
555 return; 556 return;
556 557
558 // Resume all throttled Jobs with the same SpdySessionKey if there are any,
559 // now that this job is done.
560 session_->spdy_session_pool()->ResumePendingRequests(spdy_session_key_);
561
557 if (job_type_ == PRECONNECT) { 562 if (job_type_ == PRECONNECT) {
558 base::ThreadTaskRunnerHandle::Get()->PostTask( 563 base::ThreadTaskRunnerHandle::Get()->PostTask(
559 FROM_HERE, 564 FROM_HERE,
560 base::Bind(&HttpStreamFactoryImpl::Job::OnPreconnectsComplete, 565 base::Bind(&HttpStreamFactoryImpl::Job::OnPreconnectsComplete,
561 ptr_factory_.GetWeakPtr())); 566 ptr_factory_.GetWeakPtr()));
562 return; 567 return;
563 } 568 }
564 569
565 if (IsCertificateError(result)) { 570 if (IsCertificateError(result)) {
566 // Retrieve SSL information from the socket. 571 // Retrieve SSL information from the socket.
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
678 DCHECK_EQ(OK, rv); 683 DCHECK_EQ(OK, rv);
679 rv = DoStart(); 684 rv = DoStart();
680 break; 685 break;
681 case STATE_WAIT: 686 case STATE_WAIT:
682 DCHECK_EQ(OK, rv); 687 DCHECK_EQ(OK, rv);
683 rv = DoWait(); 688 rv = DoWait();
684 break; 689 break;
685 case STATE_WAIT_COMPLETE: 690 case STATE_WAIT_COMPLETE:
686 rv = DoWaitComplete(rv); 691 rv = DoWaitComplete(rv);
687 break; 692 break;
693 case STATE_EVALUATE_THROTTLE:
694 DCHECK_EQ(OK, rv);
695 rv = DoEvaluateThrottle();
696 break;
688 case STATE_INIT_CONNECTION: 697 case STATE_INIT_CONNECTION:
689 DCHECK_EQ(OK, rv); 698 DCHECK_EQ(OK, rv);
690 rv = DoInitConnection(); 699 rv = DoInitConnection();
691 break; 700 break;
692 case STATE_INIT_CONNECTION_COMPLETE: 701 case STATE_INIT_CONNECTION_COMPLETE:
693 rv = DoInitConnectionComplete(rv); 702 rv = DoInitConnectionComplete(rv);
694 break; 703 break;
695 case STATE_WAITING_USER_ACTION: 704 case STATE_WAITING_USER_ACTION:
696 rv = DoWaitingUserAction(rv); 705 rv = DoWaitingUserAction(rv);
697 break; 706 break;
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
755 NetLog::BoolCallback("should_wait", should_wait)); 764 NetLog::BoolCallback("should_wait", should_wait));
756 if (should_wait) 765 if (should_wait)
757 return ERR_IO_PENDING; 766 return ERR_IO_PENDING;
758 767
759 return OK; 768 return OK;
760 } 769 }
761 770
762 int HttpStreamFactoryImpl::Job::DoWaitComplete(int result) { 771 int HttpStreamFactoryImpl::Job::DoWaitComplete(int result) {
763 net_log_.EndEvent(NetLogEventType::HTTP_STREAM_JOB_WAITING); 772 net_log_.EndEvent(NetLogEventType::HTTP_STREAM_JOB_WAITING);
764 DCHECK_EQ(OK, result); 773 DCHECK_EQ(OK, result);
774 next_state_ = STATE_EVALUATE_THROTTLE;
775 return OK;
776 }
777
778 int HttpStreamFactoryImpl::Job::DoEvaluateThrottle() {
765 next_state_ = STATE_INIT_CONNECTION; 779 next_state_ = STATE_INIT_CONNECTION;
766 return OK; 780 if (!using_ssl_)
781 return OK;
782 // Ask |delegate_delegate_| to update the spdy session key for the request
783 // that launched this job.
784 delegate_->SetSpdySessionKey(this, spdy_session_key_);
785
786 // Throttle connect to an HTTP/2 supported server, if there are pending
787 // requests with the same SpdySessionKey.
788 if (session_->http_server_properties()->RequiresHTTP11(
789 spdy_session_key_.host_port_pair())) {
790 return OK;
791 }
792 url::SchemeHostPort scheme_host_port(
793 using_ssl_ ? url::kHttpsScheme : url::kHttpScheme,
794 spdy_session_key_.host_port_pair().host(),
795 spdy_session_key_.host_port_pair().port());
796 if (!session_->http_server_properties()->GetSupportsSpdy(scheme_host_port))
797 return OK;
798 base::Closure callback =
799 base::Bind(&HttpStreamFactoryImpl::Job::ResumeInitConnection,
800 ptr_factory_.GetWeakPtr());
801 if (session_->spdy_session_pool()->StartRequest(spdy_session_key_,
802 callback)) {
803 return OK;
804 }
805 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
806 FROM_HERE, callback, base::TimeDelta::FromMilliseconds(kHTTP2ThrottleMs));
807 return ERR_IO_PENDING;
808 }
809
810 void HttpStreamFactoryImpl::Job::ResumeInitConnection() {
811 if (init_connection_already_resumed_)
812 return;
813 // TODO(xunjieli): Change this to a DCHECK once crbug.com/718576 is stable.
814 CHECK_EQ(next_state_, STATE_INIT_CONNECTION);
815 init_connection_already_resumed_ = true;
816 OnIOComplete(OK);
767 } 817 }
768 818
769 int HttpStreamFactoryImpl::Job::DoInitConnection() { 819 int HttpStreamFactoryImpl::Job::DoInitConnection() {
770 net_log_.BeginEvent(NetLogEventType::HTTP_STREAM_JOB_INIT_CONNECTION); 820 net_log_.BeginEvent(NetLogEventType::HTTP_STREAM_JOB_INIT_CONNECTION);
771 int result = DoInitConnectionImpl(); 821 int result = DoInitConnectionImpl();
772 if (result != ERR_SPDY_SESSION_ALREADY_EXISTS) 822 if (result != ERR_SPDY_SESSION_ALREADY_EXISTS)
773 delegate_->OnConnectionInitialized(this, result); 823 delegate_->OnConnectionInitialized(this, result);
774 824
775 return result; 825 return result;
776 } 826 }
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
866 // If we're preconnecting, but we already have a SpdySession, we don't 916 // If we're preconnecting, but we already have a SpdySession, we don't
867 // actually need to preconnect any sockets, so we're done. 917 // actually need to preconnect any sockets, so we're done.
868 if (job_type_ == PRECONNECT) 918 if (job_type_ == PRECONNECT)
869 return OK; 919 return OK;
870 using_spdy_ = true; 920 using_spdy_ = true;
871 next_state_ = STATE_CREATE_STREAM; 921 next_state_ = STATE_CREATE_STREAM;
872 existing_spdy_session_ = spdy_session; 922 existing_spdy_session_ = spdy_session;
873 return OK; 923 return OK;
874 } 924 }
875 } 925 }
876 if (using_ssl_) {
877 // Ask |delegate_delegate_| to update the spdy session key for the request
878 // that launched this job.
879 delegate_->SetSpdySessionKey(this, spdy_session_key_);
880 }
881 926
882 if (proxy_info_.is_http() || proxy_info_.is_https()) 927 if (proxy_info_.is_http() || proxy_info_.is_https())
883 establishing_tunnel_ = using_ssl_; 928 establishing_tunnel_ = using_ssl_;
884 929
885 HttpServerProperties* http_server_properties = 930 HttpServerProperties* http_server_properties =
886 session_->http_server_properties(); 931 session_->http_server_properties();
887 if (http_server_properties) { 932 if (http_server_properties) {
888 http_server_properties->MaybeForceHTTP11(destination_, &server_ssl_config_); 933 http_server_properties->MaybeForceHTTP11(destination_, &server_ssl_config_);
889 if (proxy_info_.is_http() || proxy_info_.is_https()) { 934 if (proxy_info_.is_http() || proxy_info_.is_https()) {
890 http_server_properties->MaybeForceHTTP11( 935 http_server_properties->MaybeForceHTTP11(
(...skipping 560 matching lines...) Expand 10 before | Expand all | Expand 10 after
1451 bool enable_ip_based_pooling, 1496 bool enable_ip_based_pooling,
1452 NetLog* net_log) { 1497 NetLog* net_log) {
1453 return base::MakeUnique<HttpStreamFactoryImpl::Job>( 1498 return base::MakeUnique<HttpStreamFactoryImpl::Job>(
1454 delegate, job_type, session, request_info, priority, proxy_info, 1499 delegate, job_type, session, request_info, priority, proxy_info,
1455 server_ssl_config, proxy_ssl_config, destination, origin_url, 1500 server_ssl_config, proxy_ssl_config, destination, origin_url,
1456 kProtoUnknown, alternative_proxy_server, enable_ip_based_pooling, 1501 kProtoUnknown, alternative_proxy_server, enable_ip_based_pooling,
1457 net_log); 1502 net_log);
1458 } 1503 }
1459 1504
1460 } // namespace net 1505 } // namespace net
OLDNEW
« no previous file with comments | « net/http/http_stream_factory_impl_job.h ('k') | net/http/http_stream_factory_impl_job_controller_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698