Index: net/http/http_stream_factory_impl.cc |
diff --git a/net/http/http_stream_factory_impl.cc b/net/http/http_stream_factory_impl.cc |
index d86c690ef48ee8e272a28f334d823298a96cbefb..39a9b2e6f755b4ea8e0af48451eed76d45e9fc1c 100644 |
--- a/net/http/http_stream_factory_impl.cc |
+++ b/net/http/http_stream_factory_impl.cc |
@@ -4,6 +4,8 @@ |
#include "net/http/http_stream_factory_impl.h" |
+#include <string> |
+ |
#include "base/string_number_conversions.h" |
#include "base/stl_util.h" |
#include "googleurl/src/gurl.h" |
@@ -16,6 +18,7 @@ |
#include "net/http/http_server_properties.h" |
#include "net/http/http_stream_factory_impl_job.h" |
#include "net/http/http_stream_factory_impl_request.h" |
+#include "net/socket/client_socket_pool_manager.h" |
#include "net/spdy/spdy_http_stream.h" |
namespace net { |
@@ -39,11 +42,13 @@ GURL UpgradeUrlToHttps(const GURL& original_url, int port) { |
} // namespace |
-HttpStreamFactoryImpl::HttpStreamFactoryImpl(HttpNetworkSession* session) |
+HttpStreamFactoryImpl::HttpStreamFactoryImpl(HttpNetworkSession* session, |
+ bool for_websockets) |
: session_(session), |
http_pipelined_host_pool_(this, NULL, |
session_->http_server_properties(), |
- session_->force_http_pipelining()) {} |
+ session_->force_http_pipelining()), |
+ for_websockets_(for_websockets) {} |
HttpStreamFactoryImpl::~HttpStreamFactoryImpl() { |
DCHECK(request_map_.empty()); |
@@ -68,7 +73,48 @@ HttpStreamRequest* HttpStreamFactoryImpl::RequestStream( |
const SSLConfig& proxy_ssl_config, |
HttpStreamRequest::Delegate* delegate, |
const BoundNetLog& net_log) { |
- Request* request = new Request(request_info.url, this, delegate, net_log); |
+ DCHECK(!for_websockets_); |
+ return RequestStreamInternal(request_info, |
+ priority, |
+ server_ssl_config, |
+ proxy_ssl_config, |
+ delegate, |
+ NULL, |
+ net_log); |
+} |
+ |
+HttpStreamRequest* HttpStreamFactoryImpl::RequestWebSocketStream( |
+ const HttpRequestInfo& request_info, |
+ RequestPriority priority, |
+ const SSLConfig& server_ssl_config, |
+ const SSLConfig& proxy_ssl_config, |
+ HttpStreamRequest::Delegate* delegate, |
+ WebSocketStreamBase::Factory* factory, |
+ const BoundNetLog& net_log) { |
+ DCHECK(for_websockets_); |
+ return RequestStreamInternal(request_info, |
+ priority, |
+ server_ssl_config, |
+ proxy_ssl_config, |
+ delegate, |
+ factory, |
+ net_log); |
+} |
+ |
+HttpStreamRequest* HttpStreamFactoryImpl::RequestStreamInternal( |
+ const HttpRequestInfo& request_info, |
+ RequestPriority priority, |
+ const SSLConfig& server_ssl_config, |
+ const SSLConfig& proxy_ssl_config, |
+ HttpStreamRequest::Delegate* delegate, |
+ WebSocketStreamBase::Factory* websocket_stream_factory, |
+ const BoundNetLog& net_log) { |
+ Request* request = |
+ new Request(request_info.url, |
+ this, |
+ delegate, |
+ websocket_stream_factory, |
+ net_log); |
GURL alternate_url; |
PortAlternateProtocolPair alternate = |
@@ -113,6 +159,7 @@ void HttpStreamFactoryImpl::PreconnectStreams( |
RequestPriority priority, |
const SSLConfig& server_ssl_config, |
const SSLConfig& proxy_ssl_config) { |
+ DCHECK(!for_websockets_); |
GURL alternate_url; |
PortAlternateProtocolPair alternate = |
GetAlternateProtocolRequestFor(request_info.url, &alternate_url); |
@@ -198,7 +245,7 @@ PortAlternateProtocolPair HttpStreamFactoryImpl::GetAlternateProtocolRequestFor( |
// for the proxy to use to reach the original URL via TCP. But |
// the alternate request will be going via UDP to a different port. |
*alternate_url = original_url; |
- } |
+ } |
return alternate; |
} |
@@ -213,7 +260,7 @@ void HttpStreamFactoryImpl::OrphanJob(Job* job, const Request* request) { |
job->Orphan(request); |
} |
-void HttpStreamFactoryImpl::OnSpdySessionReady( |
+void HttpStreamFactoryImpl::OnNewSpdySessionReady( |
scoped_refptr<SpdySession> spdy_session, |
bool direct, |
const SSLConfig& used_ssl_config, |
@@ -239,9 +286,20 @@ void HttpStreamFactoryImpl::OnSpdySessionReady( |
protocol_negotiated, |
using_spdy, |
net_log); |
- bool use_relative_url = direct || request->url().SchemeIs("https"); |
- request->OnStreamReady(NULL, used_ssl_config, used_proxy_info, |
- new SpdyHttpStream(spdy_session, use_relative_url)); |
+ if (for_websockets_) { |
+ WebSocketStreamBase::Factory* factory = |
+ request->websocket_stream_factory(); |
+ DCHECK(factory); |
+ bool use_relative_url = direct || request->url().SchemeIs("wss"); |
+ request->OnWebSocketStreamReady( |
+ NULL, used_ssl_config, used_proxy_info, |
+ factory->CreateSpdyStream(spdy_session, use_relative_url)); |
+ } else { |
+ bool use_relative_url = direct || request->url().SchemeIs("https"); |
+ request->OnStreamReady(NULL, used_ssl_config, used_proxy_info, |
+ new SpdyHttpStream(spdy_session, |
+ use_relative_url)); |
+ } |
} |
// TODO(mbelshe): Alert other valid requests. |
} |
@@ -293,4 +351,35 @@ void HttpStreamFactoryImpl::AbortPipelinedRequestsWithKey( |
} |
} |
+int HttpStreamFactoryImpl::InitSocketHandleForHttpRequest( |
+ const GURL& request_url, |
+ const HttpRequestInfo& request_info, |
+ RequestPriority request_priority, |
+ const ProxyInfo& proxy_info, |
+ bool force_spdy_over_ssl, |
+ bool want_spdy_over_npn, |
+ const SSLConfig& ssl_config_for_origin, |
+ const SSLConfig& ssl_config_for_proxy, |
+ const BoundNetLog& net_log, |
+ ClientSocketHandle* socket_handle, |
+ const OnHostResolutionCallback& resolution_callback, |
+ const CompletionCallback& callback) { |
+ return ::net::InitSocketHandleForHttpRequest( |
mmenke
2013/05/28 21:22:37
nit: leading "::" not needed.
yhirano
2013/05/30 04:44:32
Deleted.
|
+ request_url, |
+ request_info.extra_headers, |
+ request_info.load_flags, |
+ request_priority, |
+ session_, |
+ proxy_info, |
+ force_spdy_over_ssl, |
+ want_spdy_over_npn, |
+ ssl_config_for_origin, |
+ ssl_config_for_proxy, |
+ request_info.privacy_mode, |
+ net_log, |
+ socket_handle, |
+ resolution_callback, |
+ callback); |
+} |
+ |
} // namespace net |