LCOV - code coverage report
Current view: top level - url - authority_view.hpp (source / functions) Coverage Total Hit Missed
Test: coverage_remapped.info Lines: 100.0 % 43 43
Test Date: 2026-02-25 21:00:01 Functions: 93.8 % 16 15 1

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

Generated by: LCOV version 2.3