From 5caaa52bee16b4016cfee5ae0a78292c5c0987d5 Mon Sep 17 00:00:00 2001 From: Max Wipfli Date: Sat, 29 May 2021 21:57:20 +0200 Subject: [PATCH] AK: Add hostname parameter to URL::create_with_file_scheme() This adds a hostname parameter as the third parameter to URL::create_with_file_scheme(). If the hostname is "localhost", it will be ignored (as per the URL specification). This can for example be used by ls(1) to create more conforming file URLs. --- AK/URL.cpp | 7 +++++-- AK/URL.h | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/AK/URL.cpp b/AK/URL.cpp index b9395bf3de..a6c786d040 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 85ab2f72d0..8128e55b67 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);