OLD | NEW |
| (Empty) |
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/remoting/directory_add_request.h" | |
6 | |
7 #include <vector> | |
8 | |
9 #include "base/json/json_reader.h" | |
10 #include "base/json/json_writer.h" | |
11 #include "base/values.h" | |
12 #include "chrome/common/net/http_return.h" | |
13 #include "net/http/http_request_headers.h" | |
14 #include "net/url_request/url_request_context_getter.h" | |
15 #include "net/url_request/url_request_status.h" | |
16 | |
17 namespace remoting { | |
18 | |
19 static const char kRemotingDirectoryUrl[] = | |
20 "https://www.googleapis.com/chromoting/v1/@me/hosts"; | |
21 | |
22 DirectoryAddRequest::DirectoryAddRequest(net::URLRequestContextGetter* getter) | |
23 : getter_(getter) { | |
24 } | |
25 | |
26 DirectoryAddRequest::~DirectoryAddRequest() { | |
27 DCHECK(!fetcher_.get()) << "URLFetcher not destroyed."; | |
28 } | |
29 | |
30 void DirectoryAddRequest::AddHost(const remoting::ChromotingHostInfo& host_info, | |
31 const std::string& auth_token, | |
32 DoneCallback* done_callback) { | |
33 DCHECK(done_callback); | |
34 done_callback_.reset(done_callback); | |
35 | |
36 // Prepare the parameters for the request. | |
37 DictionaryValue data; | |
38 data.SetString("hostId", host_info.host_id); | |
39 data.SetString("hostName", host_info.hostname); | |
40 data.SetString("publicKey", host_info.public_key); | |
41 | |
42 // Generate the final json query. | |
43 DictionaryValue args; | |
44 args.Set("data", data.DeepCopy()); | |
45 std::string request_content; | |
46 base::JSONWriter::Write(&args, false, &request_content); | |
47 | |
48 // Prepare the HTTP header for authentication. | |
49 net::HttpRequestHeaders headers; | |
50 headers.SetHeader("Authorization", "GoogleLogin auth=" + auth_token); | |
51 fetcher_.reset( | |
52 new URLFetcher(GURL(kRemotingDirectoryUrl), URLFetcher::POST, this)); | |
53 fetcher_->set_request_context(getter_); | |
54 fetcher_->set_upload_data("application/json", request_content); | |
55 fetcher_->set_extra_request_headers(headers.ToString()); | |
56 | |
57 // And then start the request. | |
58 fetcher_->Start(); | |
59 } | |
60 | |
61 void DirectoryAddRequest::OnURLFetchComplete( | |
62 const URLFetcher* source, | |
63 const GURL& url, | |
64 const net::URLRequestStatus& status, | |
65 int response_code, | |
66 const net::ResponseCookies& cookies, | |
67 const std::string& data) { | |
68 DCHECK_EQ(source, fetcher_.get()); | |
69 | |
70 // Destroy the fetcher after the response has been received. | |
71 fetcher_.reset(); | |
72 | |
73 Result result; | |
74 std::string error_message; | |
75 | |
76 if (status.is_success()) { | |
77 DictionaryValue* response = NULL; | |
78 scoped_ptr<Value> response_json(base::JSONReader::Read(data, true)); | |
79 if (response_json != NULL && | |
80 response_json->IsType(Value::TYPE_DICTIONARY)) { | |
81 response = static_cast<DictionaryValue*>(response_json.get()); | |
82 response->GetString("error.message", &error_message); | |
83 } | |
84 | |
85 switch (response_code) { | |
86 case RC_REQUEST_OK: | |
87 result = SUCCESS; | |
88 break; | |
89 | |
90 case RC_BAD_REQUEST: | |
91 // TODO(sergeyu): Implement duplicate error detection that doesn't | |
92 // depend on error message. | |
93 if (error_message.find("duplicate") != std::string::npos) { | |
94 result = ERROR_EXISTS; | |
95 } else { | |
96 result = ERROR_INVALID_REQUEST; | |
97 } | |
98 break; | |
99 | |
100 case RC_UNAUTHORIZED: | |
101 result = ERROR_AUTH; | |
102 break; | |
103 | |
104 case RC_INTERNAL_SERVER_ERROR: | |
105 result = ERROR_SERVER; | |
106 break; | |
107 | |
108 default: | |
109 result = ERROR_OTHER; | |
110 } | |
111 } else { | |
112 result = ERROR_OTHER; | |
113 } | |
114 | |
115 if (result != SUCCESS) { | |
116 LOG(WARNING) << "Received error when trying to register Chromoting host. " | |
117 << "status.is_success(): " << status.is_success() | |
118 << " response_code: " << response_code | |
119 << " error_message: " << error_message; | |
120 } | |
121 | |
122 done_callback_->Run(result, error_message); | |
123 } | |
124 | |
125 } // namespace remoting | |
OLD | NEW |