summaryrefslogtreecommitdiffstats
path: root/net/http/http_network_transaction.cc
diff options
context:
space:
mode:
authorricea@chromium.org <ricea@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-14 02:14:44 +0000
committerricea@chromium.org <ricea@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-14 02:14:44 +0000
commit831e4a3102c7ad705d69386e52981c66a4ba0ccd (patch)
treef5f0e687cbe554caa6f7da3341fe1ff09a055660 /net/http/http_network_transaction.cc
parent993bd9bd5c7e6f7505b6f6cfe852f9d3e6f67e76 (diff)
downloadchromium_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.cc48
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); \