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 |