OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "sync/engine/net/server_connection_manager.h" | 5 #include "sync/engine/net/server_connection_manager.h" |
6 | 6 |
7 #include <errno.h> | 7 #include <errno.h> |
8 | 8 |
9 #include <ostream> | 9 #include <ostream> |
10 #include <string> | 10 #include <string> |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
145 int length) { | 145 int length) { |
146 int bytes_read = buffer_.length(); | 146 int bytes_read = buffer_.length(); |
147 CHECK(length <= bytes_read); | 147 CHECK(length <= bytes_read); |
148 out_buffer->assign(buffer_); | 148 out_buffer->assign(buffer_); |
149 return bytes_read; | 149 return bytes_read; |
150 } | 150 } |
151 | 151 |
152 ScopedServerStatusWatcher::ScopedServerStatusWatcher( | 152 ScopedServerStatusWatcher::ScopedServerStatusWatcher( |
153 ServerConnectionManager* conn_mgr, HttpResponse* response) | 153 ServerConnectionManager* conn_mgr, HttpResponse* response) |
154 : conn_mgr_(conn_mgr), | 154 : conn_mgr_(conn_mgr), |
155 response_(response), | 155 response_(response) { |
156 server_reachable_(conn_mgr->server_reachable_) { | |
157 response->server_status = conn_mgr->server_status_; | 156 response->server_status = conn_mgr->server_status_; |
158 } | 157 } |
159 | 158 |
160 ScopedServerStatusWatcher::~ScopedServerStatusWatcher() { | 159 ScopedServerStatusWatcher::~ScopedServerStatusWatcher() { |
161 if (conn_mgr_->server_status_ != response_->server_status) { | 160 if (conn_mgr_->server_status_ != response_->server_status) { |
162 conn_mgr_->server_status_ = response_->server_status; | 161 conn_mgr_->server_status_ = response_->server_status; |
163 conn_mgr_->NotifyStatusChanged(); | 162 conn_mgr_->NotifyStatusChanged(); |
164 return; | 163 return; |
165 } | 164 } |
166 // Notify if we've gone on or offline. | |
167 if (server_reachable_ != conn_mgr_->server_reachable_) | |
168 conn_mgr_->NotifyStatusChanged(); | |
169 } | 165 } |
170 | 166 |
171 ServerConnectionManager::ServerConnectionManager( | 167 ServerConnectionManager::ServerConnectionManager( |
172 const string& server, | 168 const string& server, |
173 int port, | 169 int port, |
174 bool use_ssl, | 170 bool use_ssl, |
175 const string& user_agent) | 171 const string& user_agent) |
176 : sync_server_(server), | 172 : sync_server_(server), |
177 sync_server_port_(port), | 173 sync_server_port_(port), |
178 user_agent_(user_agent), | 174 user_agent_(user_agent), |
179 use_ssl_(use_ssl), | 175 use_ssl_(use_ssl), |
180 proto_sync_path_(kSyncServerSyncPath), | 176 proto_sync_path_(kSyncServerSyncPath), |
181 get_time_path_(kSyncServerGetTimePath), | 177 get_time_path_(kSyncServerGetTimePath), |
182 server_status_(HttpResponse::NONE), | 178 server_status_(HttpResponse::NONE), |
183 server_reachable_(false), | |
184 terminated_(false), | 179 terminated_(false), |
185 active_connection_(NULL) { | 180 active_connection_(NULL) { |
186 } | 181 } |
187 | 182 |
188 ServerConnectionManager::~ServerConnectionManager() { | 183 ServerConnectionManager::~ServerConnectionManager() { |
189 } | 184 } |
190 | 185 |
191 ServerConnectionManager::Connection* | 186 ServerConnectionManager::Connection* |
192 ServerConnectionManager::MakeActiveConnection() { | 187 ServerConnectionManager::MakeActiveConnection() { |
193 base::AutoLock lock(terminate_connection_lock_); | 188 base::AutoLock lock(terminate_connection_lock_); |
(...skipping 14 matching lines...) Expand all Loading... |
208 if (active_connection_ != connection) | 203 if (active_connection_ != connection) |
209 return; | 204 return; |
210 | 205 |
211 active_connection_ = NULL; | 206 active_connection_ = NULL; |
212 } | 207 } |
213 | 208 |
214 void ServerConnectionManager::NotifyStatusChanged() { | 209 void ServerConnectionManager::NotifyStatusChanged() { |
215 DCHECK(thread_checker_.CalledOnValidThread()); | 210 DCHECK(thread_checker_.CalledOnValidThread()); |
216 FOR_EACH_OBSERVER(ServerConnectionEventListener, listeners_, | 211 FOR_EACH_OBSERVER(ServerConnectionEventListener, listeners_, |
217 OnServerConnectionEvent( | 212 OnServerConnectionEvent( |
218 ServerConnectionEvent(server_status_, server_reachable_))); | 213 ServerConnectionEvent(server_status_))); |
219 } | 214 } |
220 | 215 |
221 bool ServerConnectionManager::PostBufferWithCachedAuth( | 216 bool ServerConnectionManager::PostBufferWithCachedAuth( |
222 PostBufferParams* params, ScopedServerStatusWatcher* watcher) { | 217 PostBufferParams* params, ScopedServerStatusWatcher* watcher) { |
223 DCHECK(thread_checker_.CalledOnValidThread()); | 218 DCHECK(thread_checker_.CalledOnValidThread()); |
224 string path = | 219 string path = |
225 MakeSyncServerPath(proto_sync_path(), MakeSyncQueryString(client_id_)); | 220 MakeSyncServerPath(proto_sync_path(), MakeSyncQueryString(client_id_)); |
226 return PostBufferToPath(params, path, auth_token(), watcher); | 221 return PostBufferToPath(params, path, auth_token(), watcher); |
227 } | 222 } |
228 | 223 |
(...skipping 23 matching lines...) Expand all Loading... |
252 | 247 |
253 if (params->response.server_status == HttpResponse::SYNC_AUTH_ERROR) | 248 if (params->response.server_status == HttpResponse::SYNC_AUTH_ERROR) |
254 InvalidateAndClearAuthToken(); | 249 InvalidateAndClearAuthToken(); |
255 | 250 |
256 if (!ok || net::HTTP_OK != params->response.response_code) | 251 if (!ok || net::HTTP_OK != params->response.response_code) |
257 return false; | 252 return false; |
258 | 253 |
259 if (post.get()->ReadBufferResponse( | 254 if (post.get()->ReadBufferResponse( |
260 ¶ms->buffer_out, ¶ms->response, true)) { | 255 ¶ms->buffer_out, ¶ms->response, true)) { |
261 params->response.server_status = HttpResponse::SERVER_CONNECTION_OK; | 256 params->response.server_status = HttpResponse::SERVER_CONNECTION_OK; |
262 server_reachable_ = true; | |
263 return true; | 257 return true; |
264 } | 258 } |
265 return false; | 259 return false; |
266 } | 260 } |
267 | 261 |
268 bool ServerConnectionManager::CheckTime(int32* out_time) { | |
269 DCHECK(thread_checker_.CalledOnValidThread()); | |
270 | |
271 // Verify that the server really is reachable by checking the time. We need | |
272 // to do this because of wifi interstitials that intercept messages from the | |
273 // client and return HTTP OK instead of a redirect. | |
274 HttpResponse response; | |
275 ScopedServerStatusWatcher watcher(this, &response); | |
276 string post_body = "command=get_time"; | |
277 | |
278 for (int i = 0 ; i < 3; i++) { | |
279 ScopedConnectionHelper post(this, MakeActiveConnection()); | |
280 if (!post.get()) | |
281 break; | |
282 | |
283 // Note that the server's get_time path doesn't require authentication. | |
284 string get_time_path = | |
285 MakeSyncServerPath(kSyncServerGetTimePath, post_body); | |
286 DVLOG(1) << "Requesting get_time from:" << get_time_path; | |
287 | |
288 string blank_post_body; | |
289 bool ok = post.get()->Init(get_time_path.c_str(), blank_post_body, | |
290 blank_post_body, &response); | |
291 if (!ok) { | |
292 DVLOG(1) << "Unable to check the time"; | |
293 continue; | |
294 } | |
295 string time_response; | |
296 time_response.resize( | |
297 static_cast<string::size_type>(response.content_length)); | |
298 ok = post.get()->ReadDownloadResponse(&response, &time_response); | |
299 if (!ok || string::npos != | |
300 time_response.find_first_not_of("0123456789")) { | |
301 LOG(ERROR) << "unable to read a non-numeric response from get_time:" | |
302 << time_response; | |
303 continue; | |
304 } | |
305 *out_time = atoi(time_response.c_str()); | |
306 DVLOG(1) << "Server was reachable."; | |
307 return true; | |
308 } | |
309 return false; | |
310 } | |
311 | |
312 bool ServerConnectionManager::IsServerReachable() { | |
313 DCHECK(thread_checker_.CalledOnValidThread()); | |
314 int32 time; | |
315 return CheckTime(&time); | |
316 } | |
317 | |
318 bool ServerConnectionManager::IsUserAuthenticated() { | |
319 DCHECK(thread_checker_.CalledOnValidThread()); | |
320 return IsGoodReplyFromServer(server_status_); | |
321 } | |
322 | |
323 bool ServerConnectionManager::CheckServerReachable() { | |
324 DCHECK(thread_checker_.CalledOnValidThread()); | |
325 const bool server_is_reachable = IsServerReachable(); | |
326 if (server_reachable_ != server_is_reachable) { | |
327 server_reachable_ = server_is_reachable; | |
328 NotifyStatusChanged(); | |
329 } | |
330 return server_is_reachable; | |
331 } | |
332 | |
333 void ServerConnectionManager::SetServerParameters(const string& server_url, | |
334 int port, | |
335 bool use_ssl) { | |
336 DCHECK(thread_checker_.CalledOnValidThread()); | |
337 sync_server_ = server_url; | |
338 sync_server_port_ = port; | |
339 use_ssl_ = use_ssl; | |
340 } | |
341 | |
342 // Returns the current server parameters in server_url and port. | 262 // Returns the current server parameters in server_url and port. |
343 void ServerConnectionManager::GetServerParameters(string* server_url, | 263 void ServerConnectionManager::GetServerParameters(string* server_url, |
344 int* port, | 264 int* port, |
345 bool* use_ssl) const { | 265 bool* use_ssl) const { |
346 if (server_url != NULL) | 266 if (server_url != NULL) |
347 *server_url = sync_server_; | 267 *server_url = sync_server_; |
348 if (port != NULL) | 268 if (port != NULL) |
349 *port = sync_server_port_; | 269 *port = sync_server_port_; |
350 if (use_ssl != NULL) | 270 if (use_ssl != NULL) |
351 *use_ssl = use_ssl_; | 271 *use_ssl = use_ssl_; |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
405 } | 325 } |
406 | 326 |
407 std::ostream& operator << (std::ostream& s, const struct HttpResponse& hr) { | 327 std::ostream& operator << (std::ostream& s, const struct HttpResponse& hr) { |
408 s << " Response Code (bogus on error): " << hr.response_code; | 328 s << " Response Code (bogus on error): " << hr.response_code; |
409 s << " Content-Length (bogus on error): " << hr.content_length; | 329 s << " Content-Length (bogus on error): " << hr.content_length; |
410 s << " Server Status: " << hr.server_status; | 330 s << " Server Status: " << hr.server_status; |
411 return s; | 331 return s; |
412 } | 332 } |
413 | 333 |
414 } // namespace browser_sync | 334 } // namespace browser_sync |
OLD | NEW |