blob: 4aa89672034099747ee04543c2901c3106f481d0 [file] [log] [blame]
// Copyright 2022 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef QUICHE_QUIC_CONNECT_PROXY_CONNECT_SERVER_BACKEND_H_
#define QUICHE_QUIC_CONNECT_PROXY_CONNECT_SERVER_BACKEND_H_
#include <cstdint>
#include <memory>
#include <string>
#include <utility>
#include "absl/container/flat_hash_map.h"
#include "absl/container/flat_hash_set.h"
#include "quiche/quic/core/quic_server_id.h"
#include "quiche/quic/core/socket_factory.h"
#include "quiche/quic/tools/connect_tunnel.h"
#include "quiche/quic/tools/connect_udp_tunnel.h"
#include "quiche/quic/tools/quic_simple_server_backend.h"
namespace quic {
// QUIC server backend that handles CONNECT and CONNECT-UDP requests.
// Non-CONNECT requests are delegated to a separate backend.
class ConnectServerBackend : public QuicSimpleServerBackend {
public:
// `server_label` is an identifier (typically randomly generated) to identify
// the server or backend in error headers, per the requirements of RFC 9209,
// Section 2.
ConnectServerBackend(
std::unique_ptr<QuicSimpleServerBackend> non_connect_backend,
absl::flat_hash_set<QuicServerId> acceptable_connect_destinations,
absl::flat_hash_set<QuicServerId> acceptable_connect_udp_targets,
std::string server_label);
ConnectServerBackend(const ConnectServerBackend&) = delete;
ConnectServerBackend& operator=(const ConnectServerBackend&) = delete;
~ConnectServerBackend() override;
// QuicSimpleServerBackend:
bool InitializeBackend(const std::string& backend_url) override;
bool IsBackendInitialized() const override;
void SetSocketFactory(SocketFactory* socket_factory) override;
void FetchResponseFromBackend(const spdy::Http2HeaderBlock& request_headers,
const std::string& request_body,
RequestHandler* request_handler) override;
void HandleConnectHeaders(const spdy::Http2HeaderBlock& request_headers,
RequestHandler* request_handler) override;
void HandleConnectData(absl::string_view data, bool data_complete,
RequestHandler* request_handler) override;
void CloseBackendResponseStream(
QuicSimpleServerBackend::RequestHandler* request_handler) override;
private:
std::unique_ptr<QuicSimpleServerBackend> non_connect_backend_;
const absl::flat_hash_set<QuicServerId> acceptable_connect_destinations_;
const absl::flat_hash_set<QuicServerId> acceptable_connect_udp_targets_;
const std::string server_label_;
SocketFactory* socket_factory_ = nullptr; // unowned
absl::flat_hash_map<std::pair<QuicConnectionId, QuicStreamId>,
std::unique_ptr<ConnectTunnel>>
connect_tunnels_;
absl::flat_hash_map<std::pair<QuicConnectionId, QuicStreamId>,
std::unique_ptr<ConnectUdpTunnel>>
connect_udp_tunnels_;
};
} // namespace quic
#endif // QUICHE_QUIC_CONNECT_PROXY_CONNECT_SERVER_BACKEND_H_