OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "chrome/browser/sync/internal_api/syncapi_server_connection_manager.h" | 5 #include "chrome/browser/sync/internal_api/syncapi_server_connection_manager.h" |
6 | 6 |
7 #include "chrome/browser/sync/internal_api/http_post_provider_factory.h" | 7 #include "chrome/browser/sync/internal_api/http_post_provider_factory.h" |
8 #include "chrome/browser/sync/internal_api/http_post_provider_interface.h" | 8 #include "chrome/browser/sync/internal_api/http_post_provider_interface.h" |
9 #include "chrome/browser/sync/util/oauth.h" | 9 #include "chrome/browser/sync/util/oauth.h" |
10 #include "chrome/common/net/http_return.h" | 10 #include "chrome/common/net/http_return.h" |
| 11 #include "net/base/net_errors.h" |
11 | 12 |
12 using browser_sync::HttpResponse; | 13 using browser_sync::HttpResponse; |
13 | 14 |
14 namespace sync_api { | 15 namespace sync_api { |
15 | 16 |
16 SyncAPIBridgedPost::SyncAPIBridgedPost( | 17 SyncAPIBridgedConnection::SyncAPIBridgedConnection( |
17 browser_sync::ServerConnectionManager* scm, | 18 browser_sync::ServerConnectionManager* scm, |
18 HttpPostProviderFactory* factory) | 19 HttpPostProviderFactory* factory) |
19 : Post(scm), factory_(factory) { | 20 : Connection(scm), factory_(factory) { |
| 21 post_provider_ = factory_->Create(); |
20 } | 22 } |
21 | 23 |
22 SyncAPIBridgedPost::~SyncAPIBridgedPost() {} | 24 SyncAPIBridgedConnection::~SyncAPIBridgedConnection() { |
| 25 DCHECK(post_provider_); |
| 26 factory_->Destroy(post_provider_); |
| 27 post_provider_ = NULL; |
| 28 } |
23 | 29 |
24 bool SyncAPIBridgedPost::Init(const char* path, | 30 bool SyncAPIBridgedConnection::Init(const char* path, |
25 const std::string& auth_token, | 31 const std::string& auth_token, |
26 const std::string& payload, | 32 const std::string& payload, |
27 HttpResponse* response) { | 33 HttpResponse* response) { |
28 std::string sync_server; | 34 std::string sync_server; |
29 int sync_server_port = 0; | 35 int sync_server_port = 0; |
30 bool use_ssl = false; | 36 bool use_ssl = false; |
31 GetServerParams(&sync_server, &sync_server_port, &use_ssl); | 37 GetServerParams(&sync_server, &sync_server_port, &use_ssl); |
32 std::string connection_url = MakeConnectionURL(sync_server, path, use_ssl); | 38 std::string connection_url = MakeConnectionURL(sync_server, path, use_ssl); |
33 | 39 |
34 HttpPostProviderInterface* http = factory_->Create(); | 40 HttpPostProviderInterface* http = post_provider_; |
35 http->SetUserAgent(scm_->user_agent().c_str()); | 41 http->SetUserAgent(scm_->user_agent().c_str()); |
36 http->SetURL(connection_url.c_str(), sync_server_port); | 42 http->SetURL(connection_url.c_str(), sync_server_port); |
37 | 43 |
38 if (!auth_token.empty()) { | 44 if (!auth_token.empty()) { |
39 std::string headers; | 45 std::string headers; |
40 if (browser_sync::IsUsingOAuth()) { | 46 if (browser_sync::IsUsingOAuth()) { |
41 headers = "Authorization: OAuth " + auth_token; | 47 headers = "Authorization: OAuth " + auth_token; |
42 } else { | 48 } else { |
43 headers = "Authorization: GoogleLogin auth=" + auth_token; | 49 headers = "Authorization: GoogleLogin auth=" + auth_token; |
44 } | 50 } |
45 http->SetExtraRequestHeaders(headers.c_str()); | 51 http->SetExtraRequestHeaders(headers.c_str()); |
46 } | 52 } |
47 | 53 |
48 // Must be octet-stream, or the payload may be parsed for a cookie. | 54 // Must be octet-stream, or the payload may be parsed for a cookie. |
49 http->SetPostPayload("application/octet-stream", payload.length(), | 55 http->SetPostPayload("application/octet-stream", payload.length(), |
50 payload.data()); | 56 payload.data()); |
51 | 57 |
52 // Issue the POST, blocking until it finishes. | 58 // Issue the POST, blocking until it finishes. |
53 int os_error_code = 0; | 59 int os_error_code = 0; |
54 int response_code = 0; | 60 int response_code = 0; |
55 if (!http->MakeSynchronousPost(&os_error_code, &response_code)) { | 61 if (!http->MakeSynchronousPost(&os_error_code, &response_code)) { |
56 VLOG(1) << "Http POST failed, error returns: " << os_error_code; | 62 VLOG(1) << "Http POST failed, error returns: " << os_error_code; |
57 response->server_status = HttpResponse::IO_ERROR; | 63 response->server_status = os_error_code == net::ERR_ABORTED ? |
58 factory_->Destroy(http); | 64 HttpResponse::CONNECTION_UNAVAILABLE : HttpResponse::IO_ERROR; |
59 return false; | 65 return false; |
60 } | 66 } |
61 | 67 |
62 // We got a server response, copy over response codes and content. | 68 // We got a server response, copy over response codes and content. |
63 response->response_code = response_code; | 69 response->response_code = response_code; |
64 response->content_length = | 70 response->content_length = |
65 static_cast<int64>(http->GetResponseContentLength()); | 71 static_cast<int64>(http->GetResponseContentLength()); |
66 response->payload_length = | 72 response->payload_length = |
67 static_cast<int64>(http->GetResponseContentLength()); | 73 static_cast<int64>(http->GetResponseContentLength()); |
68 if (response->response_code < 400) | 74 if (response->response_code < 400) |
69 response->server_status = HttpResponse::SERVER_CONNECTION_OK; | 75 response->server_status = HttpResponse::SERVER_CONNECTION_OK; |
70 else if (response->response_code == RC_UNAUTHORIZED) | 76 else if (response->response_code == RC_UNAUTHORIZED) |
71 response->server_status = HttpResponse::SYNC_AUTH_ERROR; | 77 response->server_status = HttpResponse::SYNC_AUTH_ERROR; |
72 else | 78 else |
73 response->server_status = HttpResponse::SYNC_SERVER_ERROR; | 79 response->server_status = HttpResponse::SYNC_SERVER_ERROR; |
74 | 80 |
75 response->update_client_auth_header = | 81 response->update_client_auth_header = |
76 http->GetResponseHeaderValue("Update-Client-Auth"); | 82 http->GetResponseHeaderValue("Update-Client-Auth"); |
77 | 83 |
78 // Write the content into our buffer. | 84 // Write the content into our buffer. |
79 buffer_.assign(http->GetResponseContent(), http->GetResponseContentLength()); | 85 buffer_.assign(http->GetResponseContent(), http->GetResponseContentLength()); |
| 86 return true; |
| 87 } |
80 | 88 |
81 // We're done with the HttpPostProvider. | 89 void SyncAPIBridgedConnection::Abort() { |
82 factory_->Destroy(http); | 90 DCHECK(post_provider_); |
83 return true; | 91 post_provider_->Abort(); |
84 } | 92 } |
85 | 93 |
86 SyncAPIServerConnectionManager::SyncAPIServerConnectionManager( | 94 SyncAPIServerConnectionManager::SyncAPIServerConnectionManager( |
87 const std::string& server, | 95 const std::string& server, |
88 int port, | 96 int port, |
89 bool use_ssl, | 97 bool use_ssl, |
90 const std::string& client_version, | 98 const std::string& client_version, |
91 HttpPostProviderFactory* factory) | 99 HttpPostProviderFactory* factory) |
92 : ServerConnectionManager(server, port, use_ssl, client_version), | 100 : ServerConnectionManager(server, port, use_ssl, client_version), |
93 post_provider_factory_(factory) { | 101 post_provider_factory_(factory) { |
94 DCHECK(post_provider_factory_.get()); | 102 DCHECK(post_provider_factory_.get()); |
95 } | 103 } |
96 | 104 |
97 SyncAPIServerConnectionManager::~SyncAPIServerConnectionManager() {} | 105 SyncAPIServerConnectionManager::~SyncAPIServerConnectionManager() {} |
98 | 106 |
99 browser_sync::ServerConnectionManager::Post* | 107 browser_sync::ServerConnectionManager::Connection* |
100 SyncAPIServerConnectionManager::MakePost() { | 108 SyncAPIServerConnectionManager::MakeConnection() { |
101 return new SyncAPIBridgedPost(this, post_provider_factory_.get()); | 109 return new SyncAPIBridgedConnection(this, post_provider_factory_.get()); |
102 } | 110 } |
103 | 111 |
104 } // namespace sync_api | 112 } // namespace sync_api |
OLD | NEW |