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

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

Issue 1793273004: Revert of Implement QUIC-based net::BidirectionalStream (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@basecl
Patch Set: 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
« no previous file with comments | « net/http/http_stream_factory_impl_job.h ('k') | net/http/http_stream_factory_impl_request.h » ('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_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 stream_type_(HttpStreamRequest::BIDIRECTIONAL_STREAM), 219 for_bidirectional_(false),
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 |stream_type_|, since request is nulled when job is orphaned. 251 // Saves |for_bidirectional_|, since request is nulled when job is orphaned.
252 stream_type_ = request_->stream_type(); 252 for_bidirectional_ = request_->for_bidirectional();
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 (stream_type_ == HttpStreamRequest::BIDIRECTIONAL_STREAM) { 505 if (for_bidirectional_) {
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
514 } else { 515 } else {
515 DCHECK(stream_); 516 DCHECK(stream_);
516 request_->OnNewSpdySessionReady(this, std::move(stream_), 517 request_->OnNewSpdySessionReady(this, std::move(stream_),
517 /** bidirectional_stream_job=*/nullptr, 518 /** bidirectional_stream_job=*/nullptr,
518 spdy_session, spdy_session_direct_); 519 spdy_session, spdy_session_direct_);
519 } 520 }
520 } 521 }
521 // |this| may be deleted after this call. 522 // |this| may be deleted after this call.
522 } 523 }
523 524
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
696 next_state_ = STATE_DONE; 697 next_state_ = STATE_DONE;
697 if (new_spdy_session_.get()) { 698 if (new_spdy_session_.get()) {
698 base::ThreadTaskRunnerHandle::Get()->PostTask( 699 base::ThreadTaskRunnerHandle::Get()->PostTask(
699 FROM_HERE, base::Bind(&Job::OnNewSpdySessionReadyCallback, 700 FROM_HERE, base::Bind(&Job::OnNewSpdySessionReadyCallback,
700 ptr_factory_.GetWeakPtr())); 701 ptr_factory_.GetWeakPtr()));
701 } else if (stream_factory_->for_websockets_) { 702 } else if (stream_factory_->for_websockets_) {
702 DCHECK(websocket_stream_); 703 DCHECK(websocket_stream_);
703 base::ThreadTaskRunnerHandle::Get()->PostTask( 704 base::ThreadTaskRunnerHandle::Get()->PostTask(
704 FROM_HERE, base::Bind(&Job::OnWebSocketHandshakeStreamReadyCallback, 705 FROM_HERE, base::Bind(&Job::OnWebSocketHandshakeStreamReadyCallback,
705 ptr_factory_.GetWeakPtr())); 706 ptr_factory_.GetWeakPtr()));
706 } else if (stream_type_ == HttpStreamRequest::BIDIRECTIONAL_STREAM) { 707 } else if (for_bidirectional_) {
707 #if BUILDFLAG(ENABLE_BIDIRECTIONAL_STREAM) 708 #if BUILDFLAG(ENABLE_BIDIRECTIONAL_STREAM)
708 if (!bidirectional_stream_job_) { 709 if (!bidirectional_stream_job_) {
709 base::ThreadTaskRunnerHandle::Get()->PostTask( 710 base::ThreadTaskRunnerHandle::Get()->PostTask(
710 FROM_HERE, base::Bind(&Job::OnStreamFailedCallback, 711 FROM_HERE, base::Bind(&Job::OnStreamFailedCallback,
711 ptr_factory_.GetWeakPtr(), ERR_FAILED)); 712 ptr_factory_.GetWeakPtr(), ERR_FAILED));
712 } else { 713 } else {
713 base::ThreadTaskRunnerHandle::Get()->PostTask( 714 base::ThreadTaskRunnerHandle::Get()->PostTask(
714 FROM_HERE, base::Bind(&Job::OnBidirectionalStreamJobReadyCallback, 715 FROM_HERE, base::Bind(&Job::OnBidirectionalStreamJobReadyCallback,
715 ptr_factory_.GetWeakPtr())); 716 ptr_factory_.GetWeakPtr()));
716 } 717 }
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after
1009 if (session_->quic_stream_factory()->IsQuicDisabled(destination.port())) 1010 if (session_->quic_stream_factory()->IsQuicDisabled(destination.port()))
1010 return ERR_QUIC_PROTOCOL_ERROR; 1011 return ERR_QUIC_PROTOCOL_ERROR;
1011 } else { 1012 } else {
1012 DCHECK(using_ssl_); 1013 DCHECK(using_ssl_);
1013 // The certificate of a QUIC alternative server is expected to be valid 1014 // The certificate of a QUIC alternative server is expected to be valid
1014 // for the origin of the request (in addition to being valid for the 1015 // for the origin of the request (in addition to being valid for the
1015 // server itself). 1016 // server itself).
1016 destination = server_; 1017 destination = server_;
1017 ssl_config = &server_ssl_config_; 1018 ssl_config = &server_ssl_config_;
1018 } 1019 }
1020
1019 int rv = 1021 int rv =
1020 quic_request_.Request(destination, request_info_.privacy_mode, 1022 quic_request_.Request(destination, request_info_.privacy_mode,
1021 ssl_config->GetCertVerifyFlags(), url, 1023 ssl_config->GetCertVerifyFlags(), url,
1022 request_info_.method, net_log_, io_callback_); 1024 request_info_.method, net_log_, io_callback_);
1023 if (rv == OK) { 1025 if (rv == OK) {
1024 using_existing_quic_session_ = true; 1026 using_existing_quic_session_ = true;
1025 } else { 1027 } else {
1026 // OK, there's no available QUIC session. Let |waiting_job_| resume 1028 // OK, there's no available QUIC session. Let |waiting_job_| resume
1027 // if it's paused. 1029 // if it's paused.
1028 if (waiting_job_) { 1030 if (waiting_job_) {
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
1250 MaybeMarkAlternativeServiceBroken(); 1252 MaybeMarkAlternativeServiceBroken();
1251 return result; 1253 return result;
1252 } 1254 }
1253 1255
1254 if (using_quic_) { 1256 if (using_quic_) {
1255 if (result < 0) { 1257 if (result < 0) {
1256 job_status_ = STATUS_BROKEN; 1258 job_status_ = STATUS_BROKEN;
1257 MaybeMarkAlternativeServiceBroken(); 1259 MaybeMarkAlternativeServiceBroken();
1258 return result; 1260 return result;
1259 } 1261 }
1260 if (stream_type_ == HttpStreamRequest::BIDIRECTIONAL_STREAM) { 1262 stream_ = quic_request_.ReleaseStream();
1261 #if BUILDFLAG(ENABLE_BIDIRECTIONAL_STREAM)
1262 bidirectional_stream_job_ = quic_request_.CreateBidirectionalStreamJob();
1263 if (!bidirectional_stream_job_) {
1264 // Quic session is closed before stream can be created.
1265 return ERR_CONNECTION_CLOSED;
1266 }
1267 #else
1268 NOTREACHED();
1269 #endif
1270 } else {
1271 stream_ = quic_request_.CreateStream();
1272 if (!stream_) {
1273 // Quic session is closed before stream can be created.
1274 return ERR_CONNECTION_CLOSED;
1275 }
1276 }
1277 next_state_ = STATE_NONE; 1263 next_state_ = STATE_NONE;
1278 return OK; 1264 return OK;
1279 } 1265 }
1280 1266
1281 if (result < 0 && !ssl_started) 1267 if (result < 0 && !ssl_started)
1282 return ReconsiderProxyAfterError(result); 1268 return ReconsiderProxyAfterError(result);
1283 establishing_tunnel_ = false; 1269 establishing_tunnel_ = false;
1284 1270
1285 if (connection_->socket()) { 1271 if (connection_->socket()) {
1286 // We officially have a new connection. Record the type. 1272 // We officially have a new connection. Record the type.
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1323 return ERR_IO_PENDING; 1309 return ERR_IO_PENDING;
1324 } 1310 }
1325 1311
1326 int HttpStreamFactoryImpl::Job::SetSpdyHttpStreamOrBidirectionalStreamJob( 1312 int HttpStreamFactoryImpl::Job::SetSpdyHttpStreamOrBidirectionalStreamJob(
1327 base::WeakPtr<SpdySession> session, 1313 base::WeakPtr<SpdySession> session,
1328 bool direct) { 1314 bool direct) {
1329 // TODO(ricea): Restore the code for WebSockets over SPDY once it's 1315 // TODO(ricea): Restore the code for WebSockets over SPDY once it's
1330 // implemented. 1316 // implemented.
1331 if (stream_factory_->for_websockets_) 1317 if (stream_factory_->for_websockets_)
1332 return ERR_NOT_IMPLEMENTED; 1318 return ERR_NOT_IMPLEMENTED;
1333 if (stream_type_ == HttpStreamRequest::BIDIRECTIONAL_STREAM) { 1319 if (for_bidirectional_) {
1334 #if BUILDFLAG(ENABLE_BIDIRECTIONAL_STREAM) 1320 #if BUILDFLAG(ENABLE_BIDIRECTIONAL_STREAM)
1321 // TODO(xunjieli): Create QUIC's version of BidirectionalStreamJob.
1335 bidirectional_stream_job_.reset(new BidirectionalStreamSpdyJob(session)); 1322 bidirectional_stream_job_.reset(new BidirectionalStreamSpdyJob(session));
1336 return OK; 1323 return OK;
1337 #else 1324 #else
1338 NOTREACHED(); 1325 DCHECK(false);
1339 return ERR_FAILED; 1326 return ERR_FAILED;
1340 #endif 1327 #endif
1341 } 1328 }
1342 1329
1343 // TODO(willchan): Delete this code, because eventually, the 1330 // TODO(willchan): Delete this code, because eventually, the
1344 // HttpStreamFactoryImpl will be creating all the SpdyHttpStreams, since it 1331 // HttpStreamFactoryImpl will be creating all the SpdyHttpStreams, since it
1345 // will know when SpdySessions become available. 1332 // will know when SpdySessions become available.
1346 1333
1347 bool use_relative_url = direct || request_info_.url.SchemeIs("https"); 1334 bool use_relative_url = direct || request_info_.url.SchemeIs("https");
1348 stream_.reset(new SpdyHttpStream(session, use_relative_url)); 1335 stream_.reset(new SpdyHttpStream(session, use_relative_url));
(...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after
1816 if (connection_->socket()) { 1803 if (connection_->socket()) {
1817 ConnectionAttempts socket_attempts; 1804 ConnectionAttempts socket_attempts;
1818 connection_->socket()->GetConnectionAttempts(&socket_attempts); 1805 connection_->socket()->GetConnectionAttempts(&socket_attempts);
1819 request_->AddConnectionAttempts(socket_attempts); 1806 request_->AddConnectionAttempts(socket_attempts);
1820 } else { 1807 } else {
1821 request_->AddConnectionAttempts(connection_->connection_attempts()); 1808 request_->AddConnectionAttempts(connection_->connection_attempts());
1822 } 1809 }
1823 } 1810 }
1824 1811
1825 } // namespace net 1812 } // namespace net
OLDNEW
« no previous file with comments | « net/http/http_stream_factory_impl_job.h ('k') | net/http/http_stream_factory_impl_request.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698