diff options
author | ricea@chromium.org <ricea@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-14 02:14:44 +0000 |
---|---|---|
committer | ricea@chromium.org <ricea@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-14 02:14:44 +0000 |
commit | 831e4a3102c7ad705d69386e52981c66a4ba0ccd (patch) | |
tree | f5f0e687cbe554caa6f7da3341fe1ff09a055660 /net/http/http_network_transaction.cc | |
parent | 993bd9bd5c7e6f7505b6f6cfe852f9d3e6f67e76 (diff) | |
download | chromium_src-831e4a3102c7ad705d69386e52981c66a4ba0ccd.zip chromium_src-831e4a3102c7ad705d69386e52981c66a4ba0ccd.tar.gz chromium_src-831e4a3102c7ad705d69386e52981c66a4ba0ccd.tar.bz2 |
Add a SetWebSocketHandshakeStreamFactory() method to the HttpTransaction base class so that
URLRequestHttpJob can pass through the WebSocketHandshakeStreamBase::Factory object.
Implement OnWebSocketHandshakeStreamReady().
BUG=315027
TEST=net_unittests
Review URL: https://codereview.chromium.org/23856018
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@235016 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/http/http_network_transaction.cc')
-rw-r--r-- | net/http/http_network_transaction.cc | 48 |
1 files changed, 37 insertions, 11 deletions
diff --git a/net/http/http_network_transaction.cc b/net/http/http_network_transaction.cc index ff94e30..d20ee4c6 100644 --- a/net/http/http_network_transaction.cc +++ b/net/http/http_network_transaction.cc @@ -129,7 +129,8 @@ HttpNetworkTransaction::HttpNetworkTransaction(RequestPriority priority, request_headers_(), read_buf_len_(0), next_state_(STATE_NONE), - establishing_tunnel_(false) { + establishing_tunnel_(false), + websocket_handshake_stream_base_create_helper_(NULL) { session->ssl_config_service()->GetSSLConfig(&server_ssl_config_); if (session->http_stream_factory()->has_next_protos()) { server_ssl_config_.next_protos = @@ -429,6 +430,11 @@ void HttpNetworkTransaction::SetPriority(RequestPriority priority) { stream_->SetPriority(priority); } +void HttpNetworkTransaction::SetWebSocketHandshakeStreamCreateHelper( + WebSocketHandshakeStreamBase::CreateHelper* create_helper) { + websocket_handshake_stream_base_create_helper_ = create_helper; +} + void HttpNetworkTransaction::OnStreamReady(const SSLConfig& used_ssl_config, const ProxyInfo& used_proxy_info, HttpStreamBase* stream) { @@ -451,7 +457,7 @@ void HttpNetworkTransaction::OnWebSocketHandshakeStreamReady( const SSLConfig& used_ssl_config, const ProxyInfo& used_proxy_info, WebSocketHandshakeStreamBase* stream) { - NOTREACHED() << "This function should never be called."; + OnStreamReady(used_ssl_config, used_proxy_info, stream); } void HttpNetworkTransaction::OnStreamFailed(int result, @@ -657,14 +663,27 @@ int HttpNetworkTransaction::DoLoop(int result) { int HttpNetworkTransaction::DoCreateStream() { next_state_ = STATE_CREATE_STREAM_COMPLETE; - stream_request_.reset( - session_->http_stream_factory()->RequestStream( - *request_, - priority_, - server_ssl_config_, - proxy_ssl_config_, - this, - net_log_)); + if (ForWebSocketHandshake()) { + stream_request_.reset( + session_->websocket_handshake_stream_factory() + ->RequestWebSocketHandshakeStream( + *request_, + priority_, + server_ssl_config_, + proxy_ssl_config_, + this, + websocket_handshake_stream_base_create_helper_, + net_log_)); + } else { + stream_request_.reset( + session_->http_stream_factory()->RequestStream( + *request_, + priority_, + server_ssl_config_, + proxy_ssl_config_, + this, + net_log_)); + } DCHECK(stream_request_.get()); return ERR_IO_PENDING; } @@ -1000,7 +1019,9 @@ int HttpNetworkTransaction::DoReadHeadersComplete(int result) { // need to skip over it. // We treat any other 1xx in this same way (although in practice getting // a 1xx that isn't a 100 is rare). - if (response_.headers->response_code() / 100 == 1) { + // Unless this is a WebSocket request, in which case we pass it on up. + if (response_.headers->response_code() / 100 == 1 && + !ForWebSocketHandshake()) { response_.headers = new HttpResponseHeaders(std::string()); next_state_ = STATE_READ_HEADERS; return OK; @@ -1487,6 +1508,11 @@ GURL HttpNetworkTransaction::AuthURL(HttpAuth::Target target) const { } } +bool HttpNetworkTransaction::ForWebSocketHandshake() const { + return (websocket_handshake_stream_base_create_helper_ && + (request_->url.SchemeIs("ws") || request_->url.SchemeIs("wss"))); +} + #define STATE_CASE(s) \ case s: \ description = base::StringPrintf("%s (0x%08X)", #s, s); \ |