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