blob: e7dc0958da360cdffa482b6213c1a47aa404e7a3 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "remoting/test/remote_host_info_fetcher.h"
#include "base/bind.h"
#include "base/json/json_reader.h"
#include "base/json/json_writer.h"
#include "base/logging.h"
#include "base/message_loop/message_loop.h"
#include "base/strings/stringprintf.h"
#include "base/thread_task_runner_handle.h"
#include "base/values.h"
#include "net/http/http_response_headers.h"
#include "net/http/http_status_code.h"
#include "net/url_request/url_fetcher.h"
#include "remoting/base/url_request_context_getter.h"
namespace {
const char kRequestTestOrigin[] =
"Origin: chrome-extension://ljacajndfccfgnfohlgkdphmbnpkjflk";
}
namespace remoting {
namespace test {
RemoteHostInfoFetcher::RemoteHostInfoFetcher() {}
RemoteHostInfoFetcher::~RemoteHostInfoFetcher() {}
bool RemoteHostInfoFetcher::RetrieveRemoteHostInfo(
const std::string& application_id,
const std::string& access_token,
ServiceEnvironment service_environment,
const RemoteHostInfoCallback& callback) {
DCHECK(!application_id.empty());
DCHECK(!access_token.empty());
DCHECK(!callback.is_null());
DCHECK(remote_host_info_callback_.is_null());
DVLOG(2) << "RemoteHostInfoFetcher::RetrieveRemoteHostInfo() called";
std::string service_url;
switch (service_environment) {
case kDeveloperEnvironment:
DVLOG(1) << "Configuring service request for dev environment";
service_url = base::StringPrintf(kDevServiceEnvironmentUrlFormat,
application_id.c_str());
break;
case kTestingEnvironment:
DVLOG(1) << "Configuring service request for test environment";
service_url = base::StringPrintf(kTestServiceEnvironmentUrlFormat,
application_id.c_str());
break;
default:
LOG(ERROR) << "Unrecognized service type: " << service_environment;
return false;
}
remote_host_info_callback_ = callback;
scoped_refptr<remoting::URLRequestContextGetter> request_context_getter;
request_context_getter = new remoting::URLRequestContextGetter(
base::ThreadTaskRunnerHandle::Get(), // network_runner
base::ThreadTaskRunnerHandle::Get()); // file_runner
request_.reset(
net::URLFetcher::Create(GURL(service_url), net::URLFetcher::POST, this));
request_->SetRequestContext(request_context_getter.get());
request_->AddExtraRequestHeader("Authorization: OAuth " + access_token);
request_->AddExtraRequestHeader(kRequestTestOrigin);
request_->SetUploadData("application/json; charset=UTF-8", "{}");
request_->Start();
return true;
}
void RemoteHostInfoFetcher::OnURLFetchComplete(const net::URLFetcher* source) {
DCHECK(source);
DVLOG(2) << "URL Fetch Completed for: " << source->GetOriginalURL();
RemoteHostInfo remote_host_info;
int response_code = request_->GetResponseCode();
if (response_code != net::HTTP_OK) {
LOG(ERROR) << "RemoteHostInfo request failed with error code: "
<< response_code;
remote_host_info_callback_.Run(remote_host_info);
remote_host_info_callback_.Reset();
return;
}
std::string response_string;
if (!request_->GetResponseAsString(&response_string)) {
LOG(ERROR) << "Failed to retrieve RemoteHostInfo response data";
remote_host_info_callback_.Run(remote_host_info);
remote_host_info_callback_.Reset();
return;
}
scoped_ptr<base::Value> response_value(
base::JSONReader::Read(response_string));
if (!response_value ||
!response_value->IsType(base::Value::TYPE_DICTIONARY)) {
LOG(ERROR) << "Failed to parse response string to JSON";
remote_host_info_callback_.Run(remote_host_info);
remote_host_info_callback_.Reset();
return;
}
std::string remote_host_status;
const base::DictionaryValue* response;
if (response_value->GetAsDictionary(&response)) {
response->GetString("status", &remote_host_status);
} else {
LOG(ERROR) << "Failed to convert parsed JSON to a dictionary object";
remote_host_info_callback_.Run(remote_host_info);
remote_host_info_callback_.Reset();
return;
}
remote_host_info.SetRemoteHostStatusFromString(remote_host_status);
if (remote_host_info.IsReadyForConnection()) {
response->GetString("host.applicationId", &remote_host_info.application_id);
response->GetString("host.hostId", &remote_host_info.host_id);
response->GetString("hostJid", &remote_host_info.host_jid);
response->GetString("authorizationCode",
&remote_host_info.authorization_code);
response->GetString("sharedSecret", &remote_host_info.shared_secret);
}
remote_host_info_callback_.Run(remote_host_info);
remote_host_info_callback_.Reset();
}
} // namespace test
} // namespace remoting