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

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

Issue 1744693002: Implement QUIC-based net::BidirectionalStream (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@basecl
Patch Set: Address Ryan's comments Created 4 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
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 #include <utility> 9 #include <utility>
10 10
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 quic_request_(session_->quic_stream_factory()), 209 quic_request_(session_->quic_stream_factory()),
210 using_existing_quic_session_(false), 210 using_existing_quic_session_(false),
211 spdy_certificate_error_(OK), 211 spdy_certificate_error_(OK),
212 establishing_tunnel_(false), 212 establishing_tunnel_(false),
213 was_npn_negotiated_(false), 213 was_npn_negotiated_(false),
214 protocol_negotiated_(kProtoUnknown), 214 protocol_negotiated_(kProtoUnknown),
215 num_streams_(0), 215 num_streams_(0),
216 spdy_session_direct_(false), 216 spdy_session_direct_(false),
217 job_status_(STATUS_RUNNING), 217 job_status_(STATUS_RUNNING),
218 other_job_status_(STATUS_RUNNING), 218 other_job_status_(STATUS_RUNNING),
219 for_bidirectional_(false), 219 stream_type_(HttpStreamRequest::BIDIRECTIONAL_STREAM),
220 ptr_factory_(this) { 220 ptr_factory_(this) {
221 DCHECK(stream_factory); 221 DCHECK(stream_factory);
222 DCHECK(session); 222 DCHECK(session);
223 if (IsQuicAlternative()) { 223 if (IsQuicAlternative()) {
224 DCHECK(session_->params().enable_quic); 224 DCHECK(session_->params().enable_quic);
225 using_quic_ = true; 225 using_quic_ = true;
226 } 226 }
227 } 227 }
228 228
229 HttpStreamFactoryImpl::Job::~Job() { 229 HttpStreamFactoryImpl::Job::~Job() {
(...skipping 11 matching lines...) Expand all
241 session_->proxy_service()->CancelPacRequest(pac_request_); 241 session_->proxy_service()->CancelPacRequest(pac_request_);
242 242
243 // The stream could be in a partial state. It is not reusable. 243 // The stream could be in a partial state. It is not reusable.
244 if (stream_.get() && next_state_ != STATE_DONE) 244 if (stream_.get() && next_state_ != STATE_DONE)
245 stream_->Close(true /* not reusable */); 245 stream_->Close(true /* not reusable */);
246 } 246 }
247 247
248 void HttpStreamFactoryImpl::Job::Start(Request* request) { 248 void HttpStreamFactoryImpl::Job::Start(Request* request) {
249 DCHECK(request); 249 DCHECK(request);
250 request_ = request; 250 request_ = request;
251 // Saves |for_bidirectional_|, since request is nulled when job is orphaned. 251 // Saves |stream_type_|, since request is nulled when job is orphaned.
252 for_bidirectional_ = request_->for_bidirectional(); 252 stream_type_ = request_->stream_type();
253 StartInternal(); 253 StartInternal();
254 } 254 }
255 255
256 int HttpStreamFactoryImpl::Job::Preconnect(int num_streams) { 256 int HttpStreamFactoryImpl::Job::Preconnect(int num_streams) {
257 DCHECK_GT(num_streams, 0); 257 DCHECK_GT(num_streams, 0);
258 base::WeakPtr<HttpServerProperties> http_server_properties = 258 base::WeakPtr<HttpServerProperties> http_server_properties =
259 session_->http_server_properties(); 259 session_->http_server_properties();
260 if (http_server_properties && 260 if (http_server_properties &&
261 http_server_properties->SupportsRequestPriority( 261 http_server_properties->SupportsRequestPriority(
262 HostPortPair::FromURL(request_info_.url))) { 262 HostPortPair::FromURL(request_info_.url))) {
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
495 // TODO(jgraettinger): Notify the factory, and let that notify |request_|, 495 // TODO(jgraettinger): Notify the factory, and let that notify |request_|,
496 // rather than notifying |request_| directly. 496 // rather than notifying |request_| directly.
497 if (IsOrphaned()) { 497 if (IsOrphaned()) {
498 if (spdy_session) { 498 if (spdy_session) {
499 stream_factory_->OnNewSpdySessionReady( 499 stream_factory_->OnNewSpdySessionReady(
500 spdy_session, spdy_session_direct_, server_ssl_config_, proxy_info_, 500 spdy_session, spdy_session_direct_, server_ssl_config_, proxy_info_,
501 was_npn_negotiated(), protocol_negotiated(), using_spdy(), net_log_); 501 was_npn_negotiated(), protocol_negotiated(), using_spdy(), net_log_);
502 } 502 }
503 stream_factory_->OnOrphanedJobComplete(this); 503 stream_factory_->OnOrphanedJobComplete(this);
504 } else { 504 } else {
505 if (for_bidirectional_) { 505 if (stream_type_ == HttpStreamRequest::BIDIRECTIONAL_STREAM) {
506 #if BUILDFLAG(ENABLE_BIDIRECTIONAL_STREAM) 506 #if BUILDFLAG(ENABLE_BIDIRECTIONAL_STREAM)
507 DCHECK(bidirectional_stream_job_); 507 DCHECK(bidirectional_stream_job_);
508 request_->OnNewSpdySessionReady(this, /*spdy_http_stream=*/nullptr, 508 request_->OnNewSpdySessionReady(this, /*spdy_http_stream=*/nullptr,
509 std::move(bidirectional_stream_job_), 509 std::move(bidirectional_stream_job_),
510 spdy_session, spdy_session_direct_); 510 spdy_session, spdy_session_direct_);
511 #else 511 #else
512 DCHECK(false); 512 DCHECK(false);
513 #endif 513 #endif
514
515 } else { 514 } else {
516 DCHECK(stream_); 515 DCHECK(stream_);
517 request_->OnNewSpdySessionReady(this, std::move(stream_), 516 request_->OnNewSpdySessionReady(this, std::move(stream_),
518 /** bidirectional_stream_job=*/nullptr, 517 /** bidirectional_stream_job=*/nullptr,
519 spdy_session, spdy_session_direct_); 518 spdy_session, spdy_session_direct_);
520 } 519 }
521 } 520 }
522 // |this| may be deleted after this call. 521 // |this| may be deleted after this call.
523 } 522 }
524 523
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
697 next_state_ = STATE_DONE; 696 next_state_ = STATE_DONE;
698 if (new_spdy_session_.get()) { 697 if (new_spdy_session_.get()) {
699 base::ThreadTaskRunnerHandle::Get()->PostTask( 698 base::ThreadTaskRunnerHandle::Get()->PostTask(
700 FROM_HERE, base::Bind(&Job::OnNewSpdySessionReadyCallback, 699 FROM_HERE, base::Bind(&Job::OnNewSpdySessionReadyCallback,
701 ptr_factory_.GetWeakPtr())); 700 ptr_factory_.GetWeakPtr()));
702 } else if (stream_factory_->for_websockets_) { 701 } else if (stream_factory_->for_websockets_) {
703 DCHECK(websocket_stream_); 702 DCHECK(websocket_stream_);
704 base::ThreadTaskRunnerHandle::Get()->PostTask( 703 base::ThreadTaskRunnerHandle::Get()->PostTask(
705 FROM_HERE, base::Bind(&Job::OnWebSocketHandshakeStreamReadyCallback, 704 FROM_HERE, base::Bind(&Job::OnWebSocketHandshakeStreamReadyCallback,
706 ptr_factory_.GetWeakPtr())); 705 ptr_factory_.GetWeakPtr()));
707 } else if (for_bidirectional_) { 706 } else if (stream_type_ == HttpStreamRequest::BIDIRECTIONAL_STREAM) {
708 #if BUILDFLAG(ENABLE_BIDIRECTIONAL_STREAM) 707 #if BUILDFLAG(ENABLE_BIDIRECTIONAL_STREAM)
709 if (!bidirectional_stream_job_) { 708 if (!bidirectional_stream_job_) {
710 base::ThreadTaskRunnerHandle::Get()->PostTask( 709 base::ThreadTaskRunnerHandle::Get()->PostTask(
711 FROM_HERE, base::Bind(&Job::OnStreamFailedCallback, 710 FROM_HERE, base::Bind(&Job::OnStreamFailedCallback,
712 ptr_factory_.GetWeakPtr(), ERR_FAILED)); 711 ptr_factory_.GetWeakPtr(), ERR_FAILED));
713 } else { 712 } else {
714 base::ThreadTaskRunnerHandle::Get()->PostTask( 713 base::ThreadTaskRunnerHandle::Get()->PostTask(
715 FROM_HERE, base::Bind(&Job::OnBidirectionalStreamJobReadyCallback, 714 FROM_HERE, base::Bind(&Job::OnBidirectionalStreamJobReadyCallback,
716 ptr_factory_.GetWeakPtr())); 715 ptr_factory_.GetWeakPtr()));
717 } 716 }
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after
1008 if (session_->quic_stream_factory()->IsQuicDisabled(destination.port())) 1007 if (session_->quic_stream_factory()->IsQuicDisabled(destination.port()))
1009 return ERR_QUIC_PROTOCOL_ERROR; 1008 return ERR_QUIC_PROTOCOL_ERROR;
1010 } else { 1009 } else {
1011 DCHECK(using_ssl_); 1010 DCHECK(using_ssl_);
1012 // The certificate of a QUIC alternative server is expected to be valid 1011 // The certificate of a QUIC alternative server is expected to be valid
1013 // for the origin of the request (in addition to being valid for the 1012 // for the origin of the request (in addition to being valid for the
1014 // server itself). 1013 // server itself).
1015 destination = server_; 1014 destination = server_;
1016 ssl_config = &server_ssl_config_; 1015 ssl_config = &server_ssl_config_;
1017 } 1016 }
1018
1019 int rv = 1017 int rv =
1020 quic_request_.Request(destination, request_info_.privacy_mode, 1018 quic_request_.Request(destination, request_info_.privacy_mode,
1021 ssl_config->GetCertVerifyFlags(), url, 1019 ssl_config->GetCertVerifyFlags(), url,
1022 request_info_.method, net_log_, io_callback_); 1020 request_info_.method, net_log_, io_callback_);
1023 if (rv == OK) { 1021 if (rv == OK) {
1024 using_existing_quic_session_ = true; 1022 using_existing_quic_session_ = true;
1025 } else { 1023 } else {
1026 // OK, there's no available QUIC session. Let |waiting_job_| resume 1024 // OK, there's no available QUIC session. Let |waiting_job_| resume
1027 // if it's paused. 1025 // if it's paused.
1028 if (waiting_job_) { 1026 if (waiting_job_) {
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
1250 MaybeMarkAlternativeServiceBroken(); 1248 MaybeMarkAlternativeServiceBroken();
1251 return result; 1249 return result;
1252 } 1250 }
1253 1251
1254 if (using_quic_) { 1252 if (using_quic_) {
1255 if (result < 0) { 1253 if (result < 0) {
1256 job_status_ = STATUS_BROKEN; 1254 job_status_ = STATUS_BROKEN;
1257 MaybeMarkAlternativeServiceBroken(); 1255 MaybeMarkAlternativeServiceBroken();
1258 return result; 1256 return result;
1259 } 1257 }
1260 stream_ = quic_request_.ReleaseStream(); 1258 if (stream_type_ == HttpStreamRequest::BIDIRECTIONAL_STREAM) {
1259 #if BUILDFLAG(ENABLE_BIDIRECTIONAL_STREAM)
1260 bidirectional_stream_job_ = quic_request_.ReleaseBidirectionalStreamJob();
1261 #else
1262 NOTREACHED();
1263 #endif
1264 } else {
1265 stream_ = quic_request_.ReleaseStream();
1266 }
1261 next_state_ = STATE_NONE; 1267 next_state_ = STATE_NONE;
1262 return OK; 1268 return OK;
1263 } 1269 }
1264 1270
1265 if (result < 0 && !ssl_started) 1271 if (result < 0 && !ssl_started)
1266 return ReconsiderProxyAfterError(result); 1272 return ReconsiderProxyAfterError(result);
1267 establishing_tunnel_ = false; 1273 establishing_tunnel_ = false;
1268 1274
1269 if (connection_->socket()) { 1275 if (connection_->socket()) {
1270 // We officially have a new connection. Record the type. 1276 // We officially have a new connection. Record the type.
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1307 return ERR_IO_PENDING; 1313 return ERR_IO_PENDING;
1308 } 1314 }
1309 1315
1310 int HttpStreamFactoryImpl::Job::SetSpdyHttpStreamOrBidirectionalStreamJob( 1316 int HttpStreamFactoryImpl::Job::SetSpdyHttpStreamOrBidirectionalStreamJob(
1311 base::WeakPtr<SpdySession> session, 1317 base::WeakPtr<SpdySession> session,
1312 bool direct) { 1318 bool direct) {
1313 // TODO(ricea): Restore the code for WebSockets over SPDY once it's 1319 // TODO(ricea): Restore the code for WebSockets over SPDY once it's
1314 // implemented. 1320 // implemented.
1315 if (stream_factory_->for_websockets_) 1321 if (stream_factory_->for_websockets_)
1316 return ERR_NOT_IMPLEMENTED; 1322 return ERR_NOT_IMPLEMENTED;
1317 if (for_bidirectional_) { 1323 if (stream_type_ == HttpStreamRequest::BIDIRECTIONAL_STREAM) {
1318 #if BUILDFLAG(ENABLE_BIDIRECTIONAL_STREAM) 1324 #if BUILDFLAG(ENABLE_BIDIRECTIONAL_STREAM)
1319 // TODO(xunjieli): Create QUIC's version of BidirectionalStreamJob.
1320 bidirectional_stream_job_.reset(new BidirectionalStreamSpdyJob(session)); 1325 bidirectional_stream_job_.reset(new BidirectionalStreamSpdyJob(session));
1321 return OK; 1326 return OK;
1322 #else 1327 #else
1323 DCHECK(false); 1328 DCHECK(false);
Ryan Hamilton 2016/03/07 20:12:37 nit: this should probably be NOTREACHED();
xunjieli 2016/03/08 15:39:32 Done.
1324 return ERR_FAILED; 1329 return ERR_FAILED;
1325 #endif 1330 #endif
1326 } 1331 }
1327 1332
1328 // TODO(willchan): Delete this code, because eventually, the 1333 // TODO(willchan): Delete this code, because eventually, the
1329 // HttpStreamFactoryImpl will be creating all the SpdyHttpStreams, since it 1334 // HttpStreamFactoryImpl will be creating all the SpdyHttpStreams, since it
1330 // will know when SpdySessions become available. 1335 // will know when SpdySessions become available.
1331 1336
1332 bool use_relative_url = direct || request_info_.url.SchemeIs("https"); 1337 bool use_relative_url = direct || request_info_.url.SchemeIs("https");
1333 stream_.reset(new SpdyHttpStream(session, use_relative_url)); 1338 stream_.reset(new SpdyHttpStream(session, use_relative_url));
(...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after
1798 if (connection_->socket()) { 1803 if (connection_->socket()) {
1799 ConnectionAttempts socket_attempts; 1804 ConnectionAttempts socket_attempts;
1800 connection_->socket()->GetConnectionAttempts(&socket_attempts); 1805 connection_->socket()->GetConnectionAttempts(&socket_attempts);
1801 request_->AddConnectionAttempts(socket_attempts); 1806 request_->AddConnectionAttempts(socket_attempts);
1802 } else { 1807 } else {
1803 request_->AddConnectionAttempts(connection_->connection_attempts()); 1808 request_->AddConnectionAttempts(connection_->connection_attempts());
1804 } 1809 }
1805 } 1810 }
1806 1811
1807 } // namespace net 1812 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698