/* * 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 namespace Protocol { class RequestClient; class Request : public RefCounted { public: struct CertificateAndKey { String certificate; String 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(); void stream_into(OutputStream&); void stream_into(Core::Stream::Stream&); bool should_buffer_all_input() const { return m_should_buffer_all_input; } /// Note: Will override `on_finish', and `on_headers_received', and expects `on_buffered_request_finish' to be set! void set_should_buffer_all_input(bool); /// Note: Must be set before `set_should_buffer_all_input(true)`. Function& response_headers, Optional response_code, ReadonlyBytes payload)> on_buffered_request_finish; Function on_finish; Function total_size, u32 downloaded_size)> on_progress; Function& response_headers, Optional response_code)> on_headers_received; Function on_certificate_requested; void did_finish(Badge, bool success, u32 total_size); void did_progress(Badge, Optional total_size, u32 downloaded_size); void did_receive_headers(Badge, const HashMap& response_headers, Optional response_code); void did_request_certificates(Badge); RefPtr& write_notifier(Badge) { return m_write_notifier; } void set_request_fd(Badge, int fd) { m_fd = fd; } private: explicit Request(RequestClient&, i32 request_id); template void stream_into_impl(T&); WeakPtr m_client; int m_request_id { -1 }; RefPtr m_write_notifier; int m_fd { -1 }; bool m_should_buffer_all_input { false }; struct InternalBufferedData { DuplexMemoryStream payload_stream; HashMap response_headers; Optional response_code; }; struct InternalStreamData { InternalStreamData(NonnullOwnPtr stream) : read_stream(move(stream)) { } NonnullOwnPtr read_stream; RefPtr read_notifier; bool success; u32 total_size { 0 }; bool request_done { false }; Function on_finish {}; bool user_finish_called { false }; }; OwnPtr m_internal_buffered_data; OwnPtr m_internal_stream_data; }; }