From 601c2b0ee9b36e7c73bde9b17baec49b0755f7ea Mon Sep 17 00:00:00 2001 From: Marshall Greenblatt Date: Wed, 30 Oct 2013 17:42:05 +0000 Subject: [PATCH] Set "User-Agent" and "Accept-Language" headers for requests sent using CefURLRequest (issue #1125). git-svn-id: https://chromiumembedded.googlecode.com/svn/trunk@1502 5089003a-bbd8-11dd-ad1f-f1f9622dbc98 --- AUTHORS.txt | 1 + libcef/browser/url_request_context_getter.cc | 42 +++++++++++++++++++- tests/unittests/urlrequest_unittest.cc | 13 ++++-- 3 files changed, 51 insertions(+), 5 deletions(-) diff --git a/AUTHORS.txt b/AUTHORS.txt index d4559e2a4..1b5b1032b 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -25,3 +25,4 @@ Brian Power Corey Lucier Mihai Tica Czarek Tomczak +Felix Bruns diff --git a/libcef/browser/url_request_context_getter.cc b/libcef/browser/url_request_context_getter.cc index 87aa0a0f0..06055ecb2 100644 --- a/libcef/browser/url_request_context_getter.cc +++ b/libcef/browser/url_request_context_getter.cc @@ -29,6 +29,7 @@ #include "chrome/browser/net/proxy_service_factory.h" #include "content/browser/net/sqlite_persistent_cookie_store.h" #include "content/public/browser/browser_thread.h" +#include "content/public/common/content_client.h" #include "content/public/common/content_switches.h" #include "content/public/common/url_constants.h" #include "net/cert/cert_verifier.h" @@ -38,12 +39,13 @@ #include "net/http/http_auth_handler_factory.h" #include "net/http/http_cache.h" #include "net/http/http_server_properties_impl.h" +#include "net/http/http_util.h" #include "net/http/transport_security_state.h" #include "net/proxy/proxy_service.h" #include "net/ssl/default_server_bound_cert_store.h" #include "net/ssl/server_bound_cert_service.h" #include "net/ssl/ssl_config_service_defaults.h" -#include "net/url_request/static_http_user_agent_settings.h" +#include "net/url_request/http_user_agent_settings.h" #include "net/url_request/url_request.h" #include "net/url_request/url_request_context.h" #include "net/url_request/url_request_context_storage.h" @@ -56,6 +58,42 @@ using content::BrowserThread; #pragma comment(lib, "winhttp.lib") #endif +namespace { + +// An implementation of |HttpUserAgentSettings| that provides a static +// HTTP Accept-Language header value and uses |content::GetUserAgent| +// to provide the HTTP User-Agent header value. +class CefHttpUserAgentSettings : public net::HttpUserAgentSettings { + public: + explicit CefHttpUserAgentSettings(const std::string& raw_language_list) + : http_accept_language_(net::HttpUtil::GenerateAcceptLanguageHeader( + raw_language_list)) { + CEF_REQUIRE_IOT(); + } + + virtual ~CefHttpUserAgentSettings() { + CEF_REQUIRE_IOT(); + } + + // net::HttpUserAgentSettings implementation + virtual std::string GetAcceptLanguage() const OVERRIDE { + CEF_REQUIRE_IOT(); + return http_accept_language_; + } + + virtual std::string GetUserAgent(const GURL& url) const OVERRIDE { + CEF_REQUIRE_IOT(); + return content::GetUserAgent(url); + } + + private: + const std::string http_accept_language_; + + DISALLOW_COPY_AND_ASSIGN(CefHttpUserAgentSettings); +}; + +} // namespace + CefURLRequestContextGetter::CefURLRequestContextGetter( base::MessageLoop* io_loop, base::MessageLoop* file_loop, @@ -101,7 +139,7 @@ net::URLRequestContext* CefURLRequestContextGetter::GetURLRequestContext() { new net::DefaultServerBoundCertStore(NULL), base::WorkerPool::GetTaskRunner(true))); storage_->set_http_user_agent_settings( - new net::StaticHttpUserAgentSettings("en-us,en", EmptyString())); + new CefHttpUserAgentSettings("en-us,en")); storage_->set_host_resolver(net::HostResolver::CreateDefaultResolver(NULL)); storage_->set_cert_verifier(net::CertVerifier::CreateDefault()); diff --git a/tests/unittests/urlrequest_unittest.cc b/tests/unittests/urlrequest_unittest.cc index 22c8eaa26..deaa3083d 100644 --- a/tests/unittests/urlrequest_unittest.cc +++ b/tests/unittests/urlrequest_unittest.cc @@ -189,13 +189,20 @@ class RequestSchemeHandler : public CefResourceHandler { settings_.response_data.clear(); CefRequest::HeaderMap headerMap; + CefRequest::HeaderMap::iterator headerIter; request->GetHeaderMap(headerMap); + // Check if the default headers were sent. + headerIter = headerMap.find("User-Agent"); + EXPECT_TRUE(headerIter != headerMap.end() && !headerIter->second.empty()); + headerIter = headerMap.find("Accept-Language"); + EXPECT_TRUE(headerIter != headerMap.end() && !headerIter->second.empty()); + // Check if the request cookie was sent. bool has_send_cookie = false; - CefRequest::HeaderMap::iterator iter = headerMap.find("Cookie"); - if (iter != headerMap.end()) { - std::string cookie = iter->second; + headerIter = headerMap.find("Cookie"); + if (headerIter != headerMap.end()) { + std::string cookie = headerIter->second; if (cookie.find(kRequestSendCookieName) != std::string::npos) has_send_cookie = true; }