1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 17:27:35 +00:00

Browser+LibWeb+WebContent: Implement per-URL-pattern proxies

...at least for SOCKS5.
This commit is contained in:
Ali Mohammad Pur 2022-04-08 01:46:47 +04:30 committed by Andreas Kling
parent f9fc28931f
commit a42e03b01a
15 changed files with 155 additions and 6 deletions

View file

@ -0,0 +1,41 @@
/*
* Copyright (c) 2022, Ali Mohammad Pur <mpfard@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include "ProxyMappings.h"
Web::ProxyMappings& Web::ProxyMappings::the()
{
static ProxyMappings instance {};
return instance;
}
Core::ProxyData Web::ProxyMappings::proxy_for_url(AK::URL const& url) const
{
auto url_string = url.to_string();
for (auto& it : m_mappings) {
dbgln("Checking {} against {}...", url, it.key);
if (url_string.matches(it.key)) {
dbgln("Matched!");
auto result = Core::ProxyData::parse_url(m_proxies[it.value]);
if (result.is_error()) {
dbgln("Failed to parse proxy URL: {}", m_proxies[it.value]);
continue;
}
return result.release_value();
}
}
dbgln("No luck!");
return {};
}
void Web::ProxyMappings::set_mappings(Vector<String> proxies, OrderedHashMap<String, size_t> mappings)
{
m_proxies = move(proxies);
m_mappings = move(mappings);
dbgln("Proxy mappings updated: proxies: {}", m_proxies);
}

View file

@ -0,0 +1,31 @@
/*
* Copyright (c) 2022, Ali Mohammad Pur <mpfard@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/HashMap.h>
#include <AK/URL.h>
#include <AK/Vector.h>
#include <LibCore/Proxy.h>
namespace Web {
class ProxyMappings {
public:
static ProxyMappings& the();
Core::ProxyData proxy_for_url(AK::URL const&) const;
void set_mappings(Vector<String> proxies, OrderedHashMap<String, size_t> mappings);
private:
ProxyMappings() = default;
~ProxyMappings() = default;
Vector<String> m_proxies;
OrderedHashMap<String, size_t> m_mappings;
};
}

View file

@ -14,6 +14,7 @@
#include <LibProtocol/RequestClient.h>
#include <LibWeb/Loader/ContentFilter.h>
#include <LibWeb/Loader/LoadRequest.h>
#include <LibWeb/Loader/ProxyMappings.h>
#include <LibWeb/Loader/Resource.h>
#include <LibWeb/Loader/ResourceLoader.h>
#include <serenity.h>
@ -213,6 +214,9 @@ void ResourceLoader::load(LoadRequest& request, Function<void(ReadonlyBytes, Has
}
if (url.protocol() == "http" || url.protocol() == "https" || url.protocol() == "gemini") {
auto proxy = ProxyMappings::the().proxy_for_url(url);
dbgln("Proxy for {} is {}", url, proxy.type == decltype(proxy.type)::SOCKS5 ? IPv4Address(proxy.host_ipv4).to_string() : "(direct)");
HashMap<String, String> headers;
headers.set("User-Agent", m_user_agent);
headers.set("Accept-Encoding", "gzip, deflate");
@ -221,7 +225,7 @@ void ResourceLoader::load(LoadRequest& request, Function<void(ReadonlyBytes, Has
headers.set(it.key, it.value);
}
auto protocol_request = protocol_client().start_request(request.method(), url, headers, request.body());
auto protocol_request = protocol_client().start_request(request.method(), url, headers, request.body(), proxy);
if (!protocol_request) {
auto start_request_failure_msg = "Failed to initiate load"sv;
log_failure(request, start_request_failure_msg);