/* * Copyright (c) 2018-2020, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include #include #include #include namespace RequestServer { class ConnectionFromClient final : public IPC::ConnectionFromClient { C_OBJECT(ConnectionFromClient); public: enum class IsPrimaryConnection { No, Yes, }; using ConnectionMap = HashMap>; ~ConnectionFromClient() override; virtual void die() override; static Optional primary_connection(); void start_revalidation_request(Badge, ByteString method, URL::URL, NonnullRefPtr request_headers, ByteBuffer request_body, HTTP::Cookie::IncludeCredentials, Core::ProxyData proxy_data); void request_complete(Badge, Request const&); private: ConnectionFromClient(NonnullOwnPtr, IsPrimaryConnection, ConnectionMap&, Optional); virtual Messages::RequestServer::InitTransportResponse init_transport(int peer_pid) override; virtual Messages::RequestServer::ConnectNewClientResponse connect_new_client() override; virtual Messages::RequestServer::ConnectNewClientsResponse connect_new_clients(size_t count) override; virtual void set_disk_cache_settings(HTTP::DiskCacheSettings) override; virtual Messages::RequestServer::IsSupportedProtocolResponse is_supported_protocol(ByteString) override; virtual void set_dns_server(ByteString host_or_address, u16 port, bool use_tls, bool validate_dnssec_locally) override; virtual void set_use_system_dns() override; virtual void start_request(u64 request_id, ByteString, URL::URL, Vector, ByteBuffer, HTTP::CacheMode, HTTP::Cookie::IncludeCredentials, Core::ProxyData) override; virtual Messages::RequestServer::StopRequestResponse stop_request(u64 request_id) override; virtual Messages::RequestServer::SetCertificateResponse set_certificate(u64 request_id, ByteString, ByteString) override; virtual void ensure_connection(u64 request_id, URL::URL url, ::RequestServer::CacheLevel cache_level) override; virtual void retrieved_http_cookie(int client_id, u64 request_id, RequestServer::RequestType request_type, String cookie) override; virtual void estimate_cache_size_accessed_since(u64 cache_size_estimation_id, UnixDateTime since) override; virtual void remove_cache_entries_accessed_since(UnixDateTime since) override; virtual void websocket_connect(u64 websocket_id, URL::URL, ByteString, Vector, Vector, Vector) override; virtual void websocket_send(u64 websocket_id, bool, ByteBuffer) override; virtual void websocket_close(u64 websocket_id, u16, ByteString) override; virtual Messages::RequestServer::WebsocketSetCertificateResponse websocket_set_certificate(u64, ByteString, ByteString) override; static int on_socket_callback(void*, int sockfd, int what, void* user_data, void*); static int on_timeout_callback(void*, long timeout_ms, void* user_data); void check_active_requests(); ErrorOr create_client_socket(); ConnectionMap& m_connections; Optional m_disk_cache; void* m_curl_multi { nullptr }; HashMap> m_active_requests; HashMap> m_active_revalidation_requests; HashTable m_pending_websockets; HashMap> m_websockets; RefPtr m_timer; HashMap> m_read_notifiers; HashMap> m_write_notifiers; NonnullRefPtr m_resolver; ByteString m_alt_svc_cache_path; u64 m_next_revalidation_request_id { 0 }; Optional m_burst_window_started_at; u64 m_requests_in_burst_window { 0 }; }; constexpr inline uintptr_t websocket_private_tag = 0x1; }