/* * Copyright (c) 2018-2020, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include #include namespace Requests { class RequestClient; class Request : public RefCounted { public: struct CertificateAndKey { ByteString certificate; ByteString key; }; static NonnullRefPtr create_from_id(Badge, RequestClient& client, i32 request_id) { return adopt_ref(*new Request(client, request_id)); } int id() const { return m_request_id; } int fd() const { return m_fd; } bool stop(); using BufferedRequestFinished = Function const& network_error, HTTP::HeaderMap const& response_headers, Optional response_code, Optional reason_phrase, ReadonlyBytes payload)>; // Configure the request such that the entirety of the response data is buffered. The callback receives that data and // the response headers all at once. Using this method is mutually exclusive with `set_unbuffered_data_received_callback`. void set_buffered_request_finished_callback(BufferedRequestFinished); using HeadersReceived = Function response_code, Optional const& reason_phrase)>; using DataReceived = Function; using RequestFinished = Function network_error)>; // Configure the request such that the response data is provided unbuffered as it is received. Using this method is // mutually exclusive with `set_buffered_request_finished_callback`. void set_unbuffered_request_callbacks(HeadersReceived, DataReceived, RequestFinished); Function on_certificate_requested; void did_finish(Badge, u64 total_size, RequestTimingInfo const& timing_info, Optional const& network_error); void did_receive_headers(Badge, HTTP::HeaderMap const& response_headers, Optional response_code, Optional const& reason_phrase); void did_request_certificates(Badge); RefPtr& write_notifier(Badge) { return m_write_notifier; } void set_request_fd(Badge, int fd); private: explicit Request(RequestClient&, i32 request_id); void set_up_internal_stream_data(DataReceived on_data_available); WeakPtr m_client; int m_request_id { -1 }; RefPtr m_write_notifier; int m_fd { -1 }; enum class Mode { Buffered, Unbuffered, Unknown, }; Mode m_mode { Mode::Unknown }; HeadersReceived on_headers_received; RequestFinished on_finish; struct InternalBufferedData { AllocatingMemoryStream payload_stream; HTTP::HeaderMap response_headers; Optional response_code; Optional reason_phrase; }; struct InternalStreamData { InternalStreamData() { } OwnPtr read_stream; RefPtr read_notifier; u32 total_size { 0 }; Optional network_error; bool request_done { false }; RequestTimingInfo timing_info; Function on_finish {}; bool user_finish_called { false }; }; OwnPtr m_internal_buffered_data; OwnPtr m_internal_stream_data; }; }