OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2010 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 "chrome/common/net/url_request_context_getter.h" |
| 14 #include "net/http/http_request_headers.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(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 URLRequestStatus& status, |
| 65 int response_code, |
| 66 const 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 |