#include "vdm/net/url.hpp" #include #include "vtest.hpp" using vdm::net::split_url; using vdm::net::SplitUrl; using vdm::net::url_filename; VT_TEST(url_basic_https) { auto u = split_url("https://example.com/path/to/file.iso?x=1#frag"); VT_CHECK(u.valid); VT_CHECK_EQ(u.scheme, std::string("https")); VT_CHECK_EQ(u.host, std::string("example.com")); VT_CHECK(!u.port.has_value()); VT_CHECK_EQ(u.path, std::string("/path/to/file.iso")); VT_CHECK_EQ(u.query, std::string("x=1")); VT_CHECK_EQ(u.fragment, std::string("frag")); } VT_TEST(url_port_userinfo_lowercasing) { auto u = split_url("HTTP://User:pw@Host.EXAMPLE.com:8080/a"); VT_CHECK_EQ(u.scheme, std::string("http")); VT_CHECK_EQ(u.userinfo, std::string("User:pw")); VT_CHECK_EQ(u.host, std::string("host.example.com")); VT_REQUIRE(u.port.has_value()); VT_CHECK_EQ(*u.port, 8080); } VT_TEST(url_ipv6_host) { auto u = split_url("http://[2001:db8::1]:9000/file"); VT_CHECK_EQ(u.host, std::string("2001:db8::1")); VT_REQUIRE(u.port.has_value()); VT_CHECK_EQ(*u.port, 9000); } VT_TEST(url_no_path) { auto u = split_url("https://example.com"); VT_CHECK(u.valid); VT_CHECK_EQ(u.path, std::string("")); } VT_TEST(url_non_http_is_invalid_but_parsed) { auto u = split_url("ftp://host/file"); VT_CHECK(!u.valid); // not http/https VT_CHECK_EQ(u.scheme, std::string("ftp")); VT_CHECK(!u.is_http()); } VT_TEST(url_garbage_does_not_crash) { VT_CHECK(!split_url("").valid); VT_CHECK(!split_url("not a url").valid); VT_CHECK(!split_url("://noscheme/x").valid); VT_CHECK(!split_url("http://").valid); auto a = split_url("http://////"); auto b = split_url("https://h/%%%/%"); (void)a; (void)b; } VT_TEST(url_filename_extraction) { VT_CHECK_EQ(url_filename("https://x.com/a/b/report%20final.pdf"), std::string("report final.pdf")); VT_CHECK_EQ(url_filename("https://x.com/a/b/file.iso?sig=abc"), std::string("file.iso")); VT_CHECK_EQ(url_filename("https://x.com/dir/"), std::string("")); VT_CHECK_EQ(url_filename("https://x.com"), std::string("")); VT_CHECK_EQ(url_filename("https://x.com/%2e%2e"), std::string("")); // ".." rejected VT_CHECK_EQ(url_filename("https://x.com/a%2Fb"), std::string("a_b")); // decoded '/' neutralised }