1558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// found in the LICENSE file.
4558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
5558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "cloud_print/gcp20/prototype/cloud_print_request.h"
6558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
7558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/bind.h"
8558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/command_line.h"
9558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/message_loop/message_loop.h"
10558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/strings/stringprintf.h"
11558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/time/time.h"
12558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "net/base/load_flags.h"
13558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "net/http/http_status_code.h"
14558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "net/url_request/url_request_context.h"
15558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "net/url_request/url_request_context_getter.h"
16558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
17558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochusing net::URLFetcher;
18558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochusing base::MessageLoop;
19558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
20558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochnamespace {
21558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
22558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochconst uint32 kDefaultTimeout = 20;  // in seconds
23558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
24558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}  // namespace
25558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
26558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochCloudPrintRequest::CloudPrintRequest(const GURL& url,
27558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                     URLFetcher::RequestType method,
28558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                     Delegate* delegate)
29558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    : fetcher_(URLFetcher::Create(url, method, this)),
30558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      delegate_(delegate) {
31558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  int load_flags = fetcher_->GetLoadFlags();
32558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  load_flags |= net::LOAD_DO_NOT_SEND_COOKIES;
33558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  load_flags |= net::LOAD_DO_NOT_SAVE_COOKIES;
34558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  fetcher_->SetLoadFlags(load_flags);
35558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
36558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  fetcher_->AddExtraRequestHeader("X-CloudPrint-Proxy: \"\"");
37558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
38558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
39558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochCloudPrintRequest::~CloudPrintRequest() {
40558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
41558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
42558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochscoped_ptr<CloudPrintRequest> CloudPrintRequest::CreateGet(
43558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    const GURL& url,
44558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    Delegate* delegate) {
45558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  return scoped_ptr<CloudPrintRequest>(
46558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      new CloudPrintRequest(url, URLFetcher::GET, delegate));
47558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
48558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
49558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochscoped_ptr<CloudPrintRequest> CloudPrintRequest::CreatePost(
50558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    const GURL& url,
51558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    const std::string& content,
52558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    const std::string& mimetype,
53558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    Delegate* delegate) {
54558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  scoped_ptr<CloudPrintRequest> request(
55558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      new CloudPrintRequest(url, URLFetcher::POST, delegate));
56558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  request->fetcher_->SetUploadData(mimetype, content);
57558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  return request.Pass();
58558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
59558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
60558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid CloudPrintRequest::Run(
61558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    const std::string& access_token,
62558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    scoped_refptr<net::URLRequestContextGetter> context_getter) {
63558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (!access_token.empty())
64558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    fetcher_->AddExtraRequestHeader(base::StringPrintf(
65558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        "Authorization: Bearer \"%s\"", access_token.c_str()));
66558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  fetcher_->SetRequestContext(context_getter.get());
68558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  fetcher_->Start();
69558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
70558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  MessageLoop::current()->PostDelayedTask(
71558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      FROM_HERE,
72558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      base::Bind(&CloudPrintRequest::OnRequestTimeout, AsWeakPtr()),
73558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      base::TimeDelta::FromSeconds(kDefaultTimeout));
74558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
75558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
76558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid CloudPrintRequest::AddHeader(const std::string& header) {
77558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  fetcher_->AddExtraRequestHeader(header);
78558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
79558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
80558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid CloudPrintRequest::OnRequestTimeout() {
81558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (!fetcher_)
82558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return;
83558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  fetcher_.reset();
84558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  LOG(WARNING) << "Request timeout reached.";
85558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
86558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  DCHECK(delegate_);
87558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  delegate_->OnFetchTimeoutReached();  // After this object can be deleted.
88558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                       // Do *NOT* access members after this
89558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                       // call.
90558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
91558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
92558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid CloudPrintRequest::OnURLFetchComplete(const URLFetcher* source) {
93558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  DCHECK(source == fetcher_.get());
94558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  std::string response;
95558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  source->GetResponseAsString(&response);
96558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
97558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  int http_code = fetcher_->GetResponseCode();
98558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  fetcher_.reset();
99558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  VLOG(3) << response;
100558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
101558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  DCHECK(delegate_);
102558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (http_code == net::HTTP_OK) {
103558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    delegate_->OnFetchComplete(response);  // After this object can be deleted.
104558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                           // Do *NOT* access members after
105558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                           // this call.
106558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
107558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  } else {
1083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // TODO(maksymb): Add Privet |server_http_code| and |server_api| support in
1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // case of server errors.
1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    NOTIMPLEMENTED() << "HTTP code: " << http_code;
111558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    delegate_->OnFetchError("dummy", -1, http_code);  // After this object can
112558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                                      // be deleted.
113558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                                      // Do *NOT* access members
114558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                                      // after this call.
115558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
116558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
117558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
118