/* * Copyright (c) 2018-2022, 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(X86_64) # define CPU_STRING "x86_64" #elif ARCH(AARCH64) # define CPU_STRING "AArch64" #endif #if defined(AK_OS_SERENITY) # define OS_STRING "SerenityOS" #elif defined(AK_OS_LINUX) # define OS_STRING "Linux" #elif defined(AK_OS_MACOS) # define OS_STRING "macOS" #elif defined(AK_OS_WINDOWS) # define OS_STRING "Windows" #elif defined(AK_OS_FREEBSD) # define OS_STRING "FreeBSD" #elif defined(AK_OS_OPENBSD) # define OS_STRING "OpenBSD" #elif defined(AK_OS_NETBSD) # define OS_STRING "NetBSD" #elif defined(AK_OS_DRAGONFLY) # define OS_STRING "DragonFly" #elif defined(AK_OS_SOLARIS) # define OS_STRING "SunOS" #else # error Unknown OS #endif #define BROWSER_NAME "Ladybird" #define BROWSER_VERSION "1.0" constexpr auto default_user_agent = "Mozilla/5.0 (" OS_STRING "; " CPU_STRING ") LibWeb+LibJS/1.0 " BROWSER_NAME "/" BROWSER_VERSION ""sv; class ResourceLoaderConnectorRequest : public RefCounted { public: virtual ~ResourceLoaderConnectorRequest(); struct CertificateAndKey { DeprecatedString certificate; DeprecatedString key; }; virtual void set_should_buffer_all_input(bool) = 0; virtual bool stop() = 0; virtual void stream_into(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(DeprecatedString 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 = {}, Function timeout_callback = nullptr); void load(const AK::URL&, Function const& response_headers, Optional status_code)> success_callback, Function status_code)> error_callback = nullptr, Optional timeout = {}, Function timeout_callback = nullptr); 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; } DeprecatedString const& user_agent() const { return m_user_agent; } void set_user_agent(DeprecatedString 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; DeprecatedString m_user_agent; Optional m_page {}; }; }