blob: 0f8989e0973e7218eaac0843f185ccd1f78c3c20 [file] [log] [blame]
// Copyright 2017 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 "components/assist_ranker/ranker_url_fetcher.h"
#include "base/memory/ref_counted.h"
#include "components/data_use_measurement/core/data_use_user_data.h"
#include "net/base/load_flags.h"
#include "net/http/http_status_code.h"
#include "net/traffic_annotation/network_traffic_annotation.h"
#include "net/url_request/url_fetcher.h"
#include "net/url_request/url_request_status.h"
namespace assist_ranker {
namespace {
// Retry parameter for fetching.
const int kMaxRetry = 16;
} // namespace
RankerURLFetcher::RankerURLFetcher() : state_(IDLE), retry_count_(0) {}
RankerURLFetcher::~RankerURLFetcher() {}
bool RankerURLFetcher::Request(
const GURL& url,
const RankerURLFetcher::Callback& callback,
net::URLRequestContextGetter* request_context_getter) {
// This function is not supposed to be called if the previous operation is not
// finished.
if (state_ == REQUESTING) {
NOTREACHED();
return false;
}
if (retry_count_ >= kMaxRetry)
return false;
retry_count_++;
state_ = REQUESTING;
url_ = url;
callback_ = callback;
if (request_context_getter == nullptr)
return false;
net::NetworkTrafficAnnotationTag traffic_annotation =
net::DefineNetworkTrafficAnnotation("ranker_url_fetcher", R"(
semantics {
sender: "AssistRanker"
description:
"Chrome can provide a better UI experience by using machine "
"learning models to determine if we should show you or not an "
"assist prompt. For instance, Chrome may use features such as "
"the detected language of the current page and the past "
"interaction with the TransalteUI to decide whether or not we "
"should offer you to translate this page. Google returns "
"trained machine learning models that will be used to take "
"such decision."
trigger:
"At startup."
data:
"Path to a model. No user data is included."
destination: GOOGLE_OWNED_SERVICE
}
policy {
cookies_allowed: NO
setting:
"NA"
policy_exception_justification:
"Not implemented, considered not necessary as no user data is sent."
})");
// Create and initialize the URL fetcher.
fetcher_ = net::URLFetcher::Create(url_, net::URLFetcher::GET, this,
traffic_annotation);
data_use_measurement::DataUseUserData::AttachToFetcher(
fetcher_.get(),
data_use_measurement::DataUseUserData::MACHINE_INTELLIGENCE);
fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SEND_COOKIES |
net::LOAD_DO_NOT_SAVE_COOKIES);
fetcher_->SetRequestContext(request_context_getter);
// Set retry parameter for HTTP status code 5xx. This doesn't work against
// 106 (net::ERR_INTERNET_DISCONNECTED) and so on.
fetcher_->SetMaxRetriesOn5xx(max_retry_on_5xx_);
fetcher_->Start();
return true;
}
void RankerURLFetcher::OnURLFetchComplete(const net::URLFetcher* source) {
DCHECK(fetcher_.get() == source);
std::string data;
if (source->GetStatus().status() == net::URLRequestStatus::SUCCESS &&
source->GetResponseCode() == net::HTTP_OK) {
state_ = COMPLETED;
source->GetResponseAsString(&data);
} else {
state_ = FAILED;
}
// Transfer URLFetcher's ownership before invoking a callback.
std::unique_ptr<const net::URLFetcher> delete_ptr(fetcher_.release());
callback_.Run(state_ == COMPLETED, data);
}
} // namespace assist_ranker