summaryrefslogtreecommitdiffstats
path: root/remoting/test/app_remoting_report_issue_request.cc
blob: 7a10edd3836191430d251b7caa0f23c781179940 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
// 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/app_remoting_report_issue_request.h"

#include "base/bind.h"
#include "base/callback_helpers.h"
#include "base/logging.h"
#include "base/thread_task_runner_handle.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 {

AppRemotingReportIssueRequest::AppRemotingReportIssueRequest() {
}

AppRemotingReportIssueRequest::~AppRemotingReportIssueRequest() {
}

bool AppRemotingReportIssueRequest::Start(
    const std::string& application_id,
    const std::string& host_id,
    const std::string& access_token,
    ServiceEnvironment service_environment,
    bool abandon_host,
    base::Closure done_callback) {
  DCHECK(request_complete_callback_.is_null()) << "Request pending";

  VLOG(2) << "AppRemotingReportIssueRequest::Start() called";

  std::string service_url(
      GetReportIssueUrl(application_id, host_id, service_environment));
  if (service_url.empty()) {
    LOG(ERROR) << "Unrecognized service type: " << service_environment;
    return false;
  }
  VLOG(1) << "Sending Report Issue service request to: " << service_url;

  request_complete_callback_ = done_callback;

  request_context_getter_ = new remoting::URLRequestContextGetter(
      base::ThreadTaskRunnerHandle::Get(),   // network_runner
      base::ThreadTaskRunnerHandle::Get());  // file_runner

  std::string upload_data = abandon_host ? "{ 'abandonHost': 'true' }" : "{}";

  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", upload_data);
  request_->Start();

  return true;
}

void AppRemotingReportIssueRequest::OnURLFetchComplete(
    const net::URLFetcher* source) {
  VLOG(2) << "URL Fetch Completed for: " << source->GetOriginalURL();

  int response_code = request_->GetResponseCode();
  if (response_code != net::HTTP_OK && response_code != net::HTTP_NO_CONTENT) {
    LOG(ERROR) << "ReportIssue request failed with error code: "
               << response_code;
  }

  base::ResetAndReturn(&request_complete_callback_).Run();
}

}  // namespace test
}  // namespace remoting