/* * Copyright (c) 2018-2020, Andreas Kling * Copyright (c) 2022, Dex♪ * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include namespace Web { #if ARCH(I386) # define CPU_STRING "x86" #else # define CPU_STRING "x86_64" #endif constexpr auto default_user_agent = "Mozilla/5.0 (SerenityOS; " CPU_STRING ") LibWeb+LibJS/1.0 Browser/1.0"; class ResourceLoaderConnectorRequest : public RefCounted { public: virtual ~ResourceLoaderConnectorRequest(); struct CertificateAndKey { String certificate; String key; }; virtual void set_should_buffer_all_input(bool) = 0; virtual bool stop() = 0; virtual void stream_into(Core::Stream::Stream&) = 0; Function const& response_headers, Optional response_code, ReadonlyBytes payload)> on_buffered_request_finish; Function on_finish; Function total_size, u32 downloaded_size)> on_progress; Function on_certificate_requested; protected: explicit ResourceLoaderConnectorRequest(); }; class ResourceLoaderConnector : public RefCounted { public: virtual ~ResourceLoaderConnector(); virtual void prefetch_dns(AK::URL const&) = 0; virtual void preconnect(AK::URL const&) = 0; virtual RefPtr start_request(String const& method, AK::URL const&, HashMap const& request_headers = {}, ReadonlyBytes request_body = {}, Core::ProxyData const& = {}) = 0; protected: explicit ResourceLoaderConnector(); }; class ResourceLoader : public Core::Object { C_OBJECT_ABSTRACT(ResourceLoader) public: static void initialize(RefPtr); static ResourceLoader& the(); RefPtr load_resource(Resource::Type, LoadRequest&); void load(LoadRequest&, Function const& response_headers, Optional status_code)> success_callback, Function status_code)> error_callback = nullptr, Optional timeout = {}); void load(const AK::URL&, Function const& response_headers, Optional status_code)> success_callback, Function status_code)> error_callback = nullptr, Optional timeout = {}); ResourceLoaderConnector& connector() { return *m_connector; } void prefetch_dns(AK::URL const&); void preconnect(AK::URL const&); Function on_load_counter_change; int pending_loads() const { return m_pending_loads; } String const& user_agent() const { return m_user_agent; } void set_user_agent(String const& user_agent) { m_user_agent = user_agent; } void clear_cache(); void evict_from_cache(LoadRequest const&); private: ResourceLoader(NonnullRefPtr); static ErrorOr> try_create(NonnullRefPtr); static bool is_port_blocked(int port); int m_pending_loads { 0 }; HashTable> m_active_requests; NonnullRefPtr m_connector; String m_user_agent; RefPtr m_timer; }; }