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