blob: e950a2bef711f272b3f9b89c5592d520bd6a56e4 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef NET_TEST_EMBEDDED_TEST_SERVER_HTTP_CONNECT_PROXY_HANDLER_H_
#define NET_TEST_EMBEDDED_TEST_SERVER_HTTP_CONNECT_PROXY_HANDLER_H_
#include <memory>
#include <optional>
#include <set>
#include "base/containers/flat_set.h"
#include "base/containers/span.h"
#include "base/containers/unique_ptr_adapters.h"
#include "net/base/host_port_pair.h"
namespace net::test_server {
class HttpConnection;
struct HttpRequest;
// Helper for use by the EmbeddedTestServer to act as an HTTP proxy. Only
// supports HTTP/1.x CONNECT requests. Non-CONNECT requests can be simulated
// without a proxy, if needed.
class HttpConnectProxyHandler {
public:
// Only CONNECT requests to destinations in proxied_destinations will be
// proxied. All others result in 502 errors. CONNECT requests are all
// connected to 127.0.0.1:<port> where `port` is the destination port of the
// requested destination.
explicit HttpConnectProxyHandler(
base::span<const HostPortPair> proxied_destinations);
~HttpConnectProxyHandler();
// `request` must be a CONNECT request. Returns false if the request is not a
// valid CONNECT request or is to a destination in `dest_ports`. In the former
// case, adds a gtest failure as well.
//
// If true is returned, takes ownership of the underlying socket, and attempts
// to establish an HTTP/1.x tunnel between that socket and the destination
// port on localost.
//
// Write an error to the socket and logs on connection failures.
bool HandleProxyRequest(HttpConnection& connection,
const HttpRequest& request);
private:
class ConnectTunnel;
void DeleteTunnel(ConnectTunnel* tunnel);
const base::flat_set<HostPortPair> proxied_destinations_;
std::set<std::unique_ptr<ConnectTunnel>, base::UniquePtrComparator>
connect_tunnels_;
};
} // namespace net::test_server
#endif // NET_TEST_EMBEDDED_TEST_SERVER_HTTP_CONNECT_PROXY_HANDLER_H_