diff --git a/src/libutil-tests/url.cc b/src/libutil-tests/url.cc index b248421b3..ae383eb65 100644 --- a/src/libutil-tests/url.cc +++ b/src/libutil-tests/url.cc @@ -273,6 +273,23 @@ TEST(parseURL, emptyStringIsInvalidURL) ASSERT_THROW(parseURL(""), Error); } +TEST(parseURL, parsesHttpUrlWithEmptyPort) +{ + auto s = "http://www.example.org:/file.tar.gz?foo=bar"; + auto parsed = parseURL(s); + + ParsedURL expected{ + .scheme = "http", + .authority = Authority{.hostType = HostType::Name, .host = "www.example.org"}, + .path = "/file.tar.gz", + .query = (StringMap) {{"foo", "bar"}}, + .fragment = "", + }; + + ASSERT_EQ(parsed, expected); + ASSERT_EQ("http://www.example.org/file.tar.gz?foo=bar", parsed.to_string()); +} + /* ---------------------------------------------------------------------------- * decodeQuery * --------------------------------------------------------------------------*/ diff --git a/src/libutil/url.cc b/src/libutil/url.cc index b7f1eff30..73e8cc181 100644 --- a/src/libutil/url.cc +++ b/src/libutil/url.cc @@ -33,7 +33,7 @@ ParsedURL::Authority ParsedURL::Authority::parse(std::string_view encodedAuthori }(); auto port = [&]() -> std::optional { - if (!parsed->has_port()) + if (!parsed->has_port() || parsed->port() == "") return std::nullopt; /* If the port number is non-zero and representable. */ if (auto portNumber = parsed->port_number())