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" |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 | 79 |
80 class StreamRequestImpl : public WebSocketStreamRequest { | 80 class StreamRequestImpl : public WebSocketStreamRequest { |
81 public: | 81 public: |
82 StreamRequestImpl( | 82 StreamRequestImpl( |
83 const GURL& url, | 83 const GURL& url, |
84 const URLRequestContext* context, | 84 const URLRequestContext* context, |
85 const url::Origin& origin, | 85 const url::Origin& origin, |
86 scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate, | 86 scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate, |
87 scoped_ptr<WebSocketHandshakeStreamCreateHelper> create_helper) | 87 scoped_ptr<WebSocketHandshakeStreamCreateHelper> create_helper) |
88 : delegate_(new Delegate(this)), | 88 : delegate_(new Delegate(this)), |
89 url_request_(url, DEFAULT_PRIORITY, delegate_.get(), context), | 89 url_request_(context->CreateRequest(url, DEFAULT_PRIORITY, |
| 90 delegate_.get(), NULL)), |
90 connect_delegate_(connect_delegate.Pass()), | 91 connect_delegate_(connect_delegate.Pass()), |
91 create_helper_(create_helper.release()) { | 92 create_helper_(create_helper.release()) { |
92 create_helper_->set_failure_message(&failure_message_); | 93 create_helper_->set_failure_message(&failure_message_); |
93 HttpRequestHeaders headers; | 94 HttpRequestHeaders headers; |
94 headers.SetHeader(websockets::kUpgrade, websockets::kWebSocketLowercase); | 95 headers.SetHeader(websockets::kUpgrade, websockets::kWebSocketLowercase); |
95 headers.SetHeader(HttpRequestHeaders::kConnection, websockets::kUpgrade); | 96 headers.SetHeader(HttpRequestHeaders::kConnection, websockets::kUpgrade); |
96 headers.SetHeader(HttpRequestHeaders::kOrigin, origin.string()); | 97 headers.SetHeader(HttpRequestHeaders::kOrigin, origin.string()); |
97 headers.SetHeader(websockets::kSecWebSocketVersion, | 98 headers.SetHeader(websockets::kSecWebSocketVersion, |
98 websockets::kSupportedVersion); | 99 websockets::kSupportedVersion); |
99 url_request_.SetExtraRequestHeaders(headers); | 100 url_request_->SetExtraRequestHeaders(headers); |
100 | 101 |
101 // This passes the ownership of |create_helper_| to |url_request_|. | 102 // This passes the ownership of |create_helper_| to |url_request_|. |
102 url_request_.SetUserData( | 103 url_request_->SetUserData( |
103 WebSocketHandshakeStreamBase::CreateHelper::DataKey(), | 104 WebSocketHandshakeStreamBase::CreateHelper::DataKey(), |
104 create_helper_); | 105 create_helper_); |
105 url_request_.SetLoadFlags(LOAD_DISABLE_CACHE | | 106 url_request_->SetLoadFlags(LOAD_DISABLE_CACHE | |
106 LOAD_BYPASS_CACHE | | 107 LOAD_BYPASS_CACHE | |
107 LOAD_DO_NOT_PROMPT_FOR_LOGIN); | 108 LOAD_DO_NOT_PROMPT_FOR_LOGIN); |
108 } | 109 } |
109 | 110 |
110 // Destroying this object destroys the URLRequest, which cancels the request | 111 // Destroying this object destroys the URLRequest, which cancels the request |
111 // and so terminates the handshake if it is incomplete. | 112 // and so terminates the handshake if it is incomplete. |
112 virtual ~StreamRequestImpl() {} | 113 virtual ~StreamRequestImpl() {} |
113 | 114 |
114 void Start() { | 115 void Start() { |
115 url_request_.Start(); | 116 url_request_->Start(); |
116 } | 117 } |
117 | 118 |
118 void PerformUpgrade() { | 119 void PerformUpgrade() { |
119 connect_delegate_->OnSuccess(create_helper_->Upgrade()); | 120 connect_delegate_->OnSuccess(create_helper_->Upgrade()); |
120 } | 121 } |
121 | 122 |
122 void ReportFailure() { | 123 void ReportFailure() { |
123 if (failure_message_.empty()) { | 124 if (failure_message_.empty()) { |
124 switch (url_request_.status().status()) { | 125 switch (url_request_->status().status()) { |
125 case URLRequestStatus::SUCCESS: | 126 case URLRequestStatus::SUCCESS: |
126 case URLRequestStatus::IO_PENDING: | 127 case URLRequestStatus::IO_PENDING: |
127 break; | 128 break; |
128 case URLRequestStatus::CANCELED: | 129 case URLRequestStatus::CANCELED: |
129 failure_message_ = "WebSocket opening handshake was canceled"; | 130 failure_message_ = "WebSocket opening handshake was canceled"; |
130 break; | 131 break; |
131 case URLRequestStatus::FAILED: | 132 case URLRequestStatus::FAILED: |
132 failure_message_ = | 133 failure_message_ = |
133 std::string("Error in connection establishment: ") + | 134 std::string("Error in connection establishment: ") + |
134 ErrorToString(url_request_.status().error()); | 135 ErrorToString(url_request_->status().error()); |
135 break; | 136 break; |
136 } | 137 } |
137 } | 138 } |
138 ReportFailureWithMessage(failure_message_); | 139 ReportFailureWithMessage(failure_message_); |
139 } | 140 } |
140 | 141 |
141 void ReportFailureWithMessage(const std::string& failure_message) { | 142 void ReportFailureWithMessage(const std::string& failure_message) { |
142 connect_delegate_->OnFailure(failure_message); | 143 connect_delegate_->OnFailure(failure_message); |
143 } | 144 } |
144 | 145 |
145 void OnFinishOpeningHandshake() { | 146 void OnFinishOpeningHandshake() { |
146 WebSocketDispatchOnFinishOpeningHandshake(connect_delegate(), | 147 WebSocketDispatchOnFinishOpeningHandshake(connect_delegate(), |
147 url_request_.url(), | 148 url_request_->url(), |
148 url_request_.response_headers(), | 149 url_request_->response_headers(), |
149 url_request_.response_time()); | 150 url_request_->response_time()); |
150 } | 151 } |
151 | 152 |
152 WebSocketStream::ConnectDelegate* connect_delegate() const { | 153 WebSocketStream::ConnectDelegate* connect_delegate() const { |
153 return connect_delegate_.get(); | 154 return connect_delegate_.get(); |
154 } | 155 } |
155 | 156 |
156 private: | 157 private: |
157 // |delegate_| needs to be declared before |url_request_| so that it gets | 158 // |delegate_| needs to be declared before |url_request_| so that it gets |
158 // initialised first. | 159 // initialised first. |
159 scoped_ptr<Delegate> delegate_; | 160 scoped_ptr<Delegate> delegate_; |
160 | 161 |
161 // Deleting the StreamRequestImpl object deletes this URLRequest object, | 162 // Deleting the StreamRequestImpl object deletes this URLRequest object, |
162 // cancelling the whole connection. | 163 // cancelling the whole connection. |
163 URLRequest url_request_; | 164 scoped_ptr<URLRequest> url_request_; |
164 | 165 |
165 scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate_; | 166 scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate_; |
166 | 167 |
167 // Owned by the URLRequest. | 168 // Owned by the URLRequest. |
168 WebSocketHandshakeStreamCreateHelper* create_helper_; | 169 WebSocketHandshakeStreamCreateHelper* create_helper_; |
169 | 170 |
170 // The failure message supplied by WebSocketBasicHandshakeStream, if any. | 171 // The failure message supplied by WebSocketBasicHandshakeStream, if any. |
171 std::string failure_message_; | 172 std::string failure_message_; |
172 }; | 173 }; |
173 | 174 |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
317 connect_delegate->OnFinishOpeningHandshake(make_scoped_ptr( | 318 connect_delegate->OnFinishOpeningHandshake(make_scoped_ptr( |
318 new WebSocketHandshakeResponseInfo(url, | 319 new WebSocketHandshakeResponseInfo(url, |
319 headers->response_code(), | 320 headers->response_code(), |
320 headers->GetStatusText(), | 321 headers->GetStatusText(), |
321 headers, | 322 headers, |
322 response_time))); | 323 response_time))); |
323 } | 324 } |
324 } | 325 } |
325 | 326 |
326 } // namespace net | 327 } // namespace net |
OLD | NEW |