Commit ba7fcf52 authored by Ryan Sturm's avatar Ryan Sturm Committed by Commit Bot

Rewriting virtual URL for HTTPS URLLoader Previews

This CL adds a handler for virtual URL re-write whenever the HTTPS
Previews is on and data saver is on. This will act on the committed URL
when it matches the lite page server URL.

This CL also adds UMA for server response and when a host is
blacklisted.

Bug: 921757,929969
Change-Id: I458f9bfb9b9c292a3f3a96065a7c6a9073ec2c23
Reviewed-on: https://chromium-review.googlesource.com/c/1488015
Commit-Queue: Ryan Sturm <ryansturm@chromium.org>
Reviewed-by: default avatarRobert Ogden <robertogden@chromium.org>
Cr-Commit-Position: refs/heads/master@{#635714}
parent 56aac4d8
...@@ -249,7 +249,18 @@ bool HandlePreviewsLitePageURLRewrite( ...@@ -249,7 +249,18 @@ bool HandlePreviewsLitePageURLRewrite(
content::BrowserContext* browser_context) { content::BrowserContext* browser_context) {
// Don't change the |url|, just register our interest in reversing it before // Don't change the |url|, just register our interest in reversing it before
// it is displayed to the user in |HandlePreviewsLitePageURLRewriteReverse|. // it is displayed to the user in |HandlePreviewsLitePageURLRewriteReverse|.
return previews::IsLitePageRedirectPreviewURL(*url); // Without returning true here, |HandlePreviewsLitePageURLRewriteReverse|
// would not be called.
auto* data_reduction_proxy_settings =
DataReductionProxyChromeSettingsFactory::GetForBrowserContext(
browser_context);
if (!data_reduction_proxy_settings)
return false;
return data_reduction_proxy_settings->IsDataReductionProxyEnabled() &&
previews::params::IsLitePageServerPreviewsEnabled();
} }
bool HandlePreviewsLitePageURLRewriteReverse( bool HandlePreviewsLitePageURLRewriteReverse(
......
...@@ -10,12 +10,14 @@ ...@@ -10,12 +10,14 @@
#include "base/bind.h" #include "base/bind.h"
#include "base/bind_helpers.h" #include "base/bind_helpers.h"
#include "base/memory/ptr_util.h" #include "base/memory/ptr_util.h"
#include "base/metrics/histogram_macros.h"
#include "base/rand_util.h" #include "base/rand_util.h"
#include "base/task/post_task.h" #include "base/task/post_task.h"
#include "base/task/task_traits.h" #include "base/task/task_traits.h"
#include "base/threading/thread_task_runner_handle.h" #include "base/threading/thread_task_runner_handle.h"
#include "base/time/time.h" #include "base/time/time.h"
#include "chrome/browser/previews/previews_lite_page_decider.h" #include "chrome/browser/previews/previews_lite_page_decider.h"
#include "chrome/browser/previews/previews_lite_page_navigation_throttle.h"
#include "chrome/browser/previews/previews_lite_page_navigation_throttle_manager.h" #include "chrome/browser/previews/previews_lite_page_navigation_throttle_manager.h"
#include "chrome/browser/previews/previews_service.h" #include "chrome/browser/previews/previews_service.h"
#include "chrome/browser/previews/previews_service_factory.h" #include "chrome/browser/previews/previews_service_factory.h"
...@@ -209,9 +211,19 @@ void PreviewsLitePageServingURLLoader::OnReceiveResponse( ...@@ -209,9 +211,19 @@ void PreviewsLitePageServingURLLoader::OnReceiveResponse(
const net::HttpResponseHeaders* response_headers = head.headers.get(); const net::HttpResponseHeaders* response_headers = head.headers.get();
// TODO: evaluate all the responses we allow, don't hard code 200. // TODO: evaluate all the responses we allow, don't hard code 200.
if (!response_headers || response_headers->response_code() != net::HTTP_OK) { if (!response_headers) {
if (response_headers && UMA_HISTOGRAM_ENUMERATION(
response_headers->response_code() == net::HTTP_SERVICE_UNAVAILABLE) { "Previews.ServerLitePage.ServerResponse",
PreviewsLitePageNavigationThrottle::ServerResponse::kFailed);
Fallback();
return;
}
if (response_headers->response_code() != net::HTTP_OK) {
if (response_headers->response_code() == net::HTTP_SERVICE_UNAVAILABLE) {
UMA_HISTOGRAM_ENUMERATION("Previews.ServerLitePage.ServerResponse",
PreviewsLitePageNavigationThrottle::
ServerResponse::kServiceUnavailable);
std::string retry_after_header; std::string retry_after_header;
base::TimeDelta retry_after = base::TimeDelta::FromSeconds(base::RandInt( base::TimeDelta retry_after = base::TimeDelta::FromSeconds(base::RandInt(
60, previews::params::PreviewServerLoadshedMaxSeconds())); 60, previews::params::PreviewServerLoadshedMaxSeconds()));
...@@ -221,12 +233,24 @@ void PreviewsLitePageServingURLLoader::OnReceiveResponse( ...@@ -221,12 +233,24 @@ void PreviewsLitePageServingURLLoader::OnReceiveResponse(
base::Time::Now(), &retry_after); base::Time::Now(), &retry_after);
} }
SetServerUnavailableFor(retry_after, frame_tree_node_id_); SetServerUnavailableFor(retry_after, frame_tree_node_id_);
} else if (response_headers->response_code() == net::HTTP_FORBIDDEN) {
UMA_HISTOGRAM_ENUMERATION(
"Previews.ServerLitePage.ServerResponse",
PreviewsLitePageNavigationThrottle::ServerResponse::kAuthFailure);
} else {
UMA_HISTOGRAM_ENUMERATION(
"Previews.ServerLitePage.ServerResponse",
PreviewsLitePageNavigationThrottle::ServerResponse::kOther);
} }
Fallback(); Fallback();
return; return;
} }
UMA_HISTOGRAM_ENUMERATION(
"Previews.ServerLitePage.ServerResponse",
PreviewsLitePageNavigationThrottle::ServerResponse::kOk);
// Store head and pause new messages until the forwarding client is set up. // Store head and pause new messages until the forwarding client is set up.
// Make a deep copy of ResourceResponseHead before passing it cross-thread. // Make a deep copy of ResourceResponseHead before passing it cross-thread.
resource_response_ = base::MakeRefCounted<network::ResourceResponse>(); resource_response_ = base::MakeRefCounted<network::ResourceResponse>();
...@@ -253,6 +277,9 @@ void PreviewsLitePageServingURLLoader::OnReceiveRedirect( ...@@ -253,6 +277,9 @@ void PreviewsLitePageServingURLLoader::OnReceiveRedirect(
if (previews::ExtractOriginalURLFromLitePageRedirectURL(previews_url_, if (previews::ExtractOriginalURLFromLitePageRedirectURL(previews_url_,
&original_url) && &original_url) &&
GURL(original_url) == redirect_info.new_url) { GURL(original_url) == redirect_info.new_url) {
UMA_HISTOGRAM_ENUMERATION("Previews.ServerLitePage.ServerResponse",
PreviewsLitePageNavigationThrottle::
ServerResponse::kPreviewUnavailable);
const net::HttpResponseHeaders* response_headers = head.headers.get(); const net::HttpResponseHeaders* response_headers = head.headers.get();
std::string chrome_proxy_header; std::string chrome_proxy_header;
...@@ -266,10 +293,18 @@ void PreviewsLitePageServingURLLoader::OnReceiveRedirect( ...@@ -266,10 +293,18 @@ void PreviewsLitePageServingURLLoader::OnReceiveRedirect(
if (blacklist_host) if (blacklist_host)
BlacklistBypassedHost(GURL(original_url).host(), kBlacklistDuration, BlacklistBypassedHost(GURL(original_url).host(), kBlacklistDuration,
frame_tree_node_id_); frame_tree_node_id_);
UMA_HISTOGRAM_BOOLEAN("Previews.ServerLitePage.HostBlacklistedOnBypass",
blacklist_host);
Fallback(); Fallback();
return; return;
} }
UMA_HISTOGRAM_ENUMERATION(
"Previews.ServerLitePage.ServerResponse",
PreviewsLitePageNavigationThrottle::ServerResponse::kRedirect);
std::move(result_callback_) std::move(result_callback_)
.Run(ServingLoaderResult::kRedirect, redirect_info, resource_response_); .Run(ServingLoaderResult::kRedirect, redirect_info, resource_response_);
} }
...@@ -306,10 +341,12 @@ void PreviewsLitePageServingURLLoader::OnComplete( ...@@ -306,10 +341,12 @@ void PreviewsLitePageServingURLLoader::OnComplete(
return; return;
} }
UMA_HISTOGRAM_ENUMERATION(
"Previews.ServerLitePage.ServerResponse",
PreviewsLitePageNavigationThrottle::ServerResponse::kFailed);
// If OnComplete is called before, OnReceiveResponse, this is indicative of a // If OnComplete is called before, OnReceiveResponse, this is indicative of a
// failure of some sort. // failure of some sort.
// TODO(ryansturm): Handle specific errors with a bypass pattern.
// https://crbug.com/921744
Fallback(); Fallback();
} }
...@@ -352,6 +389,9 @@ void PreviewsLitePageServingURLLoader::OnConnectionError() { ...@@ -352,6 +389,9 @@ void PreviewsLitePageServingURLLoader::OnConnectionError() {
// When we are not yet bound to the navigation code, fallback, which will // When we are not yet bound to the navigation code, fallback, which will
// destroy this object. // destroy this object.
if (!result_callback_.is_null()) { if (!result_callback_.is_null()) {
UMA_HISTOGRAM_ENUMERATION(
"Previews.ServerLitePage.ServerResponse",
PreviewsLitePageNavigationThrottle::ServerResponse::kFailed);
Fallback(); Fallback();
return; return;
} }
......
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