| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/websockets/websocket_stream.h" | 5 #include "net/websockets/websocket_stream.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
| 9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
| 10 #include "net/base/load_flags.h" | 10 #include "net/base/load_flags.h" |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 private: | 60 private: |
| 61 StreamRequestImpl* owner_; | 61 StreamRequestImpl* owner_; |
| 62 HandshakeResult result_; | 62 HandshakeResult result_; |
| 63 }; | 63 }; |
| 64 | 64 |
| 65 class StreamRequestImpl : public WebSocketStreamRequest { | 65 class StreamRequestImpl : public WebSocketStreamRequest { |
| 66 public: | 66 public: |
| 67 StreamRequestImpl( | 67 StreamRequestImpl( |
| 68 const GURL& url, | 68 const GURL& url, |
| 69 const URLRequestContext* context, | 69 const URLRequestContext* context, |
| 70 const url::Origin& origin, |
| 70 scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate, | 71 scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate, |
| 71 WebSocketHandshakeStreamCreateHelper* create_helper) | 72 scoped_ptr<WebSocketHandshakeStreamCreateHelper> create_helper) |
| 72 : delegate_(new Delegate(this)), | 73 : delegate_(new Delegate(this)), |
| 73 url_request_(url, DEFAULT_PRIORITY, delegate_.get(), context), | 74 url_request_(url, DEFAULT_PRIORITY, delegate_.get(), context), |
| 74 connect_delegate_(connect_delegate.Pass()), | 75 connect_delegate_(connect_delegate.Pass()), |
| 75 create_helper_(create_helper) {} | 76 create_helper_(create_helper.release()) { |
| 77 HttpRequestHeaders headers; |
| 78 headers.SetHeader(websockets::kUpgrade, websockets::kWebSocketLowercase); |
| 79 headers.SetHeader(HttpRequestHeaders::kConnection, websockets::kUpgrade); |
| 80 headers.SetHeader(HttpRequestHeaders::kOrigin, origin.string()); |
| 81 headers.SetHeader(websockets::kSecWebSocketVersion, |
| 82 websockets::kSupportedVersion); |
| 83 url_request_.SetExtraRequestHeaders(headers); |
| 84 |
| 85 // This passes the ownership of |create_helper_| to |url_request_|. |
| 86 url_request_.SetUserData( |
| 87 WebSocketHandshakeStreamBase::CreateHelper::DataKey(), |
| 88 create_helper_); |
| 89 url_request_.SetLoadFlags(LOAD_DISABLE_CACHE | |
| 90 LOAD_BYPASS_CACHE | |
| 91 LOAD_DO_NOT_PROMPT_FOR_LOGIN); |
| 92 } |
| 76 | 93 |
| 77 // Destroying this object destroys the URLRequest, which cancels the request | 94 // Destroying this object destroys the URLRequest, which cancels the request |
| 78 // and so terminates the handshake if it is incomplete. | 95 // and so terminates the handshake if it is incomplete. |
| 79 virtual ~StreamRequestImpl() {} | 96 virtual ~StreamRequestImpl() {} |
| 80 | 97 |
| 81 URLRequest* url_request() { return &url_request_; } | 98 void Start() { |
| 99 url_request_.Start(); |
| 100 } |
| 82 | 101 |
| 83 void PerformUpgrade() { | 102 void PerformUpgrade() { |
| 84 connect_delegate_->OnSuccess(create_helper_->stream()->Upgrade()); | 103 connect_delegate_->OnSuccess(create_helper_->stream()->Upgrade()); |
| 85 } | 104 } |
| 86 | 105 |
| 87 void ReportFailure() { | 106 void ReportFailure() { |
| 88 std::string failure_message; | 107 std::string failure_message; |
| 89 if (create_helper_->stream()) { | 108 if (create_helper_->stream()) { |
| 90 failure_message = create_helper_->stream()->GetFailureMessage(); | 109 failure_message = create_helper_->stream()->GetFailureMessage(); |
| 91 } else { | 110 } else { |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 151 void Delegate::OnSSLCertificateError(URLRequest* request, | 170 void Delegate::OnSSLCertificateError(URLRequest* request, |
| 152 const SSLInfo& ssl_info, | 171 const SSLInfo& ssl_info, |
| 153 bool fatal) { | 172 bool fatal) { |
| 154 request->Cancel(); | 173 request->Cancel(); |
| 155 } | 174 } |
| 156 | 175 |
| 157 void Delegate::OnReadCompleted(URLRequest* request, int bytes_read) { | 176 void Delegate::OnReadCompleted(URLRequest* request, int bytes_read) { |
| 158 NOTREACHED(); | 177 NOTREACHED(); |
| 159 } | 178 } |
| 160 | 179 |
| 161 // Internal implementation of CreateAndConnectStream and | |
| 162 // CreateAndConnectStreamForTesting. | |
| 163 scoped_ptr<WebSocketStreamRequest> CreateAndConnectStreamWithCreateHelper( | |
| 164 const GURL& socket_url, | |
| 165 scoped_ptr<WebSocketHandshakeStreamCreateHelper> create_helper, | |
| 166 const url::Origin& origin, | |
| 167 URLRequestContext* url_request_context, | |
| 168 const BoundNetLog& net_log, | |
| 169 scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate) { | |
| 170 scoped_ptr<StreamRequestImpl> request( | |
| 171 new StreamRequestImpl(socket_url, | |
| 172 url_request_context, | |
| 173 connect_delegate.Pass(), | |
| 174 create_helper.get())); | |
| 175 HttpRequestHeaders headers; | |
| 176 headers.SetHeader(websockets::kUpgrade, websockets::kWebSocketLowercase); | |
| 177 headers.SetHeader(HttpRequestHeaders::kConnection, websockets::kUpgrade); | |
| 178 headers.SetHeader(HttpRequestHeaders::kOrigin, origin.string()); | |
| 179 headers.SetHeader(websockets::kSecWebSocketVersion, | |
| 180 websockets::kSupportedVersion); | |
| 181 request->url_request()->SetExtraRequestHeaders(headers); | |
| 182 request->url_request()->SetUserData( | |
| 183 WebSocketHandshakeStreamBase::CreateHelper::DataKey(), | |
| 184 create_helper.release()); | |
| 185 request->url_request()->SetLoadFlags(LOAD_DISABLE_CACHE | | |
| 186 LOAD_BYPASS_CACHE | | |
| 187 LOAD_DO_NOT_PROMPT_FOR_LOGIN); | |
| 188 request->url_request()->Start(); | |
| 189 return request.PassAs<WebSocketStreamRequest>(); | |
| 190 } | |
| 191 | |
| 192 } // namespace | 180 } // namespace |
| 193 | 181 |
| 194 WebSocketStreamRequest::~WebSocketStreamRequest() {} | 182 WebSocketStreamRequest::~WebSocketStreamRequest() {} |
| 195 | 183 |
| 196 WebSocketStream::WebSocketStream() {} | 184 WebSocketStream::WebSocketStream() {} |
| 197 WebSocketStream::~WebSocketStream() {} | 185 WebSocketStream::~WebSocketStream() {} |
| 198 | 186 |
| 199 WebSocketStream::ConnectDelegate::~ConnectDelegate() {} | 187 WebSocketStream::ConnectDelegate::~ConnectDelegate() {} |
| 200 | 188 |
| 201 scoped_ptr<WebSocketStreamRequest> WebSocketStream::CreateAndConnectStream( | 189 scoped_ptr<WebSocketStreamRequest> WebSocketStream::CreateAndConnectStream( |
| 202 const GURL& socket_url, | 190 const GURL& socket_url, |
| 203 const std::vector<std::string>& requested_subprotocols, | 191 const std::vector<std::string>& requested_subprotocols, |
| 204 const url::Origin& origin, | 192 const url::Origin& origin, |
| 205 URLRequestContext* url_request_context, | 193 URLRequestContext* url_request_context, |
| 206 const BoundNetLog& net_log, | 194 const BoundNetLog& net_log, |
| 207 scoped_ptr<ConnectDelegate> connect_delegate) { | 195 scoped_ptr<ConnectDelegate> connect_delegate) { |
| 208 scoped_ptr<WebSocketHandshakeStreamCreateHelper> create_helper( | 196 scoped_ptr<WebSocketHandshakeStreamCreateHelper> create_helper( |
| 209 new WebSocketHandshakeStreamCreateHelper(connect_delegate.get(), | 197 new WebSocketHandshakeStreamCreateHelper(connect_delegate.get(), |
| 210 requested_subprotocols)); | 198 requested_subprotocols)); |
| 211 return CreateAndConnectStreamWithCreateHelper(socket_url, | 199 scoped_ptr<StreamRequestImpl> request( |
| 212 create_helper.Pass(), | 200 new StreamRequestImpl(socket_url, |
| 213 origin, | 201 url_request_context, |
| 214 url_request_context, | 202 origin, |
| 215 net_log, | 203 connect_delegate.Pass(), |
| 216 connect_delegate.Pass()); | 204 create_helper.Pass())); |
| 205 request->Start(); |
| 206 return request.PassAs<WebSocketStreamRequest>(); |
| 217 } | 207 } |
| 218 | 208 |
| 219 // This is declared in websocket_test_util.h. | 209 // This is declared in websocket_test_util.h. |
| 220 scoped_ptr<WebSocketStreamRequest> CreateAndConnectStreamForTesting( | 210 scoped_ptr<WebSocketStreamRequest> CreateAndConnectStreamForTesting( |
| 221 const GURL& socket_url, | 211 const GURL& socket_url, |
| 222 scoped_ptr<WebSocketHandshakeStreamCreateHelper> create_helper, | 212 scoped_ptr<WebSocketHandshakeStreamCreateHelper> create_helper, |
| 223 const url::Origin& origin, | 213 const url::Origin& origin, |
| 224 URLRequestContext* url_request_context, | 214 URLRequestContext* url_request_context, |
| 225 const BoundNetLog& net_log, | 215 const BoundNetLog& net_log, |
| 226 scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate) { | 216 scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate) { |
| 227 return CreateAndConnectStreamWithCreateHelper(socket_url, | 217 scoped_ptr<StreamRequestImpl> request( |
| 228 create_helper.Pass(), | 218 new StreamRequestImpl(socket_url, |
| 229 origin, | 219 url_request_context, |
| 230 url_request_context, | 220 origin, |
| 231 net_log, | 221 connect_delegate.Pass(), |
| 232 connect_delegate.Pass()); | 222 create_helper.Pass())); |
| 223 request->Start(); |
| 224 return request.PassAs<WebSocketStreamRequest>(); |
| 233 } | 225 } |
| 234 | 226 |
| 235 } // namespace net | 227 } // namespace net |
| OLD | NEW |