diff options
Diffstat (limited to 'chromium/components/variations/net/variations_http_headers.cc')
-rw-r--r-- | chromium/components/variations/net/variations_http_headers.cc | 62 |
1 files changed, 59 insertions, 3 deletions
diff --git a/chromium/components/variations/net/variations_http_headers.cc b/chromium/components/variations/net/variations_http_headers.cc index 3eb28d0515a..a2d07821f81 100644 --- a/chromium/components/variations/net/variations_http_headers.cc +++ b/chromium/components/variations/net/variations_http_headers.cc @@ -6,13 +6,20 @@ #include <stddef.h> +#include <vector> + #include "base/macros.h" #include "base/metrics/histogram_macros.h" #include "base/strings/string_util.h" #include "components/google/core/browser/google_util.h" #include "components/variations/variations_http_header_provider.h" #include "net/http/http_request_headers.h" +#include "net/traffic_annotation/network_traffic_annotation.h" +#include "net/url_request/redirect_info.h" #include "net/url_request/url_request.h" +#include "services/network/public/cpp/resource_request.h" +#include "services/network/public/cpp/resource_response.h" +#include "services/network/public/cpp/simple_url_loader.h" #include "url/gurl.h" namespace variations { @@ -86,9 +93,21 @@ void LogUrlValidationHistogram(URLValidationResult result) { URL_VALIDATION_RESULT_SIZE); } +// Removes variations headers for requests when a redirect to a non-Google URL +// occurs. This function is used as the callback parameter for +// SimpleURLLoader::SetOnRedirectCallback() when +// CreateSimpleURLLoaderWithVariationsHeaders() creates a SimpleURLLoader +// object. +void RemoveVariationsHeader(const net::RedirectInfo& redirect_info, + const network::ResourceResponseHead& response_head, + std::vector<std::string>* to_be_removed_headers) { + if (!internal::ShouldAppendVariationHeaders(redirect_info.new_url)) + to_be_removed_headers->push_back(kClientData); +} + } // namespace -void AppendVariationHeaders(const GURL& url, +bool AppendVariationHeaders(const GURL& url, InIncognito incognito, SignedIn signed_in, net::HttpRequestHeaders* headers) { @@ -101,8 +120,9 @@ void AppendVariationHeaders(const GURL& url, // 2. Only transmit for non-Incognito profiles. // 3. For the X-Client-Data header, only include non-empty variation IDs. if ((incognito == InIncognito::kYes) || - !internal::ShouldAppendVariationHeaders(url)) - return; + !internal::ShouldAppendVariationHeaders(url)) { + return false; + } const std::string variation_ids_header = VariationsHttpHeaderProvider::GetInstance()->GetClientDataHeader( @@ -110,7 +130,17 @@ void AppendVariationHeaders(const GURL& url, if (!variation_ids_header.empty()) { // Note that prior to M33 this header was named X-Chrome-Variations. headers->SetHeaderIfMissing(kClientData, variation_ids_header); + return true; } + return false; +} + +bool AppendVariationHeadersUnknownSignedIn(const GURL& url, + InIncognito incognito, + net::HttpRequestHeaders* headers) { + // Note: It's OK to pass SignedIn::kNo if it's unknown, as it does not affect + // transmission of experiments coming from the variations server. + return AppendVariationHeaders(url, incognito, SignedIn::kNo, headers); } std::set<std::string> GetVariationHeaderNames() { @@ -127,6 +157,32 @@ void StripVariationHeaderIfNeeded(const GURL& new_location, } } +std::unique_ptr<network::SimpleURLLoader> +CreateSimpleURLLoaderWithVariationsHeaders( + std::unique_ptr<network::ResourceRequest> request, + InIncognito incognito, + SignedIn signed_in, + const net::NetworkTrafficAnnotationTag& annotation_tag) { + bool variation_headers_added = AppendVariationHeaders( + request->url, incognito, signed_in, &request->headers); + std::unique_ptr<network::SimpleURLLoader> simple_url_loader = + network::SimpleURLLoader::Create(std::move(request), annotation_tag); + if (variation_headers_added) { + simple_url_loader->SetOnRedirectCallback( + base::BindRepeating(&RemoveVariationsHeader)); + } + return simple_url_loader; +} + +std::unique_ptr<network::SimpleURLLoader> +CreateSimpleURLLoaderWithVariationsHeadersUnknownSignedIn( + std::unique_ptr<network::ResourceRequest> request, + InIncognito incognito, + const net::NetworkTrafficAnnotationTag& annotation_tag) { + return CreateSimpleURLLoaderWithVariationsHeaders( + std::move(request), incognito, SignedIn::kNo, annotation_tag); +} + namespace internal { // static |