Commit c8070523 authored by Robert Ogden's avatar Robert Ogden Committed by Commit Bot

Sm refactor IsolatedPrerenderOriginProber to better support TLS

The origin prober needs to support setting up a TLS connection, for
which resolving DNS is the first step. This CL refactors the origin
prober to make that first step possible.

Bug: 1115731
Change-Id: I67cb45d707a608770954e56f7e3688c1e49a4372
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2356267
Commit-Queue: Robert Ogden <robertogden@chromium.org>
Reviewed-by: default avatarRyan Sturm <ryansturm@chromium.org>
Cr-Commit-Position: refs/heads/master@{#798375}
parent 3e347f41
...@@ -26,8 +26,10 @@ namespace { ...@@ -26,8 +26,10 @@ namespace {
class DNSProber : public network::mojom::ResolveHostClient { class DNSProber : public network::mojom::ResolveHostClient {
public: public:
explicit DNSProber( using OnDNSResultsCallback = base::OnceCallback<
IsolatedPrerenderOriginProber::OnProbeResultCallback callback) void(int, const base::Optional<net::AddressList>& resolved_addresses)>;
explicit DNSProber(OnDNSResultsCallback callback)
: callback_(std::move(callback)) { : callback_(std::move(callback)) {
DCHECK(callback_); DCHECK(callback_);
} }
...@@ -35,7 +37,7 @@ class DNSProber : public network::mojom::ResolveHostClient { ...@@ -35,7 +37,7 @@ class DNSProber : public network::mojom::ResolveHostClient {
~DNSProber() override { ~DNSProber() override {
if (callback_) { if (callback_) {
// Indicates some kind of mojo error. Play it safe and return no success. // Indicates some kind of mojo error. Play it safe and return no success.
std::move(callback_).Run(false); std::move(callback_).Run(net::ERR_FAILED, base::nullopt);
} }
} }
...@@ -47,12 +49,12 @@ class DNSProber : public network::mojom::ResolveHostClient { ...@@ -47,12 +49,12 @@ class DNSProber : public network::mojom::ResolveHostClient {
const net::ResolveErrorInfo& resolve_error_info, const net::ResolveErrorInfo& resolve_error_info,
const base::Optional<net::AddressList>& resolved_addresses) override { const base::Optional<net::AddressList>& resolved_addresses) override {
if (callback_) { if (callback_) {
std::move(callback_).Run(error == net::OK); std::move(callback_).Run(error, resolved_addresses);
} }
} }
private: private:
IsolatedPrerenderOriginProber::OnProbeResultCallback callback_; OnDNSResultsCallback callback_;
}; };
void HTTPProbeHelper( void HTTPProbeHelper(
...@@ -223,6 +225,13 @@ void IsolatedPrerenderOriginProber::Probe(const GURL& url, ...@@ -223,6 +225,13 @@ void IsolatedPrerenderOriginProber::Probe(const GURL& url,
void IsolatedPrerenderOriginProber::DNSProbe(const GURL& url, void IsolatedPrerenderOriginProber::DNSProbe(const GURL& url,
OnProbeResultCallback callback) { OnProbeResultCallback callback) {
StartDNSResolution(url, std::move(callback), /*also_do_tls_connect=*/false);
}
void IsolatedPrerenderOriginProber::StartDNSResolution(
const GURL& url,
OnProbeResultCallback callback,
bool also_do_tls_connect) {
net::NetworkIsolationKey nik = net::NetworkIsolationKey nik =
net::IsolationInfo::CreateForInternalRequest(url::Origin::Create(url)) net::IsolationInfo::CreateForInternalRequest(url::Origin::Create(url))
.network_isolation_key(); .network_isolation_key();
...@@ -233,7 +242,10 @@ void IsolatedPrerenderOriginProber::DNSProbe(const GURL& url, ...@@ -233,7 +242,10 @@ void IsolatedPrerenderOriginProber::DNSProbe(const GURL& url,
resolve_host_parameters->initial_priority = net::RequestPriority::HIGHEST; resolve_host_parameters->initial_priority = net::RequestPriority::HIGHEST;
mojo::PendingRemote<network::mojom::ResolveHostClient> client_remote; mojo::PendingRemote<network::mojom::ResolveHostClient> client_remote;
mojo::MakeSelfOwnedReceiver(std::make_unique<DNSProber>(std::move(callback)), mojo::MakeSelfOwnedReceiver(std::make_unique<DNSProber>(base::BindOnce(
&IsolatedPrerenderOriginProber::OnDNSResolved,
weak_factory_.GetWeakPtr(), url,
std::move(callback), also_do_tls_connect)),
client_remote.InitWithNewPipeAndPassReceiver()); client_remote.InitWithNewPipeAndPassReceiver());
content::BrowserContext::GetDefaultStoragePartition(profile_) content::BrowserContext::GetDefaultStoragePartition(profile_)
...@@ -299,3 +311,27 @@ void IsolatedPrerenderOriginProber::HTTPProbe(const GURL& url, ...@@ -299,3 +311,27 @@ void IsolatedPrerenderOriginProber::HTTPProbe(const GURL& url,
prober_ptr->SendNowIfInactive(false /* send_only_in_foreground */); prober_ptr->SendNowIfInactive(false /* send_only_in_foreground */);
} }
void IsolatedPrerenderOriginProber::OnDNSResolved(
const GURL& url,
OnProbeResultCallback callback,
bool also_do_tls_connect,
int net_error,
const base::Optional<net::AddressList>& resolved_addresses) {
bool successful = net_error == net::OK && resolved_addresses &&
!resolved_addresses->empty();
// A TLS connection needs the resolved addresses, so it also fails here.
if (!successful) {
std::move(callback).Run(false);
return;
}
if (!also_do_tls_connect) {
std::move(callback).Run(true);
return;
}
// TODO(robertogden): Handle also_do_tls_connect.
NOTREACHED();
}
...@@ -6,6 +6,9 @@ ...@@ -6,6 +6,9 @@
#define CHROME_BROWSER_PRERENDER_ISOLATED_ISOLATED_PRERENDER_ORIGIN_PROBER_H_ #define CHROME_BROWSER_PRERENDER_ISOLATED_ISOLATED_PRERENDER_ORIGIN_PROBER_H_
#include "base/callback.h" #include "base/callback.h"
#include "base/memory/weak_ptr.h"
#include "base/optional.h"
#include "net/base/address_list.h"
#include "url/gurl.h" #include "url/gurl.h"
class AvailabilityProber; class AvailabilityProber;
...@@ -46,6 +49,23 @@ class IsolatedPrerenderOriginProber { ...@@ -46,6 +49,23 @@ class IsolatedPrerenderOriginProber {
void DNSProbe(const GURL& url, OnProbeResultCallback callback); void DNSProbe(const GURL& url, OnProbeResultCallback callback);
void HTTPProbe(const GURL& url, OnProbeResultCallback callback); void HTTPProbe(const GURL& url, OnProbeResultCallback callback);
// Does a DNS resolution for a DNS or TLS probe, passing all the arguments to
// |OnDNSResolved|.
void StartDNSResolution(const GURL& url,
OnProbeResultCallback callback,
bool also_do_tls_connect);
// If the DNS resolution was successful, this will either run |callback| for a
// DNS probe, or start the TLS socket for a TLS probe. This is determined by
// |also_do_tls_connect|. If the DNS resolution failed, |callback| is run with
// failure.
void OnDNSResolved(
const GURL& url,
OnProbeResultCallback callback,
bool also_do_tls_connect,
int net_error,
const base::Optional<net::AddressList>& resolved_addresses);
// The current profile, not owned. // The current profile, not owned.
Profile* profile_; Profile* profile_;
...@@ -54,6 +74,8 @@ class IsolatedPrerenderOriginProber { ...@@ -54,6 +74,8 @@ class IsolatedPrerenderOriginProber {
// The canary url checker. // The canary url checker.
std::unique_ptr<AvailabilityProber> canary_check_; std::unique_ptr<AvailabilityProber> canary_check_;
base::WeakPtrFactory<IsolatedPrerenderOriginProber> weak_factory_{this};
}; };
#endif // CHROME_BROWSER_PRERENDER_ISOLATED_ISOLATED_PRERENDER_ORIGIN_PROBER_H_ #endif // CHROME_BROWSER_PRERENDER_ISOLATED_ISOLATED_PRERENDER_ORIGIN_PROBER_H_
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