LCOV - code coverage report
Current view: top level - boost/url/authority_view.hpp (source / functions) Coverage Total Hit
Test: coverage_filtered.info Lines: 100.0 % 32 32
Test Date: 2025-11-10 19:06:20 Functions: 100.0 % 10 10

            Line data    Source code
       1              : //
       2              : // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
       3              : //
       4              : // Distributed under the Boost Software License, Version 1.0. (See accompanying
       5              : // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
       6              : //
       7              : // Official repository: https://github.com/boostorg/url
       8              : //
       9              : 
      10              : #ifndef BOOST_URL_AUTHORITY_VIEW_HPP
      11              : #define BOOST_URL_AUTHORITY_VIEW_HPP
      12              : 
      13              : #include <boost/url/detail/config.hpp>
      14              : #include <boost/url/host_type.hpp>
      15              : #include <boost/url/ipv4_address.hpp>
      16              : #include <boost/url/ipv6_address.hpp>
      17              : #include <boost/url/pct_string_view.hpp>
      18              : #include <boost/url/detail/except.hpp>
      19              : #include <boost/url/detail/url_impl.hpp>
      20              : #include <boost/assert.hpp>
      21              : #include <cstddef>
      22              : #include <iosfwd>
      23              : #include <utility>
      24              : 
      25              : namespace boost {
      26              : namespace urls {
      27              : 
      28              : /** A non-owning reference to a valid authority
      29              : 
      30              :     Objects of this type represent valid authority
      31              :     strings constructed from a parsed, external
      32              :     character buffer whose storage is managed
      33              :     by the caller. That is, it acts like a
      34              :     `core::string_view` in terms of ownership.
      35              :     The caller is responsible for ensuring
      36              :     that the lifetime of the underlying
      37              :     character buffer extends until it is no
      38              :     longer referenced.
      39              : 
      40              :     @par Example 1
      41              :     Construction from a string parses the input
      42              :     as an <em>authority</em> and throws an
      43              :     exception on error. Upon success, the
      44              :     constructed object points to the passed
      45              :     character buffer; ownership is not
      46              :     transferred.
      47              :     @code
      48              :     authority_view a( "user:pass@www.example.com:8080" );
      49              :     @endcode
      50              : 
      51              :     @par Example 2
      52              :     The parsing function @ref parse_authority returns
      53              :     a `boost::system::result` containing either a valid
      54              :     @ref authority_view upon success, otherwise it
      55              :     contains an error. The error can be converted to
      56              :     an exception by the caller if desired:
      57              :     @code
      58              :     system::result< authority_view > rv = parse_authority( "user:pass@www.example.com:8080" );
      59              :     @endcode
      60              : 
      61              :     @par BNF
      62              :     @code
      63              :     authority     = [ userinfo "@" ] host [ ":" port ]
      64              : 
      65              :     userinfo      = user [ ":" [ password ] ]
      66              : 
      67              :     user          = *( unreserved / pct-encoded / sub-delims )
      68              :     password      = *( unreserved / pct-encoded / sub-delims / ":" )
      69              : 
      70              :     host          = IP-literal / IPv4address / reg-name
      71              : 
      72              :     port          = *DIGIT
      73              :     @endcode
      74              : 
      75              :     @par Specification
      76              :     @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2"
      77              :         >3.2. Authority (rfc3986)</a>
      78              : 
      79              :     @see
      80              :         @ref parse_authority.
      81              : */
      82              : class BOOST_URL_DECL
      83              :     authority_view
      84              :     : private detail::parts_base
      85              : {
      86              :     detail::url_impl u_;
      87              : 
      88              :     friend struct detail::url_impl;
      89              : 
      90              :     explicit
      91              :     authority_view(
      92              :         detail::url_impl const& u) noexcept;
      93              : 
      94              : public:
      95              :     //--------------------------------------------
      96              :     //
      97              :     // Special Members
      98              :     //
      99              :     //--------------------------------------------
     100              : 
     101              :     /** Destructor
     102              :     */
     103              :     virtual
     104              :     ~authority_view();
     105              : 
     106              :     /** Constructor
     107              : 
     108              :         Default constructed authorities
     109              :         refer to a string with zero length,
     110              :         which is always valid. This matches
     111              :         the grammar for a zero-length host.
     112              : 
     113              :         @par Exception Safety
     114              :         Throws nothing.
     115              : 
     116              :         @par Specification
     117              :     */
     118              :     authority_view() noexcept;
     119              : 
     120              :     /** Construct from a string.
     121              : 
     122              :         This function attempts to construct
     123              :         an authority from the string `s`,
     124              :         which must be a valid authority or
     125              :         else an exception is thrown. Upon
     126              :         successful construction, the view
     127              :         refers to the characters in the
     128              :         buffer pointed to by `s`.
     129              :         Ownership is not transferred; the
     130              :         caller is responsible for ensuring
     131              :         that the lifetime of the buffer
     132              :         extends until the view is destroyed.
     133              : 
     134              :         @param s The string to parse
     135              : 
     136              :         @par BNF
     137              :         @code
     138              :         authority     = [ userinfo "@" ] host [ ":" port ]
     139              : 
     140              :         userinfo      = user [ ":" [ password ] ]
     141              : 
     142              :         user          = *( unreserved / pct-encoded / sub-delims )
     143              :         password      = *( unreserved / pct-encoded / sub-delims / ":" )
     144              : 
     145              :         host          = IP-literal / IPv4address / reg-name
     146              : 
     147              :         port          = *DIGIT
     148              :         @endcode
     149              : 
     150              :         @par Specification
     151              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2"
     152              :             >3.2. Authority (rfc3986)</a>
     153              : 
     154              :         @see
     155              :             @ref parse_authority.
     156              :     */
     157              :     explicit
     158              :     authority_view(core::string_view s);
     159              : 
     160              :     /** Constructor
     161              :     */
     162              :     authority_view(
     163              :         authority_view const&) noexcept;
     164              : 
     165              :     /** Assignment
     166              : 
     167              :         This function assigns the contents of
     168              :         `other` to this object.
     169              : 
     170              :         @param other The object to assign
     171              :         @return A reference to this object
     172              : 
     173              :         @par Exception Safety
     174              :         Throws nothing.
     175              :     */
     176              :     authority_view&
     177              :     operator=(
     178              :         authority_view const& other) noexcept;
     179              : 
     180              :     //--------------------------------------------
     181              :     //
     182              :     // Observers
     183              :     //
     184              :     //--------------------------------------------
     185              : 
     186              :     /** Return the number of characters in the authority
     187              : 
     188              :         This function returns the number of
     189              :         characters in the authority.
     190              : 
     191              :         @return The number of characters in the authority
     192              : 
     193              :         @par Example
     194              :         @code
     195              :         assert( authority_view( "user:pass@www.example.com:8080" ).size() == 30 );
     196              :         @endcode
     197              : 
     198              :         @par Exception Safety
     199              :         Throws nothing.
     200              :     */
     201              :     std::size_t
     202           24 :     size() const noexcept
     203              :     {
     204           24 :         return u_.offset(id_end);
     205              :     }
     206              : 
     207              :     /** Return true if the authority is empty
     208              : 
     209              :         An empty authority has an empty host,
     210              :         no userinfo, and no port.
     211              : 
     212              :         @return `true` if the authority is empty
     213              : 
     214              :         @par Example
     215              :         @code
     216              :         assert( authority_view( "" ).empty() );
     217              :         @endcode
     218              : 
     219              :         @par Exception Safety
     220              :         Throws nothing.
     221              :     */
     222              :     bool
     223            3 :     empty() const noexcept
     224              :     {
     225            3 :         return size() == 0;
     226              :     }
     227              : 
     228              :     /** Return a pointer to the first character
     229              : 
     230              :         This function returns a pointer to the
     231              :         beginning of the view, which is not
     232              :         guaranteed to be null-terminated.
     233              : 
     234              :         @return A pointer to the first character
     235              : 
     236              :         @par Exception Safety
     237              :         Throws nothing.
     238              :     */
     239              :     char const*
     240           20 :     data() const noexcept
     241              :     {
     242           20 :         return u_.cs_;
     243              :     }
     244              : 
     245              :     /** Return the complete authority
     246              : 
     247              :         This function returns the authority
     248              :         as a percent-encoded string.
     249              : 
     250              :         @return The complete authority
     251              : 
     252              :         @par Example
     253              :         @code
     254              :         assert( parse_authority( "www.example.com" ).value().buffer() == "www.example.com" );
     255              :         @endcode
     256              : 
     257              :         @par BNF
     258              :         @code
     259              :         authority   = [ userinfo "@" ] host [ ":" port ]
     260              :         @endcode
     261              : 
     262              :         @par Exception Safety
     263              :         Throws nothing.
     264              : 
     265              :         @par Specification
     266              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2"
     267              :             >3.2. Authority (rfc3986)</a>
     268              :     */
     269              :     core::string_view
     270           18 :     buffer() const noexcept
     271              :     {
     272           18 :         return core::string_view(data(), size());
     273              :     }
     274              : 
     275              :     //--------------------------------------------
     276              :     //
     277              :     // Userinfo
     278              :     //
     279              :     //--------------------------------------------
     280              : 
     281              :     /** Return true if a userinfo is present
     282              : 
     283              :         This function returns true if this
     284              :         contains a userinfo.
     285              : 
     286              :         @return `true` if a userinfo is present
     287              : 
     288              :         @par Example
     289              :         @code
     290              :         assert( url_view( "http://jane%2Ddoe:pass@example.com" ).has_userinfo() );
     291              :         @endcode
     292              : 
     293              :         @par Complexity
     294              :         Constant.
     295              : 
     296              :         @par Exception Safety
     297              :         Throws nothing.
     298              : 
     299              :         @par BNF
     300              :         @code
     301              :         userinfo    = user [ ":" [ password ] ]
     302              : 
     303              :         authority   = [ userinfo "@" ] host [ ":" port ]
     304              :         @endcode
     305              : 
     306              :         @par Specification
     307              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.1"
     308              :             >3.2.1. User Information (rfc3986)</a>
     309              : 
     310              :         @see
     311              :             @ref has_password,
     312              :             @ref encoded_password,
     313              :             @ref encoded_user,
     314              :             @ref encoded_userinfo,
     315              :             @ref password,
     316              :             @ref user,
     317              :             @ref userinfo.
     318              : 
     319              :     */
     320              :     bool
     321              :     has_userinfo() const noexcept;
     322              : 
     323              :     /** Return the userinfo
     324              : 
     325              :         If present, this function returns a
     326              :         string representing the userinfo (which
     327              :         may be empty).
     328              :         Otherwise it returns an empty string.
     329              :         Any percent-escapes in the string are
     330              :         decoded first.
     331              : 
     332              :         @param token A string token to receive the result.
     333              :         @return The userinfo
     334              : 
     335              :         @par Example
     336              :         @code
     337              :         assert( url_view( "http://jane%2Ddoe:pass@example.com" ).userinfo() == "jane-doe:pass" );
     338              :         @endcode
     339              : 
     340              :         @par Complexity
     341              :         Linear in `this->userinfo().size()`.
     342              : 
     343              :         @par Exception Safety
     344              :         Calls to allocate may throw.
     345              : 
     346              :         @par BNF
     347              :         @code
     348              :         userinfo    = user [ ":" [ password ] ]
     349              : 
     350              :         authority   = [ userinfo "@" ] host [ ":" port ]
     351              :         @endcode
     352              : 
     353              :         @par Specification
     354              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.1"
     355              :             >3.2.1. User Information (rfc3986)</a>
     356              : 
     357              :         @see
     358              :             @ref has_password,
     359              :             @ref has_userinfo,
     360              :             @ref encoded_password,
     361              :             @ref encoded_user,
     362              :             @ref encoded_userinfo,
     363              :             @ref password,
     364              :             @ref user.
     365              :     */
     366              :     template<BOOST_URL_STRTOK_TPARAM>
     367              :     BOOST_URL_STRTOK_RETURN
     368           23 :     userinfo(
     369              :         BOOST_URL_STRTOK_ARG(token)) const
     370              :     {
     371           23 :         encoding_opts opt;
     372           23 :         opt.space_as_plus = false;
     373           46 :         return encoded_userinfo().decode(
     374           46 :             opt, std::move(token));
     375              :     }
     376              : 
     377              :     /** Return the userinfo
     378              : 
     379              :         If present, this function returns a
     380              :         string representing the userinfo (which
     381              :         may be empty).
     382              :         Otherwise it returns an empty string.
     383              :         The returned string may contain
     384              :         percent escapes.
     385              : 
     386              :         @return The userinfo
     387              : 
     388              :         @par Example
     389              :         @code
     390              :         assert( url_view( "http://jane%2Ddoe:pass@example.com" ).encoded_userinfo() == "jane%2Ddoe:pass" );
     391              :         @endcode
     392              : 
     393              :         @par Complexity
     394              :         Constant.
     395              : 
     396              :         @par Exception Safety
     397              :         Throws nothing
     398              : 
     399              :         @par BNF
     400              :         @code
     401              :         userinfo    = user [ ":" [ password ] ]
     402              : 
     403              :         authority   = [ userinfo "@" ] host [ ":" port ]
     404              :         @endcode
     405              : 
     406              :         @par Specification
     407              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.1"
     408              :             >3.2.1. User Information (rfc3986)</a>
     409              : 
     410              :         @see
     411              :             @ref has_password,
     412              :             @ref has_userinfo,
     413              :             @ref encoded_password,
     414              :             @ref encoded_user,
     415              :             @ref password,
     416              :             @ref user,
     417              :             @ref userinfo.
     418              :     */
     419              :     pct_string_view
     420              :     encoded_userinfo() const noexcept;
     421              : 
     422              :     //--------------------------------------------
     423              : 
     424              :     /** Return the user
     425              : 
     426              :         If present, this function returns a
     427              :         string representing the user (which
     428              :         may be empty).
     429              :         Otherwise it returns an empty string.
     430              :         Any percent-escapes in the string are
     431              :         decoded first.
     432              : 
     433              :         @param token A string token to receive the result.
     434              :         @return The user
     435              : 
     436              :         @par Example
     437              :         @code
     438              :         assert( url_view( "http://jane%2Ddoe:pass@example.com" ).user() == "jane-doe" );
     439              :         @endcode
     440              : 
     441              :         @par Complexity
     442              :         Linear in `this->user().size()`.
     443              : 
     444              :         @par Exception Safety
     445              :         Calls to allocate may throw.
     446              : 
     447              :         @par BNF
     448              :         @code
     449              :         userinfo    = user [ ":" [ password ] ]
     450              : 
     451              :         user        = *( unreserved / pct-encoded / sub-delims )
     452              :         password    = *( unreserved / pct-encoded / sub-delims / ":" )
     453              :         @endcode
     454              : 
     455              :         @par Specification
     456              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.1"
     457              :             >3.2.1. User Information (rfc3986)</a>
     458              : 
     459              :         @see
     460              :             @ref has_password,
     461              :             @ref has_userinfo,
     462              :             @ref encoded_password,
     463              :             @ref encoded_user,
     464              :             @ref encoded_userinfo,
     465              :             @ref password,
     466              :             @ref userinfo.
     467              :     */
     468              :     template<BOOST_URL_STRTOK_TPARAM>
     469              :     BOOST_URL_STRTOK_RETURN
     470           12 :     user(
     471              :         BOOST_URL_STRTOK_ARG(token)) const
     472              :     {
     473           12 :         encoding_opts opt;
     474           12 :         opt.space_as_plus = false;
     475           24 :         return encoded_user().decode(
     476           24 :             opt, std::move(token));
     477              :     }
     478              : 
     479              :     /** Return the user
     480              : 
     481              :         If present, this function returns a
     482              :         string representing the user (which
     483              :         may be empty).
     484              :         Otherwise it returns an empty string.
     485              :         The returned string may contain
     486              :         percent escapes.
     487              : 
     488              :         @return The user
     489              : 
     490              :         @par Example
     491              :         @code
     492              :         assert( url_view( "http://jane%2Ddoe:pass@example.com" ).encoded_user() == "jane%2Ddoe" );
     493              :         @endcode
     494              : 
     495              :         @par Complexity
     496              :         Constant.
     497              : 
     498              :         @par Exception Safety
     499              :         Throws nothing.
     500              : 
     501              :         @par BNF
     502              :         @code
     503              :         userinfo    = user [ ":" [ password ] ]
     504              : 
     505              :         user        = *( unreserved / pct-encoded / sub-delims )
     506              :         password    = *( unreserved / pct-encoded / sub-delims / ":" )
     507              :         @endcode
     508              : 
     509              :         @par Specification
     510              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.1"
     511              :             >3.2.1. User Information (rfc3986)</a>
     512              : 
     513              :         @see
     514              :             @ref has_password,
     515              :             @ref has_userinfo,
     516              :             @ref encoded_password,
     517              :             @ref encoded_userinfo,
     518              :             @ref password,
     519              :             @ref user,
     520              :             @ref userinfo.
     521              :     */
     522              :     pct_string_view
     523              :     encoded_user() const noexcept;
     524              : 
     525              :     /** Return true if a password is present
     526              : 
     527              :         This function returns true if the
     528              :         userinfo is present and contains
     529              :         a password.
     530              : 
     531              :         @return `true` if a password is present
     532              : 
     533              :         @par Example
     534              :         @code
     535              :         assert( url_view( "http://jane%2Ddoe:pass@example.com" ).has_password() );
     536              :         @endcode
     537              : 
     538              :         @par Complexity
     539              :         Constant.
     540              : 
     541              :         @par Exception Safety
     542              :         Throws nothing.
     543              : 
     544              :         @par BNF
     545              :         @code
     546              :         userinfo    = user [ ":" [ password ] ]
     547              : 
     548              :         user        = *( unreserved / pct-encoded / sub-delims )
     549              :         password    = *( unreserved / pct-encoded / sub-delims / ":" )
     550              :         @endcode
     551              : 
     552              :         @par Specification
     553              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.1"
     554              :             >3.2.1. User Information (rfc3986)</a>
     555              : 
     556              :         @see
     557              :             @ref has_userinfo,
     558              :             @ref encoded_password,
     559              :             @ref encoded_user,
     560              :             @ref encoded_userinfo,
     561              :             @ref password,
     562              :             @ref user,
     563              :             @ref userinfo.
     564              :     */
     565              :     bool
     566              :     has_password() const noexcept;
     567              : 
     568              :     /** Return the password
     569              : 
     570              :         If present, this function returns a
     571              :         string representing the password (which
     572              :         may be an empty string).
     573              :         Otherwise it returns an empty string.
     574              :         Any percent-escapes in the string are
     575              :         decoded first.
     576              : 
     577              :         @param token A string token to receive the result.
     578              :         @return The password
     579              : 
     580              :         @par Example
     581              :         @code
     582              :         assert( url_view( "http://jane%2Ddoe:pass@example.com" ).password() == "pass" );
     583              :         @endcode
     584              : 
     585              :         @par Complexity
     586              :         Linear in `this->password().size()`.
     587              : 
     588              :         @par Exception Safety
     589              :         Calls to allocate may throw.
     590              : 
     591              :         @par BNF
     592              :         @code
     593              :         userinfo    = user [ ":" [ password ] ]
     594              : 
     595              :         user        = *( unreserved / pct-encoded / sub-delims )
     596              :         password    = *( unreserved / pct-encoded / sub-delims / ":" )
     597              :         @endcode
     598              : 
     599              :         @par Specification
     600              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.1"
     601              :             >3.2.1. User Information (rfc3986)</a>
     602              : 
     603              :         @see
     604              :             @ref has_password,
     605              :             @ref has_userinfo,
     606              :             @ref encoded_password,
     607              :             @ref encoded_user,
     608              :             @ref encoded_userinfo,
     609              :             @ref user,
     610              :             @ref userinfo.
     611              :     */
     612              :     template<BOOST_URL_STRTOK_TPARAM>
     613              :     BOOST_URL_STRTOK_RETURN
     614           12 :     password(
     615              :         BOOST_URL_STRTOK_ARG(token)) const
     616              :     {
     617           12 :         encoding_opts opt;
     618           12 :         opt.space_as_plus = false;
     619           24 :         return encoded_password().decode(
     620           24 :             opt, std::move(token));
     621              :     }
     622              : 
     623              :     /** Return the password
     624              : 
     625              :         This function returns the password portion
     626              :         of the userinfo as a percent-encoded string.
     627              : 
     628              :         @return The password
     629              : 
     630              :         @par Example
     631              :         @code
     632              :         assert( url_view( "http://jane%2Ddoe:pass@example.com" ).encoded_password() == "pass" );
     633              :         @endcode
     634              : 
     635              :         @par Complexity
     636              :         Constant.
     637              : 
     638              :         @par Exception Safety
     639              :         Throws nothing.
     640              : 
     641              :         @par BNF
     642              :         @code
     643              :         userinfo    = user [ ":" [ password ] ]
     644              : 
     645              :         user        = *( unreserved / pct-encoded / sub-delims )
     646              :         password    = *( unreserved / pct-encoded / sub-delims / ":" )
     647              :         @endcode
     648              : 
     649              :         @par Specification
     650              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.1"
     651              :             >3.2.1. User Information (rfc3986)</a>
     652              : 
     653              :         @see
     654              :             @ref has_password,
     655              :             @ref has_userinfo,
     656              :             @ref encoded_user,
     657              :             @ref encoded_userinfo,
     658              :             @ref password,
     659              :             @ref user,
     660              :             @ref userinfo.
     661              :     */
     662              :     pct_string_view
     663              :     encoded_password() const noexcept;
     664              : 
     665              :     //--------------------------------------------
     666              :     //
     667              :     // Host
     668              :     //
     669              :     //--------------------------------------------
     670              : 
     671              :     /** Return the host type
     672              : 
     673              :         This function returns one of the
     674              :         following constants representing the
     675              :         type of host present.
     676              : 
     677              :         @li @ref host_type::ipv4
     678              :         @li @ref host_type::ipv6
     679              :         @li @ref host_type::ipvfuture
     680              :         @li @ref host_type::name
     681              : 
     682              :         @return The host type
     683              : 
     684              :         @par Example
     685              :         @code
     686              :         assert( url_view( "https://192.168.0.1/local.htm" ).host_type() == host_type::ipv4 );
     687              :         @endcode
     688              : 
     689              :         @par Complexity
     690              :         Constant.
     691              : 
     692              :         @par Exception Safety
     693              :         Throws nothing.
     694              : 
     695              :         @par Specification
     696              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
     697              :             >3.2.2. Host (rfc3986)</a>
     698              :     */
     699              :     urls::host_type
     700            8 :     host_type() const noexcept
     701              :     {
     702            8 :         return u_.host_type_;
     703              :     }
     704              : 
     705              :     /** Return the host
     706              : 
     707              :         This function returns the host portion
     708              :         of the authority as a string, or the
     709              :         empty string if there is no authority.
     710              :         Any percent-escapes in the string are
     711              :         decoded first.
     712              : 
     713              :         @param token A string token to receive the result.
     714              :         @return The host
     715              : 
     716              :         @par Example
     717              :         @code
     718              :         assert( url_view( "https://www%2droot.example.com/" ).host() == "www-root.example.com" );
     719              :         @endcode
     720              : 
     721              :         @par Complexity
     722              :         Linear in `this->host().size()`.
     723              : 
     724              :         @par Exception Safety
     725              :         Calls to allocate may throw.
     726              : 
     727              :         @par BNF
     728              :         @code
     729              :         host        = IP-literal / IPv4address / reg-name
     730              : 
     731              :         IP-literal  = "[" ( IPv6address / IPvFuture  ) "]"
     732              : 
     733              :         reg-name    = *( unreserved / pct-encoded / "-" / ".")
     734              :         @endcode
     735              : 
     736              :         @par Specification
     737              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
     738              :             >3.2.2. Host (rfc3986)</a>
     739              :     */
     740              :     template<BOOST_URL_STRTOK_TPARAM>
     741              :     BOOST_URL_STRTOK_RETURN
     742            4 :     host(
     743              :         BOOST_URL_STRTOK_ARG(token)) const
     744              :     {
     745            4 :         encoding_opts opt;
     746            4 :         opt.space_as_plus = false;
     747            8 :         return encoded_host().decode(
     748            8 :             opt, std::move(token));
     749              :     }
     750              : 
     751              :     /** Return the host
     752              : 
     753              :         This function returns the host portion
     754              :         of the authority as a string, or the
     755              :         empty string if there is no authority.
     756              :         The returned string may contain
     757              :         percent escapes.
     758              : 
     759              :         @return The host
     760              : 
     761              :         @par Example
     762              :         @code
     763              :         assert( url_view( "https://www%2droot.example.com/" ).encoded_host() == "www%2droot.example.com" );
     764              :         @endcode
     765              : 
     766              :         @par Complexity
     767              :         Constant.
     768              : 
     769              :         @par Exception Safety
     770              :         Throws nothing.
     771              : 
     772              :         @par BNF
     773              :         @code
     774              :         host        = IP-literal / IPv4address / reg-name
     775              : 
     776              :         IP-literal  = "[" ( IPv6address / IPvFuture  ) "]"
     777              : 
     778              :         reg-name    = *( unreserved / pct-encoded / "-" / ".")
     779              :         @endcode
     780              : 
     781              :         @par Specification
     782              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
     783              :             >3.2.2. Host (rfc3986)</a>
     784              :     */
     785              :     pct_string_view
     786              :     encoded_host() const noexcept;
     787              : 
     788              :     /** Return the host
     789              : 
     790              :         The value returned by this function
     791              :         depends on the type of host returned
     792              :         from the function @ref host_type.
     793              : 
     794              :         @li If the type is @ref host_type::ipv4,
     795              :         then the IPv4 address string is returned.
     796              : 
     797              :         @li If the type is @ref host_type::ipv6,
     798              :         then the IPv6 address string is returned,
     799              :         without any enclosing brackets.
     800              : 
     801              :         @li If the type is @ref host_type::ipvfuture,
     802              :         then the IPvFuture address string is returned,
     803              :         without any enclosing brackets.
     804              : 
     805              :         @li If the type is @ref host_type::name,
     806              :         then the host name string is returned.
     807              :         Any percent-escapes in the string are
     808              :         decoded first.
     809              : 
     810              :         @li If the type is @ref host_type::none,
     811              :         then an empty string is returned.
     812              : 
     813              :         @param token A string token to receive the result.
     814              :         @return The host address
     815              : 
     816              :         @par Example
     817              :         @code
     818              :         assert( url_view( "https://[1::6:c0a8:1]/" ).host_address() == "1::6:c0a8:1" );
     819              :         @endcode
     820              : 
     821              :         @par Complexity
     822              :         Linear in `this->host_address().size()`.
     823              : 
     824              :         @par Exception Safety
     825              :         Calls to allocate may throw.
     826              : 
     827              :         @par BNF
     828              :         @code
     829              :         host        = IP-literal / IPv4address / reg-name
     830              : 
     831              :         IP-literal  = "[" ( IPv6address / IPvFuture  ) "]"
     832              : 
     833              :         reg-name    = *( unreserved / pct-encoded / "-" / ".")
     834              :         @endcode
     835              : 
     836              :         @par Specification
     837              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
     838              :             >3.2.2. Host (rfc3986)</a>
     839              :     */
     840              :     template<BOOST_URL_STRTOK_TPARAM>
     841              :     BOOST_URL_STRTOK_RETURN
     842              :     host_address(
     843              :         BOOST_URL_STRTOK_ARG(token)) const
     844              :     {
     845              :         encoding_opts opt;
     846              :         opt.space_as_plus = false;
     847              :         return encoded_host_address().decode(
     848              :             opt, std::move(token));
     849              :     }
     850              : 
     851              :     /** Return the host
     852              : 
     853              :         The value returned by this function
     854              :         depends on the type of host returned
     855              :         from the function @ref host_type.
     856              : 
     857              :         @li If the type is @ref host_type::ipv4,
     858              :         then the IPv4 address string is returned.
     859              : 
     860              :         @li If the type is @ref host_type::ipv6,
     861              :         then the IPv6 address string is returned,
     862              :         without any enclosing brackets.
     863              : 
     864              :         @li If the type is @ref host_type::ipvfuture,
     865              :         then the IPvFuture address string is returned,
     866              :         without any enclosing brackets.
     867              : 
     868              :         @li If the type is @ref host_type::name,
     869              :         then the host name string is returned.
     870              :         Any percent-escapes in the string are
     871              :         decoded first.
     872              : 
     873              :         @li If the type is @ref host_type::none,
     874              :         then an empty string is returned.
     875              :         The returned string may contain
     876              :         percent escapes.
     877              : 
     878              :         @return The host address
     879              : 
     880              :         @par Example
     881              :         @code
     882              :         assert( url_view( "https://www%2droot.example.com/" ).encoded_host_address() == "www%2droot.example.com" );
     883              :         @endcode
     884              : 
     885              :         @par Complexity
     886              :         Constant.
     887              : 
     888              :         @par Exception Safety
     889              :         Throws nothing.
     890              : 
     891              :         @par BNF
     892              :         @code
     893              :         host        = IP-literal / IPv4address / reg-name
     894              : 
     895              :         IP-literal  = "[" ( IPv6address / IPvFuture  ) "]"
     896              : 
     897              :         reg-name    = *( unreserved / pct-encoded / "-" / ".")
     898              :         @endcode
     899              : 
     900              :         @par Specification
     901              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
     902              :             >3.2.2. Host (rfc3986)</a>
     903              :     */
     904              :     pct_string_view
     905              :     encoded_host_address() const noexcept;
     906              : 
     907              :     /** Return the host IPv4 address
     908              : 
     909              :         If the host type is @ref host_type::ipv4,
     910              :         this function returns the address as
     911              :         a value of type @ref ipv4_address.
     912              :         Otherwise, if the host type is not an IPv4
     913              :         address, it returns a default-constructed
     914              :         value which is equal to the unspecified
     915              :         address "0.0.0.0".
     916              : 
     917              :         @return The host IPv4 address
     918              : 
     919              :         @par Example
     920              :         @code
     921              :         assert( url_view( "http://127.0.0.1/index.htm?user=win95" ).host_ipv4_address() == ipv4_address( "127.0.0.1" ) );
     922              :         @endcode
     923              : 
     924              :         @par Complexity
     925              :         Constant.
     926              : 
     927              :         @par Exception Safety
     928              :         Throws nothing.
     929              : 
     930              :         @par BNF
     931              :         @code
     932              :         IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet
     933              : 
     934              :         dec-octet   = DIGIT                 ; 0-9
     935              :                     / %x31-39 DIGIT         ; 10-99
     936              :                     / "1" 2DIGIT            ; 100-199
     937              :                     / "2" %x30-34 DIGIT     ; 200-249
     938              :                     / "25" %x30-35          ; 250-255
     939              :         @endcode
     940              : 
     941              :         @par Specification
     942              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
     943              :             >3.2.2. Host (rfc3986)</a>
     944              :     */
     945              :     ipv4_address
     946              :     host_ipv4_address() const noexcept;
     947              : 
     948              :     /** Return the host IPv6 address
     949              : 
     950              :         If the host type is @ref host_type::ipv6,
     951              :         this function returns the address as
     952              :         a value of type @ref ipv6_address.
     953              :         Otherwise, if the host type is not an IPv6
     954              :         address, it returns a default-constructed
     955              :         value which is equal to the unspecified
     956              :         address "0:0:0:0:0:0:0:0".
     957              : 
     958              :         @return The host IPv6 address
     959              : 
     960              :         @par Example
     961              :         @code
     962              :         assert( url_view( "ftp://[::1]/" ).host_ipv6_address() == ipv6_address( "::1" ) );
     963              :         @endcode
     964              : 
     965              :         @par Complexity
     966              :         Constant.
     967              : 
     968              :         @par Exception Safety
     969              :         Throws nothing.
     970              : 
     971              :         @par BNF
     972              :         @code
     973              :         IPv6address =                            6( h16 ":" ) ls32
     974              :                     /                       "::" 5( h16 ":" ) ls32
     975              :                     / [               h16 ] "::" 4( h16 ":" ) ls32
     976              :                     / [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32
     977              :                     / [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32
     978              :                     / [ *3( h16 ":" ) h16 ] "::"    h16 ":"   ls32
     979              :                     / [ *4( h16 ":" ) h16 ] "::"              ls32
     980              :                     / [ *5( h16 ":" ) h16 ] "::"              h16
     981              :                     / [ *6( h16 ":" ) h16 ] "::"
     982              : 
     983              :         ls32        = ( h16 ":" h16 ) / IPv4address
     984              :                     ; least-significant 32 bits of address
     985              : 
     986              :         h16         = 1*4HEXDIG
     987              :                     ; 16 bits of address represented in hexadecimal
     988              :         @endcode
     989              : 
     990              :         @par Specification
     991              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
     992              :             >3.2.2. Host (rfc3986)</a>
     993              :     */
     994              :     ipv6_address
     995              :     host_ipv6_address() const noexcept;
     996              : 
     997              :     /** Return the host IPvFuture address
     998              : 
     999              :         If the host type is @ref host_type::ipvfuture,
    1000              :         this function returns the address as
    1001              :         a string.
    1002              :         Otherwise, if the host type is not an
    1003              :         IPvFuture address, it returns an
    1004              :         empty string.
    1005              : 
    1006              :         @return The host IPvFuture address
    1007              : 
    1008              :         @par Example
    1009              :         @code
    1010              :         assert( url_view( "http://[v1fe.d:9]/index.htm" ).host_ipvfuture() == "v1fe.d:9" );
    1011              :         @endcode
    1012              : 
    1013              :         @par Complexity
    1014              :         Constant.
    1015              : 
    1016              :         @par Exception Safety
    1017              :         Throws nothing.
    1018              : 
    1019              :         @par BNF
    1020              :         @code
    1021              :         IPvFuture  = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" )
    1022              :         @endcode
    1023              : 
    1024              :         @par Specification
    1025              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
    1026              :             >3.2.2. Host (rfc3986)</a>
    1027              :     */
    1028              :     core::string_view
    1029              :     host_ipvfuture() const noexcept;
    1030              : 
    1031              :     /** Return the host name
    1032              : 
    1033              :         If the host type is @ref host_type::name,
    1034              :         this function returns the name as
    1035              :         a string.
    1036              :         Otherwise, if the host type is not a
    1037              :         name, it returns an empty string.
    1038              :         Any percent-escapes in the string are
    1039              :         decoded first.
    1040              : 
    1041              :         @param token A string token to receive the result
    1042              :         @return The host name
    1043              : 
    1044              :         @par Example
    1045              :         @code
    1046              :         assert( url_view( "https://www%2droot.example.com/" ).host_name() == "www-root.example.com" );
    1047              :         @endcode
    1048              : 
    1049              :         @par Complexity
    1050              :         Linear in `this->host_name().size()`.
    1051              : 
    1052              :         @par Exception Safety
    1053              :         Calls to allocate may throw.
    1054              : 
    1055              :         @par BNF
    1056              :         @code
    1057              :         host        = IP-literal / IPv4address / reg-name
    1058              : 
    1059              :         IP-literal  = "[" ( IPv6address / IPvFuture  ) "]"
    1060              : 
    1061              :         reg-name    = *( unreserved / pct-encoded / "-" / ".")
    1062              :         @endcode
    1063              : 
    1064              :         @par Specification
    1065              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
    1066              :             >3.2.2. Host (rfc3986)</a>
    1067              :     */
    1068              :     template<BOOST_URL_STRTOK_TPARAM>
    1069              :     BOOST_URL_STRTOK_RETURN
    1070              :     host_name(
    1071              :         BOOST_URL_STRTOK_ARG(token)) const
    1072              :     {
    1073              :         encoding_opts opt;
    1074              :         opt.space_as_plus = false;
    1075              :         return encoded_host_name().decode(
    1076              :             opt, std::move(token));
    1077              :     }
    1078              : 
    1079              :     /** Return the host name
    1080              : 
    1081              :         If the host type is @ref host_type::name,
    1082              :         this function returns the name as
    1083              :         a string.
    1084              :         Otherwise, if the host type is not an
    1085              :         name, it returns an empty string.
    1086              :         The returned string may contain
    1087              :         percent escapes.
    1088              : 
    1089              :         @return The host name
    1090              : 
    1091              :         @par Example
    1092              :         @code
    1093              :         assert( url_view( "https://www%2droot.example.com/" ).encoded_host_name() == "www%2droot.example.com" );
    1094              :         @endcode
    1095              : 
    1096              :         @par Complexity
    1097              :         Constant.
    1098              : 
    1099              :         @par Exception Safety
    1100              :         Throws nothing.
    1101              : 
    1102              :         @par BNF
    1103              :         @code
    1104              :         host        = IP-literal / IPv4address / reg-name
    1105              : 
    1106              :         IP-literal  = "[" ( IPv6address / IPvFuture  ) "]"
    1107              : 
    1108              :         reg-name    = *( unreserved / pct-encoded / "-" / ".")
    1109              :         @endcode
    1110              : 
    1111              :         @par Specification
    1112              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
    1113              :             >3.2.2. Host (rfc3986)</a>
    1114              :     */
    1115              :     pct_string_view
    1116              :     encoded_host_name() const noexcept;
    1117              : 
    1118              :     //--------------------------------------------
    1119              :     //
    1120              :     // Port
    1121              :     //
    1122              :     //--------------------------------------------
    1123              : 
    1124              :     /** Return true if a port is present
    1125              : 
    1126              :         This function returns true if an
    1127              :         authority is present and contains a port.
    1128              : 
    1129              :         @return `true` if a port is present, otherwise `false`
    1130              : 
    1131              :         @par Example
    1132              :         @code
    1133              :         assert( url_view( "wss://www.example.com:443" ).has_port() );
    1134              :         @endcode
    1135              : 
    1136              :         @par Complexity
    1137              :         Constant.
    1138              : 
    1139              :         @par Exception Safety
    1140              :         Throws nothing.
    1141              : 
    1142              :         @par BNF
    1143              :         @code
    1144              :         authority   = [ userinfo "@" ] host [ ":" port ]
    1145              : 
    1146              :         port        = *DIGIT
    1147              :         @endcode
    1148              : 
    1149              :         @par Specification
    1150              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.3"
    1151              :             >3.2.3. Port (rfc3986)</a>
    1152              : 
    1153              :         @see
    1154              :             @ref encoded_host_and_port,
    1155              :             @ref port,
    1156              :             @ref port_number.
    1157              :     */
    1158              :     bool
    1159              :     has_port() const noexcept;
    1160              : 
    1161              :     /** Return the port
    1162              : 
    1163              :         If present, this function returns a
    1164              :         string representing the port (which
    1165              :         may be empty).
    1166              :         Otherwise it returns an empty string.
    1167              : 
    1168              :         @return The port as a string
    1169              : 
    1170              :         @par Example
    1171              :         @code
    1172              :         assert( url_view( "http://localhost.com:8080" ).port() == "8080" );
    1173              :         @endcode
    1174              : 
    1175              :         @par Complexity
    1176              :         Constant.
    1177              : 
    1178              :         @par Exception Safety
    1179              :         Throws nothing.
    1180              : 
    1181              :         @par BNF
    1182              :         @code
    1183              :         port        = *DIGIT
    1184              :         @endcode
    1185              : 
    1186              :         @par Specification
    1187              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.3"
    1188              :             >3.2.3. Port (rfc3986)</a>
    1189              : 
    1190              :         @see
    1191              :             @ref encoded_host_and_port,
    1192              :             @ref has_port,
    1193              :             @ref port_number.
    1194              :     */
    1195              :     core::string_view
    1196              :     port() const noexcept;
    1197              : 
    1198              :     /** Return the port
    1199              : 
    1200              :         If a port is present and the numerical
    1201              :         value is representable, it is returned
    1202              :         as an unsigned integer. Otherwise, the
    1203              :         number zero is returned.
    1204              : 
    1205              :         @return The port number
    1206              : 
    1207              :         @par Example
    1208              :         @code
    1209              :         assert( url_view( "http://localhost.com:8080" ).port_number() == 8080 );
    1210              :         @endcode
    1211              : 
    1212              :         @par Complexity
    1213              :         Constant.
    1214              : 
    1215              :         @par Exception Safety
    1216              :         Throws nothing.
    1217              : 
    1218              :         @par BNF
    1219              :         @code
    1220              :         port        = *DIGIT
    1221              :         @endcode
    1222              : 
    1223              :         @par Specification
    1224              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.3"
    1225              :             >3.2.3. Port (rfc3986)</a>
    1226              : 
    1227              :         @see
    1228              :             @ref encoded_host_and_port,
    1229              :             @ref has_port,
    1230              :             @ref port.
    1231              :     */
    1232              :     std::uint16_t
    1233              :     port_number() const noexcept;
    1234              : 
    1235              :     /** Return the host and port
    1236              : 
    1237              :         If an authority is present, this
    1238              :         function returns the host and optional
    1239              :         port as a string, which may be empty.
    1240              :         Otherwise it returns an empty string.
    1241              :         The returned string may contain
    1242              :         percent escapes.
    1243              : 
    1244              :         @par Example
    1245              :         @code
    1246              :         assert( url_view( "http://www.example.com:8080/index.htm" ).encoded_host_and_port() == "www.example.com:8080" );
    1247              :         @endcode
    1248              : 
    1249              :         @par Complexity
    1250              :         Constant.
    1251              : 
    1252              :         @par Exception Safety
    1253              :         Throws nothing.
    1254              : 
    1255              :         @par BNF
    1256              :         @code
    1257              :         authority   = [ userinfo "@" ] host [ ":" port ]
    1258              :         @endcode
    1259              : 
    1260              :         @par Specification
    1261              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
    1262              :             >3.2.2.  Host (rfc3986)</a>
    1263              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.3"
    1264              :             >3.2.3. Port (rfc3986)</a>
    1265              : 
    1266              :         @see
    1267              :             @ref has_port,
    1268              :             @ref port,
    1269              :             @ref port_number.
    1270              : 
    1271              :         @return The host and port
    1272              :     */
    1273              :     pct_string_view
    1274              :     encoded_host_and_port() const noexcept;
    1275              : 
    1276              :     //--------------------------------------------
    1277              :     //
    1278              :     // Comparison
    1279              :     //
    1280              :     //--------------------------------------------
    1281              : 
    1282              :     /** Return the result of comparing this with another authority
    1283              : 
    1284              :         This function compares two authorities
    1285              :         according to Syntax-Based comparison
    1286              :         algorithm.
    1287              : 
    1288              :         @par Exception Safety
    1289              :         Throws nothing.
    1290              : 
    1291              :         @param other The authority to compare
    1292              : 
    1293              :         @return `-1` if `*this < other`, `0` if
    1294              :         `this == other`, and 1 if `this > other`.
    1295              : 
    1296              :         @par Specification
    1297              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-6.2.2"
    1298              :             >6.2.2 Syntax-Based Normalization (rfc3986)</a>
    1299              :     */
    1300              :     int
    1301              :     compare(authority_view const& other) const noexcept;
    1302              : 
    1303              :     /** Return the result of comparing two authorities.
    1304              :         The authorities are compared component
    1305              :         by component as if they were first
    1306              :         normalized.
    1307              : 
    1308              :         @par Complexity
    1309              :         Linear in `min( a0.size(), a1.size() )`
    1310              : 
    1311              :         @par Exception Safety
    1312              :         Throws nothing
    1313              : 
    1314              :         @param a0 The first authority to compare
    1315              :         @param a1 The second authority to compare
    1316              :         @return `true` if `a0 == a1`, otherwise `false`
    1317              :     */
    1318              :     friend
    1319              :     bool
    1320              :     operator==(
    1321              :         authority_view const& a0,
    1322              :         authority_view const& a1) noexcept
    1323              :     {
    1324              :         return a0.compare(a1) == 0;
    1325              :     }
    1326              : 
    1327              :     /** Return the result of comparing two authorities.
    1328              :         The authorities are compared component
    1329              :         by component as if they were first
    1330              :         normalized.
    1331              : 
    1332              :         @par Complexity
    1333              :         Linear in `min( a0.size(), a1.size() )`
    1334              : 
    1335              :         @par Exception Safety
    1336              :         Throws nothing
    1337              : 
    1338              :         @param a0 The first authority to compare
    1339              :         @param a1 The second authority to compare
    1340              :         @return `true` if `a0 != a1`, otherwise `false`
    1341              :     */
    1342              :     friend
    1343              :     bool
    1344              :     operator!=(
    1345              :         authority_view const& a0,
    1346              :         authority_view const& a1) noexcept
    1347              :     {
    1348              :         return ! (a0 == a1);
    1349              :     }
    1350              : 
    1351              :     /** Return the result of comparing two authorities.
    1352              :         The authorities are compared component
    1353              :         by component as if they were first
    1354              :         normalized.
    1355              : 
    1356              :         @par Complexity
    1357              :         Linear in `min( a0.size(), a1.size() )`
    1358              : 
    1359              :         @par Exception Safety
    1360              :         Throws nothing
    1361              : 
    1362              :         @param a0 The first authority to compare
    1363              :         @param a1 The second authority to compare
    1364              :         @return `true` if `a0 < a1`, otherwise `false`
    1365              :     */
    1366              :     friend
    1367              :     bool
    1368              :     operator<(
    1369              :         authority_view const& a0,
    1370              :         authority_view const& a1) noexcept
    1371              :     {
    1372              :         return a0.compare(a1) < 0;
    1373              :     }
    1374              : 
    1375              :     /** Return the result of comparing two authorities.
    1376              :         The authorities are compared component
    1377              :         by component as if they were first
    1378              :         normalized.
    1379              : 
    1380              :         @par Complexity
    1381              :         Linear in `min( a0.size(), a1.size() )`
    1382              : 
    1383              :         @par Exception Safety
    1384              :         Throws nothing
    1385              : 
    1386              :         @param a0 The first authority to compare
    1387              :         @param a1 The second authority to compare
    1388              :         @return `true` if `a0 <= a1`, otherwise `false`
    1389              :     */
    1390              :     friend
    1391              :     bool
    1392              :     operator<=(
    1393              :         authority_view const& a0,
    1394              :         authority_view const& a1) noexcept
    1395              :     {
    1396              :         return a0.compare(a1) <= 0;
    1397              :     }
    1398              : 
    1399              :     /** Return the result of comparing two authorities.
    1400              :         The authorities are compared component
    1401              :         by component as if they were first
    1402              :         normalized.
    1403              : 
    1404              :         @par Complexity
    1405              :         Linear in `min( a0.size(), a1.size() )`
    1406              : 
    1407              :         @par Exception Safety
    1408              :         Throws nothing
    1409              : 
    1410              :         @param a0 The first authority to compare
    1411              :         @param a1 The second authority to compare
    1412              :         @return `true` if `a0 > a1`, otherwise `false`
    1413              :     */
    1414              :     friend
    1415              :     bool
    1416              :     operator>(
    1417              :         authority_view const& a0,
    1418              :         authority_view const& a1) noexcept
    1419              :     {
    1420              :         return a0.compare(a1) > 0;
    1421              :     }
    1422              : 
    1423              :     /** Return the result of comparing two authorities.
    1424              :         The authorities are compared component
    1425              :         by component as if they were first
    1426              :         normalized.
    1427              : 
    1428              :         @par Complexity
    1429              :         Linear in `min( a0.size(), a1.size() )`
    1430              : 
    1431              :         @par Exception Safety
    1432              :         Throws nothing
    1433              : 
    1434              :         @param a0 The first authority to compare
    1435              :         @param a1 The second authority to compare
    1436              :         @return `true` if `a0 >= a1`, otherwise `false`
    1437              :     */
    1438              :     friend
    1439              :     bool
    1440              :     operator>=(
    1441              :         authority_view const& a0,
    1442              :         authority_view const& a1) noexcept
    1443              :     {
    1444              :         return a0.compare(a1) >= 0;
    1445              :     }
    1446              : 
    1447              :     //--------------------------------------------
    1448              : 
    1449              :     /** Format the encoded authority to the output stream
    1450              : 
    1451              :         This hidden friend function serializes the encoded URL
    1452              :         to the output stream.
    1453              : 
    1454              :         @par Example
    1455              :         @code
    1456              :         authority_view a( "www.example.com" );
    1457              : 
    1458              :         std::cout << a << std::endl;
    1459              :         @endcode
    1460              : 
    1461              :         @return A reference to the output stream, for chaining
    1462              : 
    1463              :         @param os The output stream to write to
    1464              : 
    1465              :         @param a The URL to write
    1466              :     */
    1467              :     friend
    1468              :     std::ostream&
    1469            1 :     operator<<(
    1470              :         std::ostream& os,
    1471              :         authority_view const& a)
    1472              :     {
    1473            1 :         return os << a.buffer();
    1474              :     }
    1475              : };
    1476              : 
    1477              : /** Format the encoded authority to the output stream
    1478              : 
    1479              :     This function serializes the encoded URL
    1480              :     to the output stream.
    1481              : 
    1482              :     @par Example
    1483              :     @code
    1484              :     authority_view a( "www.example.com" );
    1485              : 
    1486              :     std::cout << a << std::endl;
    1487              :     @endcode
    1488              : 
    1489              :     @return A reference to the output stream, for chaining
    1490              : 
    1491              :     @param os The output stream to write to
    1492              : 
    1493              :     @param a The URL to write
    1494              : */
    1495              : std::ostream&
    1496              : operator<<(
    1497              :     std::ostream& os,
    1498              :     authority_view const& a);
    1499              : 
    1500              : //------------------------------------------------
    1501              : 
    1502              : /** Parse an authority
    1503              : 
    1504              :     This function parses a string according to
    1505              :     the authority grammar below, and returns an
    1506              :     @ref authority_view referencing the string.
    1507              :     Ownership of the string is not transferred;
    1508              :     the caller is responsible for ensuring that
    1509              :     the lifetime of the string extends until the
    1510              :     view is no longer being accessed.
    1511              : 
    1512              :     @par BNF
    1513              :     @code
    1514              :     authority     = [ userinfo "@" ] host [ ":" port ]
    1515              : 
    1516              :     userinfo      = user [ ":" [ password ] ]
    1517              : 
    1518              :     user          = *( unreserved / pct-encoded / sub-delims )
    1519              :     password      = *( unreserved / pct-encoded / sub-delims / ":" )
    1520              : 
    1521              :     host          = IP-literal / IPv4address / reg-name
    1522              : 
    1523              :     port          = *DIGIT
    1524              :     @endcode
    1525              : 
    1526              :     @par Exception Safety
    1527              :     Throws nothing.
    1528              : 
    1529              :     @return A view to the parsed authority
    1530              : 
    1531              :     @param s The string to parse
    1532              : 
    1533              :     @par Specification
    1534              :     @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2"
    1535              :         >3.2. Authority (rfc3986)</a>
    1536              : 
    1537              :     @see
    1538              :         @ref authority_view.
    1539              : */
    1540              : BOOST_URL_DECL
    1541              : system::result<authority_view>
    1542              : parse_authority(
    1543              :     core::string_view s) noexcept;
    1544              : 
    1545              : //------------------------------------------------
    1546              : 
    1547              : } // urls
    1548              : } // boost
    1549              : 
    1550              : #endif
        

Generated by: LCOV version 2.1