Chromium Code Reviews| 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_stream_factory_impl_job.h" | 5 #include "net/http/http_stream_factory_impl_job.h" |
| 6 | 6 |
| 7 #include <string> | |
| 8 | |
| 7 #include "base/bind.h" | 9 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| 9 #include "base/logging.h" | 11 #include "base/logging.h" |
| 10 #include "base/stl_util.h" | 12 #include "base/stl_util.h" |
| 11 #include "base/string_util.h" | 13 #include "base/string_util.h" |
| 12 #include "base/stringprintf.h" | 14 #include "base/stringprintf.h" |
| 13 #include "base/values.h" | 15 #include "base/values.h" |
| 14 #include "build/build_config.h" | 16 #include "build/build_config.h" |
| 15 #include "net/base/connection_type_histograms.h" | 17 #include "net/base/connection_type_histograms.h" |
| 16 #include "net/base/net_log.h" | 18 #include "net/base/net_log.h" |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 274 // https (the normal case) or if we're connection to a SPDY proxy, or | 276 // https (the normal case) or if we're connection to a SPDY proxy, or |
| 275 // if we're running with force_spdy_always_. crbug.com/133176 | 277 // if we're running with force_spdy_always_. crbug.com/133176 |
| 276 return request_info_.url.SchemeIs("https") || | 278 return request_info_.url.SchemeIs("https") || |
| 277 proxy_info_.proxy_server().is_https() || | 279 proxy_info_.proxy_server().is_https() || |
| 278 force_spdy_always_; | 280 force_spdy_always_; |
| 279 } | 281 } |
| 280 | 282 |
| 281 void HttpStreamFactoryImpl::Job::OnStreamReadyCallback() { | 283 void HttpStreamFactoryImpl::Job::OnStreamReadyCallback() { |
| 282 DCHECK(stream_.get()); | 284 DCHECK(stream_.get()); |
| 283 DCHECK(!IsPreconnecting()); | 285 DCHECK(!IsPreconnecting()); |
| 286 DCHECK(!stream_factory_->for_websocket_); | |
| 284 if (IsOrphaned()) { | 287 if (IsOrphaned()) { |
| 285 stream_factory_->OnOrphanedJobComplete(this); | 288 stream_factory_->OnOrphanedJobComplete(this); |
| 286 } else { | 289 } else { |
| 287 request_->Complete(was_npn_negotiated(), | 290 request_->Complete(was_npn_negotiated(), |
| 288 protocol_negotiated(), | 291 protocol_negotiated(), |
| 289 using_spdy(), | 292 using_spdy(), |
| 290 net_log_); | 293 net_log_); |
| 291 request_->OnStreamReady(this, server_ssl_config_, proxy_info_, | 294 request_->OnStreamReady(this, server_ssl_config_, proxy_info_, |
| 292 stream_.release()); | 295 stream_.release()); |
| 293 } | 296 } |
| 294 // |this| may be deleted after this call. | 297 // |this| may be deleted after this call. |
| 295 } | 298 } |
| 296 | 299 |
| 297 void HttpStreamFactoryImpl::Job::OnSpdySessionReadyCallback() { | 300 void HttpStreamFactoryImpl::Job::OnWebSocketStreamReadyCallback() { |
| 301 DCHECK(!IsPreconnecting()); | |
| 302 DCHECK(stream_factory_->for_websocket_); | |
| 303 DCHECK(websocket_stream_); | |
| 304 if (IsOrphaned()) { | |
| 305 stream_factory_->OnOrphanedJobComplete(this); | |
| 306 } else { | |
| 307 request_->Complete(was_npn_negotiated(), | |
| 308 protocol_negotiated(), | |
| 309 using_spdy(), | |
| 310 net_log_); | |
| 311 request_->OnWebSocketStreamReady(this, | |
| 312 server_ssl_config_, | |
| 313 proxy_info_, | |
| 314 websocket_stream_.release()); | |
| 315 } | |
| 316 // |this| may be deleted after this call. | |
| 317 } | |
| 318 | |
| 319 void HttpStreamFactoryImpl::Job::OnNewSpdySessionReadyCallback() { | |
| 298 DCHECK(!stream_.get()); | 320 DCHECK(!stream_.get()); |
| 299 DCHECK(!IsPreconnecting()); | 321 DCHECK(!IsPreconnecting()); |
| 300 DCHECK(using_spdy()); | 322 DCHECK(using_spdy()); |
| 301 DCHECK(new_spdy_session_); | 323 DCHECK(new_spdy_session_); |
| 302 scoped_refptr<SpdySession> spdy_session = new_spdy_session_; | 324 scoped_refptr<SpdySession> spdy_session = new_spdy_session_; |
| 303 new_spdy_session_ = NULL; | 325 new_spdy_session_ = NULL; |
| 304 if (IsOrphaned()) { | 326 if (IsOrphaned()) { |
| 305 stream_factory_->OnSpdySessionReady( | 327 stream_factory_->OnNewSpdySessionReady( |
| 306 spdy_session, spdy_session_direct_, server_ssl_config_, proxy_info_, | 328 spdy_session, spdy_session_direct_, server_ssl_config_, proxy_info_, |
| 307 was_npn_negotiated(), protocol_negotiated(), using_spdy(), net_log_); | 329 was_npn_negotiated(), protocol_negotiated(), using_spdy(), net_log_); |
| 308 stream_factory_->OnOrphanedJobComplete(this); | 330 stream_factory_->OnOrphanedJobComplete(this); |
| 309 } else { | 331 } else { |
| 310 request_->OnSpdySessionReady(this, spdy_session, spdy_session_direct_); | 332 request_->OnNewSpdySessionReady(this, spdy_session, spdy_session_direct_); |
| 311 } | 333 } |
| 312 // |this| may be deleted after this call. | 334 // |this| may be deleted after this call. |
| 313 } | 335 } |
| 314 | 336 |
| 315 void HttpStreamFactoryImpl::Job::OnStreamFailedCallback(int result) { | 337 void HttpStreamFactoryImpl::Job::OnStreamFailedCallback(int result) { |
| 316 DCHECK(!IsPreconnecting()); | 338 DCHECK(!IsPreconnecting()); |
| 317 if (IsOrphaned()) | 339 if (IsOrphaned()) |
| 318 stream_factory_->OnOrphanedJobComplete(this); | 340 stream_factory_->OnOrphanedJobComplete(this); |
| 319 else | 341 else |
| 320 request_->OnStreamFailed(this, result, server_ssl_config_); | 342 request_->OnStreamFailed(this, result, server_ssl_config_); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 361 stream_factory_->OnOrphanedJobComplete(this); | 383 stream_factory_->OnOrphanedJobComplete(this); |
| 362 else | 384 else |
| 363 request_->OnHttpsProxyTunnelResponse( | 385 request_->OnHttpsProxyTunnelResponse( |
| 364 this, response_info, server_ssl_config_, proxy_info_, stream); | 386 this, response_info, server_ssl_config_, proxy_info_, stream); |
| 365 // |this| may be deleted after this call. | 387 // |this| may be deleted after this call. |
| 366 } | 388 } |
| 367 | 389 |
| 368 void HttpStreamFactoryImpl::Job::OnPreconnectsComplete() { | 390 void HttpStreamFactoryImpl::Job::OnPreconnectsComplete() { |
| 369 DCHECK(!request_); | 391 DCHECK(!request_); |
| 370 if (new_spdy_session_) { | 392 if (new_spdy_session_) { |
| 371 stream_factory_->OnSpdySessionReady( | 393 stream_factory_->OnNewSpdySessionReady( |
| 372 new_spdy_session_, spdy_session_direct_, server_ssl_config_, | 394 new_spdy_session_, spdy_session_direct_, server_ssl_config_, |
| 373 proxy_info_, was_npn_negotiated(), protocol_negotiated(), using_spdy(), | 395 proxy_info_, was_npn_negotiated(), protocol_negotiated(), using_spdy(), |
| 374 net_log_); | 396 net_log_); |
| 375 } | 397 } |
| 376 stream_factory_->OnPreconnectsComplete(this); | 398 stream_factory_->OnPreconnectsComplete(this); |
| 377 // |this| may be deleted after this call. | 399 // |this| may be deleted after this call. |
| 378 } | 400 } |
| 379 | 401 |
| 380 // static | 402 // static |
| 381 int HttpStreamFactoryImpl::Job::OnHostResolution( | 403 int HttpStreamFactoryImpl::Job::OnHostResolution( |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 437 | 459 |
| 438 ProxyClientSocket* proxy_socket = | 460 ProxyClientSocket* proxy_socket = |
| 439 static_cast<ProxyClientSocket*>(connection_->socket()); | 461 static_cast<ProxyClientSocket*>(connection_->socket()); |
| 440 const HttpResponseInfo* tunnel_auth_response = | 462 const HttpResponseInfo* tunnel_auth_response = |
| 441 proxy_socket->GetConnectResponseInfo(); | 463 proxy_socket->GetConnectResponseInfo(); |
| 442 | 464 |
| 443 next_state_ = STATE_WAITING_USER_ACTION; | 465 next_state_ = STATE_WAITING_USER_ACTION; |
| 444 base::MessageLoop::current()->PostTask( | 466 base::MessageLoop::current()->PostTask( |
| 445 FROM_HERE, | 467 FROM_HERE, |
| 446 base::Bind( | 468 base::Bind( |
| 447 &HttpStreamFactoryImpl::Job::OnNeedsProxyAuthCallback, | 469 &Job::OnNeedsProxyAuthCallback, |
| 448 ptr_factory_.GetWeakPtr(), | 470 ptr_factory_.GetWeakPtr(), |
| 449 *tunnel_auth_response, | 471 *tunnel_auth_response, |
| 450 proxy_socket->GetAuthController())); | 472 proxy_socket->GetAuthController())); |
| 451 } | 473 } |
| 452 return ERR_IO_PENDING; | 474 return ERR_IO_PENDING; |
| 453 | 475 |
| 454 case ERR_SSL_CLIENT_AUTH_CERT_NEEDED: | 476 case ERR_SSL_CLIENT_AUTH_CERT_NEEDED: |
| 455 base::MessageLoop::current()->PostTask( | 477 base::MessageLoop::current()->PostTask( |
| 456 FROM_HERE, | 478 FROM_HERE, |
| 457 base::Bind( | 479 base::Bind( |
| 458 &HttpStreamFactoryImpl::Job::OnNeedsClientAuthCallback, | 480 &Job::OnNeedsClientAuthCallback, |
| 459 ptr_factory_.GetWeakPtr(), | 481 ptr_factory_.GetWeakPtr(), |
| 460 connection_->ssl_error_response_info().cert_request_info)); | 482 connection_->ssl_error_response_info().cert_request_info)); |
| 461 return ERR_IO_PENDING; | 483 return ERR_IO_PENDING; |
| 462 | 484 |
| 463 case ERR_HTTPS_PROXY_TUNNEL_RESPONSE: | 485 case ERR_HTTPS_PROXY_TUNNEL_RESPONSE: |
| 464 { | 486 { |
| 465 DCHECK(connection_.get()); | 487 DCHECK(connection_.get()); |
| 466 DCHECK(connection_->socket()); | 488 DCHECK(connection_->socket()); |
| 467 DCHECK(establishing_tunnel_); | 489 DCHECK(establishing_tunnel_); |
| 468 | 490 |
| 469 ProxyClientSocket* proxy_socket = | 491 ProxyClientSocket* proxy_socket = |
| 470 static_cast<ProxyClientSocket*>(connection_->socket()); | 492 static_cast<ProxyClientSocket*>(connection_->socket()); |
| 471 base::MessageLoop::current()->PostTask( | 493 base::MessageLoop::current()->PostTask( |
| 472 FROM_HERE, | 494 FROM_HERE, |
| 473 base::Bind( | 495 base::Bind( |
| 474 &HttpStreamFactoryImpl::Job::OnHttpsProxyTunnelResponseCallback, | 496 &Job::OnHttpsProxyTunnelResponseCallback, |
| 475 ptr_factory_.GetWeakPtr(), | 497 ptr_factory_.GetWeakPtr(), |
| 476 *proxy_socket->GetConnectResponseInfo(), | 498 *proxy_socket->GetConnectResponseInfo(), |
| 477 proxy_socket->CreateConnectResponseStream())); | 499 proxy_socket->CreateConnectResponseStream())); |
| 478 return ERR_IO_PENDING; | 500 return ERR_IO_PENDING; |
| 479 } | 501 } |
| 480 | 502 |
| 481 case OK: | 503 case OK: |
| 482 next_state_ = STATE_DONE; | 504 next_state_ = STATE_DONE; |
| 483 if (new_spdy_session_) { | 505 if (new_spdy_session_) { |
| 484 base::MessageLoop::current()->PostTask( | 506 base::MessageLoop::current()->PostTask( |
| 485 FROM_HERE, | 507 FROM_HERE, |
| 486 base::Bind( | 508 base::Bind( |
| 487 &HttpStreamFactoryImpl::Job::OnSpdySessionReadyCallback, | 509 &Job::OnNewSpdySessionReadyCallback, |
| 488 ptr_factory_.GetWeakPtr())); | 510 ptr_factory_.GetWeakPtr())); |
| 511 } else if (stream_factory_->for_websocket_) { | |
| 512 if (websocket_stream_) { | |
| 513 MessageLoop::current()->PostTask( | |
| 514 FROM_HERE, | |
| 515 base::Bind( | |
| 516 &Job::OnWebSocketStreamReadyCallback, | |
| 517 ptr_factory_.GetWeakPtr())); | |
| 518 } else { | |
| 519 base::MessageLoop::current()->PostTask( | |
| 520 FROM_HERE, | |
| 521 base::Bind( | |
| 522 &Job::OnStreamFailedCallback, | |
| 523 ptr_factory_.GetWeakPtr(), | |
| 524 result)); | |
|
mmenke
2013/05/24 14:53:22
Calling OnStreamFailedCallback with a result of OK
mmenke
2013/05/24 16:44:43
On second thought, perhaps just a DCHECK instead o
yhirano
2013/05/27 09:21:32
Done.
| |
| 525 return ERR_IO_PENDING; | |
| 526 } | |
| 489 } else { | 527 } else { |
| 490 base::MessageLoop::current()->PostTask( | 528 base::MessageLoop::current()->PostTask( |
| 491 FROM_HERE, | 529 FROM_HERE, |
| 492 base::Bind( | 530 base::Bind( |
| 493 &HttpStreamFactoryImpl::Job::OnStreamReadyCallback, | 531 &Job::OnStreamReadyCallback, |
| 494 ptr_factory_.GetWeakPtr())); | 532 ptr_factory_.GetWeakPtr())); |
| 495 } | 533 } |
| 496 return ERR_IO_PENDING; | 534 return ERR_IO_PENDING; |
| 497 | 535 |
| 498 default: | 536 default: |
| 499 base::MessageLoop::current()->PostTask( | 537 base::MessageLoop::current()->PostTask( |
| 500 FROM_HERE, | 538 FROM_HERE, |
| 501 base::Bind( | 539 base::Bind( |
| 502 &HttpStreamFactoryImpl::Job::OnStreamFailedCallback, | 540 &Job::OnStreamFailedCallback, |
| 503 ptr_factory_.GetWeakPtr(), | 541 ptr_factory_.GetWeakPtr(), |
| 504 result)); | 542 result)); |
| 505 return ERR_IO_PENDING; | 543 return ERR_IO_PENDING; |
| 506 } | 544 } |
| 507 return result; | 545 return result; |
| 508 } | 546 } |
| 509 | 547 |
| 510 int HttpStreamFactoryImpl::Job::DoLoop(int result) { | 548 int HttpStreamFactoryImpl::Job::DoLoop(int result) { |
| 511 DCHECK_NE(next_state_, STATE_NONE); | 549 DCHECK_NE(next_state_, STATE_NONE); |
| 512 int rv = result; | 550 int rv = result; |
| (...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 785 request_info_.privacy_mode, | 823 request_info_.privacy_mode, |
| 786 net_log_, | 824 net_log_, |
| 787 num_streams_); | 825 num_streams_); |
| 788 } else { | 826 } else { |
| 789 // If we can't use a SPDY session, don't both checking for one after | 827 // If we can't use a SPDY session, don't both checking for one after |
| 790 // the hostname is resolved. | 828 // the hostname is resolved. |
| 791 OnHostResolutionCallback resolution_callback = CanUseExistingSpdySession() ? | 829 OnHostResolutionCallback resolution_callback = CanUseExistingSpdySession() ? |
| 792 base::Bind(&Job::OnHostResolution, session_->spdy_session_pool(), | 830 base::Bind(&Job::OnHostResolution, session_->spdy_session_pool(), |
| 793 GetSpdySessionKey()) : | 831 GetSpdySessionKey()) : |
| 794 OnHostResolutionCallback(); | 832 OnHostResolutionCallback(); |
| 795 return InitSocketHandleForHttpRequest( | 833 return InitSocketHandleForHttpRequest( |
|
mmenke
2013/05/24 14:53:22
This currently always uses the HttpNetworkSession'
yhirano
2013/05/27 09:21:32
Yes, I will do that in another CL.
| |
| 796 origin_url_, request_info_.extra_headers, request_info_.load_flags, | 834 origin_url_, request_info_.extra_headers, request_info_.load_flags, |
| 797 priority_, session_, proxy_info_, ShouldForceSpdySSL(), | 835 priority_, session_, proxy_info_, ShouldForceSpdySSL(), |
| 798 want_spdy_over_npn, server_ssl_config_, proxy_ssl_config_, | 836 want_spdy_over_npn, server_ssl_config_, proxy_ssl_config_, |
| 799 request_info_.privacy_mode, net_log_, | 837 request_info_.privacy_mode, net_log_, |
| 800 connection_.get(), resolution_callback, io_callback_); | 838 connection_.get(), resolution_callback, io_callback_); |
| 801 } | 839 } |
| 802 } | 840 } |
| 803 | 841 |
| 804 int HttpStreamFactoryImpl::Job::DoInitConnectionComplete(int result) { | 842 int HttpStreamFactoryImpl::Job::DoInitConnectionComplete(int result) { |
| 805 if (IsPreconnecting()) { | 843 if (IsPreconnecting()) { |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 854 if (ssl_socket->WasNpnNegotiated()) { | 892 if (ssl_socket->WasNpnNegotiated()) { |
| 855 was_npn_negotiated_ = true; | 893 was_npn_negotiated_ = true; |
| 856 std::string proto; | 894 std::string proto; |
| 857 std::string server_protos; | 895 std::string server_protos; |
| 858 SSLClientSocket::NextProtoStatus status = | 896 SSLClientSocket::NextProtoStatus status = |
| 859 ssl_socket->GetNextProto(&proto, &server_protos); | 897 ssl_socket->GetNextProto(&proto, &server_protos); |
| 860 NextProto protocol_negotiated = | 898 NextProto protocol_negotiated = |
| 861 SSLClientSocket::NextProtoFromString(proto); | 899 SSLClientSocket::NextProtoFromString(proto); |
| 862 protocol_negotiated_ = protocol_negotiated; | 900 protocol_negotiated_ = protocol_negotiated; |
| 863 net_log_.AddEvent( | 901 net_log_.AddEvent( |
| 864 NetLog::TYPE_HTTP_STREAM_REQUEST_PROTO, | 902 NetLog::TYPE_HTTP_STREAM_REQUEST_PROTO, |
| 865 base::Bind(&NetLogHttpStreamProtoCallback, | 903 base::Bind(&NetLogHttpStreamProtoCallback, |
| 866 status, &proto, &server_protos)); | 904 status, &proto, &server_protos)); |
| 867 if (ssl_socket->was_spdy_negotiated()) | 905 if (ssl_socket->was_spdy_negotiated()) |
| 868 SwitchToSpdyMode(); | 906 SwitchToSpdyMode(); |
| 869 } | 907 } |
| 870 if (ShouldForceSpdySSL()) | 908 if (ShouldForceSpdySSL()) |
| 871 SwitchToSpdyMode(); | 909 SwitchToSpdyMode(); |
| 872 } else if (proxy_info_.is_https() && connection_->socket() && | 910 } else if (proxy_info_.is_https() && connection_->socket() && |
| 873 result == OK) { | 911 result == OK) { |
| 874 ProxyClientSocket* proxy_socket = | 912 ProxyClientSocket* proxy_socket = |
| 875 static_cast<ProxyClientSocket*>(connection_->socket()); | 913 static_cast<ProxyClientSocket*>(connection_->socket()); |
| 876 if (proxy_socket->IsUsingSpdy()) { | 914 if (proxy_socket->IsUsingSpdy()) { |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 972 if (connection_->socket() && !connection_->is_reused()) | 1010 if (connection_->socket() && !connection_->is_reused()) |
| 973 SetSocketMotivation(); | 1011 SetSocketMotivation(); |
| 974 | 1012 |
| 975 if (!using_spdy_) { | 1013 if (!using_spdy_) { |
| 976 // We may get ftp scheme when fetching ftp resources through proxy. | 1014 // We may get ftp scheme when fetching ftp resources through proxy. |
| 977 bool using_proxy = (proxy_info_.is_http() || proxy_info_.is_https()) && | 1015 bool using_proxy = (proxy_info_.is_http() || proxy_info_.is_https()) && |
| 978 (request_info_.url.SchemeIs("http") || | 1016 (request_info_.url.SchemeIs("http") || |
| 979 request_info_.url.SchemeIs("ftp")); | 1017 request_info_.url.SchemeIs("ftp")); |
| 980 if (stream_factory_->http_pipelined_host_pool_. | 1018 if (stream_factory_->http_pipelined_host_pool_. |
| 981 IsExistingPipelineAvailableForKey(*http_pipelining_key_.get())) { | 1019 IsExistingPipelineAvailableForKey(*http_pipelining_key_.get())) { |
| 1020 DCHECK(!stream_factory_->for_websocket_); | |
| 982 stream_.reset(stream_factory_->http_pipelined_host_pool_. | 1021 stream_.reset(stream_factory_->http_pipelined_host_pool_. |
| 983 CreateStreamOnExistingPipeline( | 1022 CreateStreamOnExistingPipeline( |
| 984 *http_pipelining_key_.get())); | 1023 *http_pipelining_key_.get())); |
| 985 CHECK(stream_.get()); | 1024 CHECK(stream_.get()); |
| 1025 } else if (stream_factory_->for_websocket_) { | |
| 1026 DCHECK(request_ && request_->websocket_stream_factory()); | |
| 1027 websocket_stream_.reset( | |
| 1028 request_->websocket_stream_factory()->CreateBasicStream( | |
| 1029 connection_.release(), using_proxy)); | |
| 986 } else if (!using_proxy && IsRequestEligibleForPipelining()) { | 1030 } else if (!using_proxy && IsRequestEligibleForPipelining()) { |
| 987 // TODO(simonjam): Support proxies. | 1031 // TODO(simonjam): Support proxies. |
| 988 stream_.reset( | 1032 stream_.reset( |
| 989 stream_factory_->http_pipelined_host_pool_.CreateStreamOnNewPipeline( | 1033 stream_factory_->http_pipelined_host_pool_.CreateStreamOnNewPipeline( |
| 990 *http_pipelining_key_.get(), | 1034 *http_pipelining_key_.get(), |
| 991 connection_.release(), | 1035 connection_.release(), |
| 992 server_ssl_config_, | 1036 server_ssl_config_, |
| 993 proxy_info_, | 1037 proxy_info_, |
| 994 net_log_, | 1038 net_log_, |
| 995 was_npn_negotiated_, | 1039 was_npn_negotiated_, |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1044 } | 1088 } |
| 1045 } | 1089 } |
| 1046 | 1090 |
| 1047 if (spdy_session->IsClosed()) | 1091 if (spdy_session->IsClosed()) |
| 1048 return ERR_CONNECTION_CLOSED; | 1092 return ERR_CONNECTION_CLOSED; |
| 1049 | 1093 |
| 1050 // TODO(willchan): Delete this code, because eventually, the | 1094 // TODO(willchan): Delete this code, because eventually, the |
| 1051 // HttpStreamFactoryImpl will be creating all the SpdyHttpStreams, since it | 1095 // HttpStreamFactoryImpl will be creating all the SpdyHttpStreams, since it |
| 1052 // will know when SpdySessions become available. | 1096 // will know when SpdySessions become available. |
| 1053 | 1097 |
| 1054 bool use_relative_url = direct || request_info_.url.SchemeIs("https"); | 1098 if (stream_factory_->for_websocket_) { |
| 1055 stream_.reset(new SpdyHttpStream(spdy_session, use_relative_url)); | 1099 bool use_relative_url = direct || request_info_.url.SchemeIs("wss"); |
| 1100 websocket_stream_.reset( | |
| 1101 request_->websocket_stream_factory()->CreateSpdyStream( | |
| 1102 spdy_session, use_relative_url)); | |
| 1103 } else { | |
| 1104 bool use_relative_url = direct || request_info_.url.SchemeIs("https"); | |
| 1105 stream_.reset(new SpdyHttpStream(spdy_session, use_relative_url)); | |
| 1106 } | |
| 1056 return OK; | 1107 return OK; |
| 1057 } | 1108 } |
| 1058 | 1109 |
| 1059 int HttpStreamFactoryImpl::Job::DoCreateStreamComplete(int result) { | 1110 int HttpStreamFactoryImpl::Job::DoCreateStreamComplete(int result) { |
| 1060 if (result < 0) | 1111 if (result < 0) |
| 1061 return result; | 1112 return result; |
| 1062 | 1113 |
| 1063 session_->proxy_service()->ReportSuccess(proxy_info_); | 1114 session_->proxy_service()->ReportSuccess(proxy_info_); |
| 1064 next_state_ = STATE_NONE; | 1115 next_state_ = STATE_NONE; |
| 1065 return OK; | 1116 return OK; |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1346 } | 1397 } |
| 1347 | 1398 |
| 1348 bool HttpStreamFactoryImpl::Job::IsOrphaned() const { | 1399 bool HttpStreamFactoryImpl::Job::IsOrphaned() const { |
| 1349 return !IsPreconnecting() && !request_; | 1400 return !IsPreconnecting() && !request_; |
| 1350 } | 1401 } |
| 1351 | 1402 |
| 1352 bool HttpStreamFactoryImpl::Job::IsRequestEligibleForPipelining() { | 1403 bool HttpStreamFactoryImpl::Job::IsRequestEligibleForPipelining() { |
| 1353 if (IsPreconnecting() || !request_) { | 1404 if (IsPreconnecting() || !request_) { |
| 1354 return false; | 1405 return false; |
| 1355 } | 1406 } |
| 1407 if (stream_factory_->for_websocket_) { | |
| 1408 return false; | |
| 1409 } | |
| 1356 if (session_->force_http_pipelining()) { | 1410 if (session_->force_http_pipelining()) { |
| 1357 return true; | 1411 return true; |
| 1358 } | 1412 } |
| 1359 if (!session_->params().http_pipelining_enabled) { | 1413 if (!session_->params().http_pipelining_enabled) { |
| 1360 return false; | 1414 return false; |
| 1361 } | 1415 } |
| 1362 if (using_ssl_) { | 1416 if (using_ssl_) { |
| 1363 return false; | 1417 return false; |
| 1364 } | 1418 } |
| 1365 if (request_info_.method != "GET" && request_info_.method != "HEAD") { | 1419 if (request_info_.method != "GET" && request_info_.method != "HEAD") { |
| 1366 return false; | 1420 return false; |
| 1367 } | 1421 } |
| 1368 if (request_info_.load_flags & | 1422 if (request_info_.load_flags & |
| 1369 (net::LOAD_MAIN_FRAME | net::LOAD_SUB_FRAME | net::LOAD_PREFETCH | | 1423 (net::LOAD_MAIN_FRAME | net::LOAD_SUB_FRAME | net::LOAD_PREFETCH | |
| 1370 net::LOAD_IS_DOWNLOAD)) { | 1424 net::LOAD_IS_DOWNLOAD)) { |
| 1371 // Avoid pipelining resources that may be streamed for a long time. | 1425 // Avoid pipelining resources that may be streamed for a long time. |
| 1372 return false; | 1426 return false; |
| 1373 } | 1427 } |
| 1374 return stream_factory_->http_pipelined_host_pool_.IsKeyEligibleForPipelining( | 1428 return stream_factory_->http_pipelined_host_pool_.IsKeyEligibleForPipelining( |
| 1375 *http_pipelining_key_.get()); | 1429 *http_pipelining_key_.get()); |
| 1376 } | 1430 } |
| 1377 | 1431 |
| 1378 } // namespace net | 1432 } // namespace net |
| OLD | NEW |