// 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/callback_helpers.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; request_context_getter_ = new remoting::URLRequestContextGetter( base::ThreadTaskRunnerHandle::Get(), // network_runner base::ThreadTaskRunnerHandle::Get()); // file_runner request_ = 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; base::ResetAndReturn(&remote_host_info_callback_).Run(remote_host_info); return; } std::string response_string; if (!request_->GetResponseAsString(&response_string)) { LOG(ERROR) << "Failed to retrieve RemoteHostInfo response data"; base::ResetAndReturn(&remote_host_info_callback_).Run(remote_host_info); return; } scoped_ptr 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"; base::ResetAndReturn(&remote_host_info_callback_).Run(remote_host_info); 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"; base::ResetAndReturn(&remote_host_info_callback_).Run(remote_host_info); 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); } base::ResetAndReturn(&remote_host_info_callback_).Run(remote_host_info); } } // namespace test } // namespace remoting