diff --git a/AK/URL.cpp b/AK/URL.cpp index b9395bf3def..a6c786d0407 100644 --- a/AK/URL.cpp +++ b/AK/URL.cpp @@ -178,14 +178,17 @@ u16 URL::default_port_for_scheme(const StringView& scheme) return 0; } -URL URL::create_with_file_scheme(const String& path, const String& fragment) +URL URL::create_with_file_scheme(const String& path, const String& fragment, const String& hostname) { LexicalPath lexical_path(path); if (!lexical_path.is_valid() || !lexical_path.is_absolute()) return {}; + URL url; url.set_scheme("file"); - url.set_host(String::empty()); + // NOTE: If the hostname is localhost (or null, which implies localhost), it should be set to the empty string. + // This is because a file URL always needs a non-null hostname. + url.set_host(hostname.is_null() || hostname == "localhost" ? String::empty() : hostname); url.set_paths(lexical_path.parts()); // NOTE: To indicate that we want to end the path with a slash, we have to append an empty path segment. if (path.ends_with('/')) diff --git a/AK/URL.h b/AK/URL.h index 85ab2f72d07..8128e55b67e 100644 --- a/AK/URL.h +++ b/AK/URL.h @@ -92,7 +92,7 @@ public: const String& data_payload() const { return m_data_payload; } static URL create_with_url_or_path(const String&); - static URL create_with_file_scheme(const String& path, const String& fragment = {}); + static URL create_with_file_scheme(const String& path, const String& fragment = {}, const String& hostname = {}); static URL create_with_file_protocol(const String& path, const String& fragment = {}) { return create_with_file_scheme(path, fragment); } static URL create_with_data(const StringView& mime_type, const StringView& payload, bool is_base64 = false);