The templates should be removed along with the feature flag when we switch over to unique_ptr
130 lines
4.6 KiB
C++
130 lines
4.6 KiB
C++
/* Copyright (c) 2019 The Brave Authors. All rights reserved.
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
* You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "brave/browser/net/resource_context_data.h"
|
|
|
|
#include <memory>
|
|
#include <optional>
|
|
#include <string>
|
|
#include <utility>
|
|
|
|
#include "base/check.h"
|
|
#include "base/memory/scoped_refptr.h"
|
|
#include "brave/browser/net/brave_proxying_url_loader_factory.h"
|
|
#include "brave/browser/net/brave_proxying_web_socket.h"
|
|
#include "brave/browser/net/brave_request_handler.h"
|
|
#include "content/public/browser/browser_context.h"
|
|
#include "net/cookies/site_for_cookies.h"
|
|
|
|
// User data key for ResourceContextData.
|
|
const void* const kResourceContextUserDataKey = &kResourceContextUserDataKey;
|
|
|
|
RequestIDGenerator::RequestIDGenerator() = default;
|
|
|
|
template <template <typename> class T>
|
|
ResourceContextData<T>::ResourceContextData()
|
|
: request_id_generator_(base::MakeRefCounted<RequestIDGenerator>()),
|
|
weak_factory_(this) {
|
|
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
|
}
|
|
|
|
template <template <typename> class T>
|
|
ResourceContextData<T>::~ResourceContextData() = default;
|
|
|
|
// static
|
|
template <template <typename> class T>
|
|
void ResourceContextData<T>::StartProxying(
|
|
content::BrowserContext* browser_context,
|
|
content::GlobalRenderFrameHostToken render_frame_token,
|
|
network::URLLoaderFactoryBuilder& factory_builder,
|
|
scoped_refptr<base::SequencedTaskRunner> navigation_response_task_runner) {
|
|
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
|
|
|
auto* self = static_cast<ResourceContextData*>(
|
|
browser_context->GetUserData(kResourceContextUserDataKey));
|
|
if (!self) {
|
|
self = new ResourceContextData();
|
|
browser_context->SetUserData(kResourceContextUserDataKey,
|
|
base::WrapUnique(self));
|
|
}
|
|
|
|
if (!self->request_handler_) {
|
|
self->request_handler_ = std::make_unique<BraveRequestHandler<T>>();
|
|
}
|
|
|
|
auto proxy = std::make_unique<BraveProxyingURLLoaderFactory<T>>(
|
|
*self->request_handler_, browser_context, render_frame_token,
|
|
factory_builder, self->request_id_generator_,
|
|
base::BindOnce(&ResourceContextData::RemoveProxy,
|
|
self->weak_factory_.GetWeakPtr()),
|
|
navigation_response_task_runner);
|
|
|
|
self->proxies_.emplace(std::move(proxy));
|
|
}
|
|
|
|
// static
|
|
template <template <typename> class T>
|
|
BraveProxyingWebSocket<T>* ResourceContextData<T>::CreateProxyingWebSocket(
|
|
content::ContentBrowserClient::WebSocketFactory factory,
|
|
const GURL& url,
|
|
const net::SiteForCookies& site_for_cookies,
|
|
const std::optional<std::string>& user_agent,
|
|
content::BrowserContext* browser_context,
|
|
content::GlobalRenderFrameHostToken render_frame_token,
|
|
const url::Origin& origin) {
|
|
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
|
|
|
auto* self = static_cast<ResourceContextData*>(
|
|
browser_context->GetUserData(kResourceContextUserDataKey));
|
|
if (!self) {
|
|
self = new ResourceContextData();
|
|
browser_context->SetUserData(kResourceContextUserDataKey,
|
|
base::WrapUnique(self));
|
|
}
|
|
|
|
if (!self->request_handler_) {
|
|
self->request_handler_ = std::make_unique<BraveRequestHandler<T>>();
|
|
}
|
|
|
|
network::ResourceRequest request;
|
|
request.url = url;
|
|
// TODO(iefremov): site_for_cookies is not enough, we should find a way
|
|
// to initialize NetworkIsolationKey.
|
|
request.site_for_cookies = site_for_cookies;
|
|
if (user_agent) {
|
|
request.headers.SetHeader(net::HttpRequestHeaders::kUserAgent, *user_agent);
|
|
}
|
|
request.request_initiator = origin;
|
|
|
|
auto proxy = std::make_unique<BraveProxyingWebSocket<T>>(
|
|
std::move(factory), request, render_frame_token, browser_context,
|
|
self->request_id_generator_, *self->request_handler_,
|
|
base::BindOnce(&ResourceContextData::RemoveProxyWebSocket,
|
|
self->weak_factory_.GetWeakPtr()));
|
|
|
|
auto* raw_proxy = proxy.get();
|
|
self->websocket_proxies_.emplace(std::move(proxy));
|
|
return raw_proxy;
|
|
}
|
|
|
|
template <template <typename> class T>
|
|
void ResourceContextData<T>::RemoveProxy(
|
|
BraveProxyingURLLoaderFactory<T>* proxy) {
|
|
auto it = proxies_.find(proxy);
|
|
DCHECK(it != proxies_.end());
|
|
proxies_.erase(it);
|
|
}
|
|
|
|
template <template <typename> class T>
|
|
void ResourceContextData<T>::RemoveProxyWebSocket(
|
|
BraveProxyingWebSocket<T>* proxy) {
|
|
auto it = websocket_proxies_.find(proxy);
|
|
DCHECK(it != websocket_proxies_.end());
|
|
websocket_proxies_.erase(it);
|
|
}
|
|
|
|
template class ResourceContextData<std::shared_ptr>;
|
|
template class ResourceContextData<base::WeakPtr>;
|