diff --git a/include/boost/url/impl/scheme.ipp b/include/boost/url/impl/scheme.ipp index d8561837..a19ce19e 100644 --- a/include/boost/url/impl/scheme.ipp +++ b/include/boost/url/impl/scheme.ipp @@ -107,6 +107,25 @@ to_string(scheme s) noexcept return ""; } +std::uint16_t +default_port(scheme s) noexcept +{ + switch(s) + { + case scheme::ftp: + return 21; + case scheme::http: + case scheme::ws: + return 80; + case scheme::https: + case scheme::wss: + return 443; + default: + break; + } + return 0; +} + } // urls } // boost diff --git a/include/boost/url/scheme.hpp b/include/boost/url/scheme.hpp index 666d8392..27d37845 100644 --- a/include/boost/url/scheme.hpp +++ b/include/boost/url/scheme.hpp @@ -12,6 +12,7 @@ #include #include +#include namespace boost { namespace urls { @@ -150,6 +151,29 @@ BOOST_URL_DECL string_view to_string(scheme s) noexcept; +/** Return the default port for a known scheme + + This function returns the default port + for the known schemes. If the value does + not represent a known scheme or the scheme + does not represent a protocol, the function + returns zero. + + The following ports are returned by the + function: + + @li @ref scheme::ftp = 21 + @li @ref scheme::http, @ref scheme::ws = 80 + @li @ref scheme::https, @ref scheme::wss = 443 + + @return An integer with the default port number + + @param s The known scheme constant +*/ +BOOST_URL_DECL +std::uint16_t +default_port(scheme s) noexcept; + } // urls } // boost diff --git a/test/unit/scheme.cpp b/test/unit/scheme.cpp index de08c2ed..ece3a64c 100644 --- a/test/unit/scheme.cpp +++ b/test/unit/scheme.cpp @@ -124,6 +124,15 @@ public: check("gopher"); check("magnet"); check("mailto"); + + BOOST_TEST_EQ(default_port(scheme::none), 0); + BOOST_TEST_EQ(default_port(scheme::unknown), 0); + BOOST_TEST_EQ(default_port(scheme::ftp), 21); + BOOST_TEST_EQ(default_port(scheme::file), 0); + BOOST_TEST_EQ(default_port(scheme::http), 80); + BOOST_TEST_EQ(default_port(scheme::https), 443); + BOOST_TEST_EQ(default_port(scheme::ws), 80); + BOOST_TEST_EQ(default_port(scheme::wss), 443); } };