Commit 9c330c22 authored by Mark Pilgrim's avatar Mark Pilgrim Committed by Commit Bot

(reland) Migrate BrandcodeConfigFetcher to SimpleURLLoader

Relanding https://chromium-review.googlesource.com/c/chromium/src/+/1026290
with fix for build breakage (missing include file was not caught by
local build or any default trybot because it was behind a DEFINE) and
one other minor suggestion by leiz (use base::MakeRefCounted for
head.headers).

Bug: 773295
Change-Id: I25d9327a893debf35ccbc7d4f64b84b6d6e84267
Reviewed-on: https://chromium-review.googlesource.com/1031316Reviewed-by: default avatarLei Zhang <thestig@chromium.org>
Reviewed-by: default avatarMatt Menke <mmenke@chromium.org>
Commit-Queue: Mark Pilgrim <pilgrim@chromium.org>
Cr-Commit-Position: refs/heads/master@{#554393}
parent 4f2a1530
...@@ -61,8 +61,9 @@ include_rules = [ ...@@ -61,8 +61,9 @@ include_rules = [
"+services/metrics/public", "+services/metrics/public",
"+services/network/ignore_errors_cert_verifier.h", "+services/network/ignore_errors_cert_verifier.h",
"+services/network/network_service.h", "+services/network/network_service.h",
"+services/network/url_request_context_owner.h",
"+services/network/public", "+services/network/public",
"+services/network/test",
"+services/network/url_request_context_owner.h",
"+services/network/url_request_context_builder_mojo.h", "+services/network/url_request_context_builder_mojo.h",
"+services/preferences/public/cpp", "+services/preferences/public/cpp",
"+services/preferences/public/mojom", "+services/preferences/public/mojom",
......
...@@ -16,8 +16,9 @@ ...@@ -16,8 +16,9 @@
#include "net/base/load_flags.h" #include "net/base/load_flags.h"
#include "net/http/http_response_headers.h" #include "net/http/http_response_headers.h"
#include "net/traffic_annotation/network_traffic_annotation.h" #include "net/traffic_annotation/network_traffic_annotation.h"
#include "net/url_request/url_fetcher.h" #include "services/network/public/cpp/resource_request.h"
#include "net/url_request/url_request_status.h" #include "services/network/public/cpp/simple_url_loader.h"
#include "services/network/public/mojom/url_loader_factory.mojom.h"
namespace { namespace {
...@@ -139,9 +140,11 @@ bool XmlConfigParser::IsParsingData() const { ...@@ -139,9 +140,11 @@ bool XmlConfigParser::IsParsingData() const {
} // namespace } // namespace
BrandcodeConfigFetcher::BrandcodeConfigFetcher(const FetchCallback& callback, BrandcodeConfigFetcher::BrandcodeConfigFetcher(
const GURL& url, network::mojom::URLLoaderFactory* url_loader_factory,
const std::string& brandcode) const FetchCallback& callback,
const GURL& url,
const std::string& brandcode)
: fetch_callback_(callback) { : fetch_callback_(callback) {
DCHECK(!brandcode.empty()); DCHECK(!brandcode.empty());
net::NetworkTrafficAnnotationTag traffic_annotation = net::NetworkTrafficAnnotationTag traffic_annotation =
...@@ -166,17 +169,21 @@ BrandcodeConfigFetcher::BrandcodeConfigFetcher(const FetchCallback& callback, ...@@ -166,17 +169,21 @@ BrandcodeConfigFetcher::BrandcodeConfigFetcher(const FetchCallback& callback,
"Not implemented, considered not useful as enterprises don't need " "Not implemented, considered not useful as enterprises don't need "
"to install Chrome in a non-organic fashion." "to install Chrome in a non-organic fashion."
})"); })");
config_fetcher_ = auto resource_request = std::make_unique<network::ResourceRequest>();
net::URLFetcher::Create(0 /* ID used for testing */, url, resource_request->url = url;
net::URLFetcher::POST, this, traffic_annotation); resource_request->load_flags = net::LOAD_DO_NOT_SEND_COOKIES |
config_fetcher_->SetRequestContext( net::LOAD_DO_NOT_SAVE_COOKIES |
g_browser_process->system_request_context()); net::LOAD_DISABLE_CACHE;
config_fetcher_->SetUploadData("text/xml", GetUploadData(brandcode)); resource_request->method = "POST";
config_fetcher_->AddExtraRequestHeader("Accept: text/xml"); resource_request->headers.SetHeader("Accept", "text/xml");
config_fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SEND_COOKIES | simple_url_loader_ = network::SimpleURLLoader::Create(
net::LOAD_DO_NOT_SAVE_COOKIES | std::move(resource_request), traffic_annotation);
net::LOAD_DISABLE_CACHE); simple_url_loader_->AttachStringForUpload(GetUploadData(brandcode),
config_fetcher_->Start(); "text/xml");
simple_url_loader_->DownloadToStringOfUnboundedSizeUntilCrashAndDie(
url_loader_factory,
base::BindOnce(&BrandcodeConfigFetcher::OnSimpleLoaderComplete,
base::Unretained(this)));
// Abort the download attempt if it takes too long. // Abort the download attempt if it takes too long.
download_timer_.Start(FROM_HERE, download_timer_.Start(FROM_HERE,
base::TimeDelta::FromSeconds(kDownloadTimeoutSec), base::TimeDelta::FromSeconds(kDownloadTimeoutSec),
...@@ -190,31 +197,22 @@ void BrandcodeConfigFetcher::SetCallback(const FetchCallback& callback) { ...@@ -190,31 +197,22 @@ void BrandcodeConfigFetcher::SetCallback(const FetchCallback& callback) {
fetch_callback_ = callback; fetch_callback_ = callback;
} }
void BrandcodeConfigFetcher::OnURLFetchComplete(const net::URLFetcher* source) { void BrandcodeConfigFetcher::OnSimpleLoaderComplete(
if (source != config_fetcher_.get()) { std::unique_ptr<std::string> response_body) {
NOTREACHED() << "Callback from foreign URL fetcher"; if (response_body && simple_url_loader_->ResponseInfo() &&
return; simple_url_loader_->ResponseInfo()->mime_type == "text/xml") {
}
std::string response_string;
std::string mime_type;
if (config_fetcher_ &&
config_fetcher_->GetStatus().is_success() &&
config_fetcher_->GetResponseCode() == 200 &&
config_fetcher_->GetResponseHeaders()->GetMimeType(&mime_type) &&
mime_type == "text/xml" &&
config_fetcher_->GetResponseAsString(&response_string)) {
std::string master_prefs; std::string master_prefs;
XmlConfigParser::Parse(response_string, &master_prefs); XmlConfigParser::Parse(*response_body, &master_prefs);
default_settings_.reset(new BrandcodedDefaultSettings(master_prefs)); default_settings_.reset(new BrandcodedDefaultSettings(master_prefs));
} }
config_fetcher_.reset(); simple_url_loader_.reset();
download_timer_.Stop(); download_timer_.Stop();
base::ResetAndReturn(&fetch_callback_).Run(); base::ResetAndReturn(&fetch_callback_).Run();
} }
void BrandcodeConfigFetcher::OnDownloadTimeout() { void BrandcodeConfigFetcher::OnDownloadTimeout() {
if (config_fetcher_) { if (simple_url_loader_) {
config_fetcher_.reset(); simple_url_loader_.reset();
base::ResetAndReturn(&fetch_callback_).Run(); base::ResetAndReturn(&fetch_callback_).Run();
} }
} }
...@@ -12,23 +12,30 @@ ...@@ -12,23 +12,30 @@
#include "base/callback.h" #include "base/callback.h"
#include "base/macros.h" #include "base/macros.h"
#include "base/timer/timer.h" #include "base/timer/timer.h"
#include "net/url_request/url_fetcher_delegate.h"
class BrandcodedDefaultSettings; class BrandcodedDefaultSettings;
class GURL; class GURL;
namespace network {
class SimpleURLLoader;
namespace mojom {
class URLLoaderFactory;
}
} // namespace network
// BrandcodeConfigFetcher fetches and parses the xml containing the brandcoded // BrandcodeConfigFetcher fetches and parses the xml containing the brandcoded
// default settings. Caller should provide a FetchCallback. // default settings. Caller should provide a FetchCallback.
class BrandcodeConfigFetcher : public net::URLFetcherDelegate { class BrandcodeConfigFetcher {
public: public:
typedef base::Callback<void ()> FetchCallback; typedef base::Callback<void ()> FetchCallback;
BrandcodeConfigFetcher(const FetchCallback& callback, BrandcodeConfigFetcher(network::mojom::URLLoaderFactory* url_loader_factory,
const FetchCallback& callback,
const GURL& url, const GURL& url,
const std::string& brandcode); const std::string& brandcode);
~BrandcodeConfigFetcher() override; ~BrandcodeConfigFetcher();
bool IsActive() const { return !!config_fetcher_; } bool IsActive() const { return !!simple_url_loader_; }
std::unique_ptr<BrandcodedDefaultSettings> GetSettings() { std::unique_ptr<BrandcodedDefaultSettings> GetSettings() {
return std::move(default_settings_); return std::move(default_settings_);
...@@ -38,8 +45,7 @@ class BrandcodeConfigFetcher : public net::URLFetcherDelegate { ...@@ -38,8 +45,7 @@ class BrandcodeConfigFetcher : public net::URLFetcherDelegate {
void SetCallback(const FetchCallback& callback); void SetCallback(const FetchCallback& callback);
private: private:
// net::URLFetcherDelegate: void OnSimpleLoaderComplete(std::unique_ptr<std::string> response_body);
void OnURLFetchComplete(const net::URLFetcher* source) override;
void OnDownloadTimeout(); void OnDownloadTimeout();
...@@ -51,7 +57,7 @@ class BrandcodeConfigFetcher : public net::URLFetcherDelegate { ...@@ -51,7 +57,7 @@ class BrandcodeConfigFetcher : public net::URLFetcherDelegate {
FetchCallback fetch_callback_; FetchCallback fetch_callback_;
// Helper to fetch the online config file. // Helper to fetch the online config file.
std::unique_ptr<net::URLFetcher> config_fetcher_; std::unique_ptr<network::SimpleURLLoader> simple_url_loader_;
// Fetched settings. // Fetched settings.
std::unique_ptr<BrandcodedDefaultSettings> default_settings_; std::unique_ptr<BrandcodedDefaultSettings> default_settings_;
......
...@@ -12,8 +12,10 @@ ...@@ -12,8 +12,10 @@
#include <utility> #include <utility>
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/scoped_refptr.h"
#include "base/run_loop.h" #include "base/run_loop.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "base/test/bind_test_util.h"
#include "base/test/scoped_path_override.h" #include "base/test/scoped_path_override.h"
#include "build/build_config.h" #include "build/build_config.h"
#include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
...@@ -45,8 +47,9 @@ ...@@ -45,8 +47,9 @@
#include "extensions/common/manifest_constants.h" #include "extensions/common/manifest_constants.h"
#include "net/http/http_response_headers.h" #include "net/http/http_response_headers.h"
#include "net/http/http_status_code.h" #include "net/http/http_status_code.h"
#include "net/url_request/test_url_fetcher_factory.h" #include "net/http/http_util.h"
#include "net/url_request/url_request_status.h" #include "services/network/public/cpp/resource_request.h"
#include "services/network/test/test_url_loader_factory.h"
#include "url/gurl.h" #include "url/gurl.h"
#if defined(OS_WIN) #if defined(OS_WIN)
...@@ -174,46 +177,31 @@ content::WebContents* PinnedTabsResetTest::CreateWebContents() { ...@@ -174,46 +177,31 @@ content::WebContents* PinnedTabsResetTest::CreateWebContents() {
// ConfigParserTest ----------------------------------------------------------- // ConfigParserTest -----------------------------------------------------------
// URLFetcher delegate that simply records the upload data.
struct URLFetcherRequestListener : net::URLFetcherDelegate {
URLFetcherRequestListener();
~URLFetcherRequestListener() override;
void OnURLFetchComplete(const net::URLFetcher* source) override;
std::string upload_data;
net::URLFetcherDelegate* real_delegate;
};
URLFetcherRequestListener::URLFetcherRequestListener()
: real_delegate(NULL) {
}
URLFetcherRequestListener::~URLFetcherRequestListener() {
}
void URLFetcherRequestListener::OnURLFetchComplete(
const net::URLFetcher* source) {
const net::TestURLFetcher* test_fetcher =
static_cast<const net::TestURLFetcher*>(source);
upload_data = test_fetcher->upload_data();
DCHECK(real_delegate);
real_delegate->OnURLFetchComplete(source);
}
class ConfigParserTest : public testing::Test { class ConfigParserTest : public testing::Test {
protected: protected:
ConfigParserTest(); ConfigParserTest();
~ConfigParserTest() override; ~ConfigParserTest() override;
std::string GetBodyFromRequest(const network::ResourceRequest& request) {
auto body = request.request_body;
if (!body)
return std::string();
CHECK_EQ(1u, body->elements()->size());
auto& element = body->elements()->at(0);
CHECK_EQ(network::DataElement::TYPE_BYTES, element.type());
return std::string(element.bytes(), element.length());
}
std::unique_ptr<BrandcodeConfigFetcher> WaitForRequest(const GURL& url); std::unique_ptr<BrandcodeConfigFetcher> WaitForRequest(const GURL& url);
net::FakeURLFetcherFactory& factory() { return factory_; } network::TestURLLoaderFactory& test_url_loader_factory() {
return test_url_loader_factory_;
}
private: private:
std::unique_ptr<net::FakeURLFetcher> CreateFakeURLFetcher( std::unique_ptr<network::SimpleURLLoader> CreateFakeURLLoader(
const GURL& url, const GURL& url,
net::URLFetcherDelegate* fetcher_delegate,
const std::string& response_data, const std::string& response_data,
net::HttpStatusCode response_code, net::HttpStatusCode response_code,
net::URLRequestStatus::Status status); net::URLRequestStatus::Status status);
...@@ -221,45 +209,31 @@ class ConfigParserTest : public testing::Test { ...@@ -221,45 +209,31 @@ class ConfigParserTest : public testing::Test {
MOCK_METHOD0(Callback, void(void)); MOCK_METHOD0(Callback, void(void));
content::TestBrowserThreadBundle test_browser_thread_bundle_; content::TestBrowserThreadBundle test_browser_thread_bundle_;
URLFetcherRequestListener request_listener_; network::TestURLLoaderFactory test_url_loader_factory_;
net::FakeURLFetcherFactory factory_;
}; };
ConfigParserTest::ConfigParserTest() ConfigParserTest::ConfigParserTest()
: test_browser_thread_bundle_( : test_browser_thread_bundle_(
content::TestBrowserThreadBundle::IO_MAINLOOP), content::TestBrowserThreadBundle::IO_MAINLOOP) {}
factory_(NULL,
base::Bind(&ConfigParserTest::CreateFakeURLFetcher,
base::Unretained(this))) {}
ConfigParserTest::~ConfigParserTest() {} ConfigParserTest::~ConfigParserTest() {}
std::unique_ptr<BrandcodeConfigFetcher> ConfigParserTest::WaitForRequest( std::unique_ptr<BrandcodeConfigFetcher> ConfigParserTest::WaitForRequest(
const GURL& url) { const GURL& url) {
EXPECT_CALL(*this, Callback()); EXPECT_CALL(*this, Callback());
std::string upload_data;
test_url_loader_factory_.SetInterceptor(
base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
upload_data = GetBodyFromRequest(request);
}));
std::unique_ptr<BrandcodeConfigFetcher> fetcher(new BrandcodeConfigFetcher( std::unique_ptr<BrandcodeConfigFetcher> fetcher(new BrandcodeConfigFetcher(
&test_url_loader_factory_,
base::Bind(&ConfigParserTest::Callback, base::Unretained(this)), url, base::Bind(&ConfigParserTest::Callback, base::Unretained(this)), url,
"ABCD")); "ABCD"));
base::RunLoop().RunUntilIdle(); base::RunLoop().RunUntilIdle();
EXPECT_FALSE(fetcher->IsActive()); EXPECT_FALSE(fetcher->IsActive());
// Look for the brand code in the request. // Look for the brand code in the request.
EXPECT_NE(std::string::npos, request_listener_.upload_data.find("ABCD")); EXPECT_NE(std::string::npos, upload_data.find("ABCD"));
return fetcher;
}
std::unique_ptr<net::FakeURLFetcher> ConfigParserTest::CreateFakeURLFetcher(
const GURL& url,
net::URLFetcherDelegate* fetcher_delegate,
const std::string& response_data,
net::HttpStatusCode response_code,
net::URLRequestStatus::Status status) {
request_listener_.real_delegate = fetcher_delegate;
std::unique_ptr<net::FakeURLFetcher> fetcher(new net::FakeURLFetcher(
url, &request_listener_, response_data, response_code, status));
scoped_refptr<net::HttpResponseHeaders> download_headers =
new net::HttpResponseHeaders("");
download_headers->AddHeader("Content-Type: text/xml");
fetcher->set_response_headers(download_headers);
return fetcher; return fetcher;
} }
...@@ -771,8 +745,9 @@ TEST_F(ProfileResetterTest, ResetFewFlags) { ...@@ -771,8 +745,9 @@ TEST_F(ProfileResetterTest, ResetFewFlags) {
// Tries to load unavailable config file. // Tries to load unavailable config file.
TEST_F(ConfigParserTest, NoConnectivity) { TEST_F(ConfigParserTest, NoConnectivity) {
const GURL url("http://test"); const GURL url("http://test");
factory().SetFakeResponse(url, "", net::HTTP_INTERNAL_SERVER_ERROR, test_url_loader_factory().AddResponse(
net::URLRequestStatus::FAILED); url, network::ResourceResponseHead(), "",
network::URLLoaderCompletionStatus(net::HTTP_INTERNAL_SERVER_ERROR));
std::unique_ptr<BrandcodeConfigFetcher> fetcher = WaitForRequest(GURL(url)); std::unique_ptr<BrandcodeConfigFetcher> fetcher = WaitForRequest(GURL(url));
EXPECT_FALSE(fetcher->GetSettings()); EXPECT_FALSE(fetcher->GetSettings());
...@@ -786,8 +761,14 @@ TEST_F(ConfigParserTest, ParseConfig) { ...@@ -786,8 +761,14 @@ TEST_F(ConfigParserTest, ParseConfig) {
ReplaceString(&xml_config, ReplaceString(&xml_config,
"placeholder_for_id", "placeholder_for_id",
"abbaabbaabbaabbaabbaabbaabbaabba"); "abbaabbaabbaabbaabbaabbaabbaabba");
factory().SetFakeResponse(url, xml_config, net::HTTP_OK, network::ResourceResponseHead head;
net::URLRequestStatus::SUCCESS); std::string headers("HTTP/1.1 200 OK\nContent-type: text/xml\n\n");
head.headers = base::MakeRefCounted<net::HttpResponseHeaders>(
net::HttpUtil::AssembleRawHeaders(headers.c_str(), headers.size()));
head.mime_type = "text/xml";
network::URLLoaderCompletionStatus status;
status.decoded_body_length = xml_config.size();
test_url_loader_factory().AddResponse(url, head, xml_config, status);
std::unique_ptr<BrandcodeConfigFetcher> fetcher = WaitForRequest(GURL(url)); std::unique_ptr<BrandcodeConfigFetcher> fetcher = WaitForRequest(GURL(url));
std::unique_ptr<BrandcodedDefaultSettings> settings = fetcher->GetSettings(); std::unique_ptr<BrandcodedDefaultSettings> settings = fetcher->GetSettings();
......
...@@ -9,10 +9,13 @@ ...@@ -9,10 +9,13 @@
#include "base/bind_helpers.h" #include "base/bind_helpers.h"
#include "base/logging.h" #include "base/logging.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/google/google_brand.h" #include "chrome/browser/google/google_brand.h"
#include "chrome/browser/net/system_network_context_manager.h"
#include "chrome/browser/profile_resetter/brandcode_config_fetcher.h" #include "chrome/browser/profile_resetter/brandcode_config_fetcher.h"
#include "chrome/browser/profile_resetter/brandcoded_default_settings.h" #include "chrome/browser/profile_resetter/brandcoded_default_settings.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "services/network/public/mojom/url_loader_factory.mojom.h"
#include "url/gurl.h" #include "url/gurl.h"
namespace safe_browsing { namespace safe_browsing {
...@@ -59,6 +62,8 @@ void DefaultSettingsFetcher::Start() { ...@@ -59,6 +62,8 @@ void DefaultSettingsFetcher::Start() {
std::string brandcode; std::string brandcode;
if (google_brand::GetBrand(&brandcode) && !brandcode.empty()) { if (google_brand::GetBrand(&brandcode) && !brandcode.empty()) {
config_fetcher_.reset(new BrandcodeConfigFetcher( config_fetcher_.reset(new BrandcodeConfigFetcher(
g_browser_process->system_network_context_manager()
->GetURLLoaderFactory(),
base::Bind(&DefaultSettingsFetcher::OnSettingsFetched, base::Bind(&DefaultSettingsFetcher::OnSettingsFetched,
base::Unretained(this)), base::Unretained(this)),
GURL(kOmahaUrl), brandcode)); GURL(kOmahaUrl), brandcode));
......
...@@ -14,7 +14,9 @@ ...@@ -14,7 +14,9 @@
#include "base/time/time.h" #include "base/time/time.h"
#include "base/values.h" #include "base/values.h"
#include "build/build_config.h" #include "build/build_config.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/google/google_brand.h" #include "chrome/browser/google/google_brand.h"
#include "chrome/browser/net/system_network_context_manager.h"
#include "chrome/browser/prefs/chrome_pref_service_factory.h" #include "chrome/browser/prefs/chrome_pref_service_factory.h"
#include "chrome/browser/profile_resetter/brandcode_config_fetcher.h" #include "chrome/browser/profile_resetter/brandcode_config_fetcher.h"
#include "chrome/browser/profile_resetter/brandcoded_default_settings.h" #include "chrome/browser/profile_resetter/brandcoded_default_settings.h"
...@@ -26,6 +28,7 @@ ...@@ -26,6 +28,7 @@
#include "components/prefs/pref_service.h" #include "components/prefs/pref_service.h"
#include "content/public/browser/web_ui.h" #include "content/public/browser/web_ui.h"
#include "content/public/browser/web_ui_data_source.h" #include "content/public/browser/web_ui_data_source.h"
#include "services/network/public/mojom/url_loader_factory.mojom.h"
#include "ui/base/l10n/l10n_util.h" #include "ui/base/l10n/l10n_util.h"
#if defined(OS_CHROMEOS) #if defined(OS_CHROMEOS)
...@@ -212,10 +215,11 @@ void ResetSettingsHandler::OnShowResetProfileDialog( ...@@ -212,10 +215,11 @@ void ResetSettingsHandler::OnShowResetProfileDialog(
if (brandcode_.empty()) if (brandcode_.empty())
return; return;
config_fetcher_.reset(new BrandcodeConfigFetcher( config_fetcher_.reset(new BrandcodeConfigFetcher(
g_browser_process->system_network_context_manager()
->GetURLLoaderFactory(),
base::Bind(&ResetSettingsHandler::OnSettingsFetched, base::Bind(&ResetSettingsHandler::OnSettingsFetched,
base::Unretained(this)), base::Unretained(this)),
GURL("https://tools.google.com/service/update2"), GURL("https://tools.google.com/service/update2"), brandcode_));
brandcode_));
} }
void ResetSettingsHandler::OnHideResetProfileDialog( void ResetSettingsHandler::OnHideResetProfileDialog(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment