| 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 "base/metrics/sparse_histogram.h" | 10 #include "base/metrics/sparse_histogram.h" |
| 11 #include "net/base/load_flags.h" | 11 #include "net/base/load_flags.h" |
| 12 #include "net/http/http_request_headers.h" | 12 #include "net/http/http_request_headers.h" |
| 13 #include "net/http/http_response_headers.h" |
| 13 #include "net/http/http_status_code.h" | 14 #include "net/http/http_status_code.h" |
| 14 #include "net/url_request/url_request.h" | 15 #include "net/url_request/url_request.h" |
| 15 #include "net/url_request/url_request_context.h" | 16 #include "net/url_request/url_request_context.h" |
| 16 #include "net/websockets/websocket_errors.h" | 17 #include "net/websockets/websocket_errors.h" |
| 17 #include "net/websockets/websocket_event_interface.h" | 18 #include "net/websockets/websocket_event_interface.h" |
| 18 #include "net/websockets/websocket_handshake_constants.h" | 19 #include "net/websockets/websocket_handshake_constants.h" |
| 19 #include "net/websockets/websocket_handshake_stream_base.h" | 20 #include "net/websockets/websocket_handshake_stream_base.h" |
| 20 #include "net/websockets/websocket_handshake_stream_create_helper.h" | 21 #include "net/websockets/websocket_handshake_stream_create_helper.h" |
| 21 #include "net/websockets/websocket_test_util.h" | 22 #include "net/websockets/websocket_test_util.h" |
| 22 #include "url/gurl.h" | 23 #include "url/gurl.h" |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 126 case URLRequestStatus::CANCELED: | 127 case URLRequestStatus::CANCELED: |
| 127 failure_message_ = "WebSocket opening handshake was canceled"; | 128 failure_message_ = "WebSocket opening handshake was canceled"; |
| 128 break; | 129 break; |
| 129 case URLRequestStatus::FAILED: | 130 case URLRequestStatus::FAILED: |
| 130 failure_message_ = | 131 failure_message_ = |
| 131 std::string("Error in connection establishment: ") + | 132 std::string("Error in connection establishment: ") + |
| 132 ErrorToString(url_request_.status().error()); | 133 ErrorToString(url_request_.status().error()); |
| 133 break; | 134 break; |
| 134 } | 135 } |
| 135 } | 136 } |
| 136 connect_delegate_->OnFailure(failure_message_); | 137 ReportFailureWithMessage(failure_message_); |
| 138 } |
| 139 |
| 140 void ReportFailureWithMessage(const std::string& failure_message) { |
| 141 connect_delegate_->OnFailure(failure_message); |
| 142 } |
| 143 |
| 144 void OnFinishOpeningHandshake() { |
| 145 WebSocketDispatchOnFinishOpeningHandshake(connect_delegate(), |
| 146 url_request_.url(), |
| 147 url_request_.response_headers(), |
| 148 url_request_.response_time()); |
| 137 } | 149 } |
| 138 | 150 |
| 139 WebSocketStream::ConnectDelegate* connect_delegate() const { | 151 WebSocketStream::ConnectDelegate* connect_delegate() const { |
| 140 return connect_delegate_.get(); | 152 return connect_delegate_.get(); |
| 141 } | 153 } |
| 142 | 154 |
| 143 private: | 155 private: |
| 144 // |delegate_| needs to be declared before |url_request_| so that it gets | 156 // |delegate_| needs to be declared before |url_request_| so that it gets |
| 145 // initialised first. | 157 // initialised first. |
| 146 scoped_ptr<Delegate> delegate_; | 158 scoped_ptr<Delegate> delegate_; |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 } | 203 } |
| 192 const int response_code = request->GetResponseCode(); | 204 const int response_code = request->GetResponseCode(); |
| 193 DVLOG(3) << "OnResponseStarted (response code " << response_code << ")"; | 205 DVLOG(3) << "OnResponseStarted (response code " << response_code << ")"; |
| 194 switch (response_code) { | 206 switch (response_code) { |
| 195 case HTTP_SWITCHING_PROTOCOLS: | 207 case HTTP_SWITCHING_PROTOCOLS: |
| 196 result_ = CONNECTED; | 208 result_ = CONNECTED; |
| 197 owner_->PerformUpgrade(); | 209 owner_->PerformUpgrade(); |
| 198 return; | 210 return; |
| 199 | 211 |
| 200 case HTTP_UNAUTHORIZED: | 212 case HTTP_UNAUTHORIZED: |
| 213 result_ = FAILED; |
| 214 owner_->OnFinishOpeningHandshake(); |
| 215 owner_->ReportFailureWithMessage( |
| 216 "HTTP Authentication failed; no valid credentials available"); |
| 217 return; |
| 218 |
| 201 case HTTP_PROXY_AUTHENTICATION_REQUIRED: | 219 case HTTP_PROXY_AUTHENTICATION_REQUIRED: |
| 220 result_ = FAILED; |
| 221 owner_->OnFinishOpeningHandshake(); |
| 222 owner_->ReportFailureWithMessage("Proxy authentication failed"); |
| 202 return; | 223 return; |
| 203 | 224 |
| 204 default: | 225 default: |
| 205 result_ = FAILED; | 226 result_ = FAILED; |
| 206 owner_->ReportFailure(); | 227 owner_->ReportFailure(); |
| 207 } | 228 } |
| 208 } | 229 } |
| 209 | 230 |
| 210 void Delegate::OnAuthRequired(URLRequest* request, | 231 void Delegate::OnAuthRequired(URLRequest* request, |
| 211 AuthChallengeInfo* auth_info) { | 232 AuthChallengeInfo* auth_info) { |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 278 scoped_ptr<StreamRequestImpl> request( | 299 scoped_ptr<StreamRequestImpl> request( |
| 279 new StreamRequestImpl(socket_url, | 300 new StreamRequestImpl(socket_url, |
| 280 url_request_context, | 301 url_request_context, |
| 281 origin, | 302 origin, |
| 282 connect_delegate.Pass(), | 303 connect_delegate.Pass(), |
| 283 create_helper.Pass())); | 304 create_helper.Pass())); |
| 284 request->Start(); | 305 request->Start(); |
| 285 return request.PassAs<WebSocketStreamRequest>(); | 306 return request.PassAs<WebSocketStreamRequest>(); |
| 286 } | 307 } |
| 287 | 308 |
| 309 void WebSocketDispatchOnFinishOpeningHandshake( |
| 310 WebSocketStream::ConnectDelegate* connect_delegate, |
| 311 const GURL& url, |
| 312 const scoped_refptr<HttpResponseHeaders>& headers, |
| 313 base::Time response_time) { |
| 314 DCHECK(connect_delegate); |
| 315 if (headers) { |
| 316 connect_delegate->OnFinishOpeningHandshake(make_scoped_ptr( |
| 317 new WebSocketHandshakeResponseInfo(url, |
| 318 headers->response_code(), |
| 319 headers->GetStatusText(), |
| 320 headers, |
| 321 response_time))); |
| 322 } |
| 323 } |
| 324 |
| 288 } // namespace net | 325 } // namespace net |
| OLD | NEW |