LCOV - code coverage report
Current view: top level - boost/url/url_view_base.hpp (source / functions) Coverage Total Hit
Test: coverage_filtered.info Lines: 100.0 % 84 84
Test Date: 2024-09-08 09:46:47 Functions: 96.7 % 30 29

            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_URL_VIEW_BASE_HPP
      12              : #define BOOST_URL_URL_VIEW_BASE_HPP
      13              : 
      14              : #include <boost/url/detail/config.hpp>
      15              : #include <boost/url/authority_view.hpp>
      16              : #include <boost/url/host_type.hpp>
      17              : #include <boost/url/ipv4_address.hpp>
      18              : #include <boost/url/ipv6_address.hpp>
      19              : #include <boost/url/params_view.hpp>
      20              : #include <boost/url/params_encoded_view.hpp>
      21              : #include <boost/url/pct_string_view.hpp>
      22              : #include <boost/url/scheme.hpp>
      23              : #include <boost/url/segments_encoded_view.hpp>
      24              : #include <boost/url/segments_view.hpp>
      25              : #include <boost/url/detail/url_impl.hpp>
      26              : #include <boost/url/grammar/string_token.hpp>
      27              : #include <boost/assert.hpp>
      28              : #include <cstddef>
      29              : #include <cstdint>
      30              : #include <iosfwd>
      31              : #include <memory>
      32              : #include <string>
      33              : #include <utility>
      34              : 
      35              : namespace boost {
      36              : namespace urls {
      37              : 
      38              : #ifndef BOOST_URL_DOCS
      39              : namespace detail {
      40              : struct pattern;
      41              : }
      42              : #endif
      43              : 
      44              : 
      45              : /** Common functionality for containers
      46              : 
      47              :     This base class is used by the library
      48              :     to provide common member functions for
      49              :     containers. This cannot be instantiated
      50              :     directly; Instead, use one of the
      51              :     containers or functions:
      52              : 
      53              :     @par Containers
      54              :         @li @ref url
      55              :         @li @ref url_view
      56              :         @li @ref static_url
      57              : 
      58              :     @par Functions
      59              :         @li @ref parse_absolute_uri
      60              :         @li @ref parse_origin_form
      61              :         @li @ref parse_relative_ref
      62              :         @li @ref parse_uri
      63              :         @li @ref parse_uri_reference
      64              : */
      65              : class BOOST_URL_DECL
      66              :     url_view_base
      67              :     : private detail::parts_base
      68              : {
      69              :     detail::url_impl impl_;
      70              :     detail::url_impl const* pi_;
      71              : 
      72              :     friend class url;
      73              :     friend class url_base;
      74              :     friend class url_view;
      75              :     friend class static_url_base;
      76              :     friend class params_base;
      77              :     friend class params_encoded_base;
      78              :     friend class params_encoded_ref;
      79              :     friend class params_encoded_view;
      80              :     friend class params_ref;
      81              :     friend class params_view;
      82              :     friend class segments_base;
      83              :     friend class segments_encoded_base;
      84              :     friend class segments_encoded_ref;
      85              :     friend class segments_encoded_view;
      86              :     friend class segments_ref;
      87              :     friend class segments_view;
      88              :     friend struct detail::pattern;
      89              : 
      90              :     struct shared_impl;
      91              : 
      92              :     url_view_base() noexcept;
      93              : 
      94              :     explicit url_view_base(
      95              :         detail::url_impl const&) noexcept;
      96              : 
      97              :     ~url_view_base() = default;
      98              : 
      99              :     url_view_base(
     100              :         url_view_base const& o) noexcept
     101              :         : impl_(o.impl_)
     102              :         , pi_(o.pi_)
     103              :     {
     104              :         if (pi_ == &o.impl_)
     105              :             pi_ = &impl_;
     106              :     }
     107              : 
     108              :     url_view_base& operator=(
     109              :         url_view_base const&) = delete;
     110              : 
     111              : protected:
     112              :     /** Calculate a hash of the url
     113              : 
     114              :         This function calculates a hash of the
     115              :         url as if it were always normalized.
     116              : 
     117              :         @par Complexity
     118              :         Linear in `this->size()`.
     119              : 
     120              :         @par Exception Safety
     121              :         Throws nothing.
     122              : 
     123              :         @param salt An initial value to add to
     124              :         the hash
     125              : 
     126              :         @return A hash value suitable for use
     127              :         in hash-based containers.
     128              :     */
     129              :     std::size_t
     130              :     digest(std::size_t salt = 0) const noexcept;
     131              : 
     132              : public:
     133              :     //--------------------------------------------
     134              :     //
     135              :     // Observers
     136              :     //
     137              :     //--------------------------------------------
     138              : 
     139              :     /** Return the maximum number of characters possible
     140              : 
     141              :         This represents the largest number
     142              :         of characters that are theoretically
     143              :         possible to represent in a url,
     144              :         not including any null terminator.
     145              :         In practice the actual possible size
     146              :         may be lower than this number.
     147              : 
     148              :         @par Complexity
     149              :         Constant.
     150              : 
     151              :         @par Exception Safety
     152              :         Throws nothing.
     153              :     */
     154              :     static
     155              :     constexpr
     156              :     std::size_t
     157         8396 :     max_size() noexcept
     158              :     {
     159         8396 :         return BOOST_URL_MAX_SIZE;
     160              :     }
     161              : 
     162              :     /** Return the number of characters in the url
     163              : 
     164              :         This function returns the number of
     165              :         characters in the url's encoded string,
     166              :         not including any null terminator,
     167              :         if present.
     168              : 
     169              :         @par Example
     170              :         @code
     171              :         assert( url_view( "file:///Program%20Files" ).size() == 23 );
     172              :         @endcode
     173              : 
     174              :         @par Complexity
     175              :         Constant.
     176              : 
     177              :         @par Exception Safety
     178              :         Throws nothing.
     179              :     */
     180              :     std::size_t
     181        40716 :     size() const noexcept
     182              :     {
     183        40716 :         return pi_->offset(id_end);
     184              :     }
     185              : 
     186              :     /** Return true if the url is empty
     187              : 
     188              :         The empty string matches the
     189              :         <em>relative-ref</em> grammar.
     190              : 
     191              :         @par Example
     192              :         @code
     193              :         assert( url_view( "" ).empty() );
     194              :         @endcode
     195              : 
     196              :         @par Complexity
     197              :         Constant.
     198              : 
     199              :         @par Exception Safety
     200              :         Throws nothing.
     201              : 
     202              :         @par BNF
     203              :         @code
     204              :         relative-ref  = relative-part [ "?" query ] [ "#" fragment ]
     205              : 
     206              :         relative-part = "//" authority path-abempty
     207              :                       / path-absolute
     208              :                       / path-noscheme
     209              :                       / path-empty
     210              :         @endcode
     211              : 
     212              :         @par Specification
     213              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-4.2"
     214              :             >4.2.  Relative Reference (rfc3986)</a>
     215              :     */
     216              :     bool
     217           10 :     empty() const noexcept
     218              :     {
     219           10 :         return pi_->offset(id_end) == 0;
     220              :     }
     221              : 
     222              :     /** Return a pointer to the url's character buffer
     223              : 
     224              :         This function returns a pointer to
     225              :         the first character of the url, which
     226              :         is not guaranteed to be null-terminated.
     227              : 
     228              :         @par Complexity
     229              :         Constant.
     230              : 
     231              :         @par Exception Safety
     232              :         Throws nothing.
     233              :     */
     234              :     char const*
     235         4827 :     data() const noexcept
     236              :     {
     237         4827 :         return pi_->cs_;
     238              :     }
     239              : 
     240              :     /** Return the url string
     241              : 
     242              :         This function returns the entire url,
     243              :         which may contain percent escapes.
     244              : 
     245              :         @par Example
     246              :         @code
     247              :         assert( url_view( "http://www.example.com" ).buffer() == "http://www.example.com" );
     248              :         @endcode
     249              : 
     250              :         @par Complexity
     251              :         Constant.
     252              : 
     253              :         @par Exception Safety
     254              :         Throws nothing.
     255              :     */
     256              :     core::string_view
     257         1264 :     buffer() const noexcept
     258              :     {
     259         1264 :         return core::string_view(
     260         1264 :             data(), size());
     261              :     }
     262              : 
     263              :     /** Return the URL as a core::string_view
     264              : 
     265              :         @par Complexity
     266              :         Constant.
     267              : 
     268              :         @par Exception Safety
     269              :         Throws nothing.
     270              : 
     271              :     */
     272          250 :     operator core::string_view() const noexcept
     273              :     {
     274          250 :         return buffer();
     275              :     }
     276              : 
     277              :     /** Return a shared, persistent copy of the url
     278              : 
     279              :         This function returns a read-only copy of
     280              :         the url, with shared lifetime. The returned
     281              :         value owns (persists) the underlying string.
     282              :         The algorithm used to create the value
     283              :         minimizes the number of individual memory
     284              :         allocations, making it more efficient than
     285              :         when using direct standard library functions.
     286              : 
     287              :         @par Example
     288              :         @code
     289              :         std::shared_ptr< url_view const > sp;
     290              :         {
     291              :             std::string s( "http://example.com" );
     292              :             url_view u( s );                        // u references characters in s
     293              : 
     294              :             assert( u.data() == s.data() );         // same buffer
     295              : 
     296              :             sp = u.persist();
     297              : 
     298              :             assert( sp->data() != s.data() );       // different buffer
     299              :             assert( sp->buffer() == s);             // same contents
     300              : 
     301              :             // s is destroyed and thus u
     302              :             // becomes invalid, but sp remains valid.
     303              :         }
     304              :         @endcode
     305              : 
     306              :         @par Complexity
     307              :         Linear in `this->size()`.
     308              : 
     309              :         @par Exception Safety
     310              :         Calls to allocate may throw.
     311              :     */
     312              :     std::shared_ptr<
     313              :         url_view const> persist() const;
     314              : 
     315              :     //--------------------------------------------
     316              :     //
     317              :     // Scheme
     318              :     //
     319              :     //--------------------------------------------
     320              : 
     321              :     /** Return true a scheme is present
     322              : 
     323              :         This function returns true if this
     324              :         contains a scheme.
     325              : 
     326              :         @par Example
     327              :         @code
     328              :         assert( url_view( "http://www.example.com" ).has_scheme() );
     329              :         @endcode
     330              : 
     331              :         @par Complexity
     332              :         Constant.
     333              : 
     334              :         @par Exception Safety
     335              :         Throws nothing.
     336              : 
     337              :         @par BNF
     338              :         @code
     339              :         URI             = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
     340              : 
     341              :         absolute-URI    = scheme ":" hier-part [ "?" query ]
     342              : 
     343              :         scheme          = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
     344              :         @endcode
     345              : 
     346              :         @par Specification
     347              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.1"
     348              :             >3.1. Scheme (rfc3986)</a>
     349              : 
     350              :         @see
     351              :             @ref scheme,
     352              :             @ref scheme_id.
     353              :     */
     354              :     bool
     355              :     has_scheme() const noexcept;
     356              : 
     357              :     /** Return the scheme
     358              : 
     359              :         This function returns the scheme if it
     360              :         exists, without a trailing colon (':').
     361              :         Otherwise it returns an empty string.
     362              :         Note that schemes are case-insensitive,
     363              :         and the canonical form is lowercased.
     364              : 
     365              :         @par Example
     366              :         @code
     367              :         assert( url_view( "http://www.example.com" ).scheme() == "http" );
     368              :         @endcode
     369              : 
     370              :         @par Exception Safety
     371              :         Throws nothing.
     372              : 
     373              :         @par BNF
     374              :         @code
     375              :         scheme          = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
     376              : 
     377              :         URI             = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
     378              : 
     379              :         absolute-URI    = scheme ":" hier-part [ "?" query ]
     380              :         @endcode
     381              : 
     382              :         @par Specification
     383              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.1"
     384              :             >3.1. Scheme (rfc3986)</a>
     385              : 
     386              :         @see
     387              :             @ref has_scheme,
     388              :             @ref scheme_id.
     389              :     */
     390              :     core::string_view
     391              :     scheme() const noexcept;
     392              : 
     393              :     /** Return the scheme
     394              : 
     395              :         This function returns a value which
     396              :         depends on the scheme in the url:
     397              : 
     398              :         @li If the scheme is a well-known
     399              :         scheme, corresponding value from
     400              :         the enumeration @ref urls::scheme
     401              :         is returned.
     402              : 
     403              :         @li If a scheme is present but is not
     404              :         a well-known scheme, the value
     405              :         returned is @ref urls::scheme::unknown.
     406              : 
     407              :         @li Otherwise, if the scheme is absent
     408              :         the value returned is
     409              :         @ref urls::scheme::none.
     410              : 
     411              :         @par Example
     412              :         @code
     413              :         assert( url_view( "wss://www.example.com/crypto.cgi" ).scheme_id() == scheme::wss );
     414              :         @endcode
     415              : 
     416              :         @par Complexity
     417              :         Constant.
     418              : 
     419              :         @par Exception Safety
     420              :         Throws nothing.
     421              : 
     422              :         @par BNF
     423              :         @code
     424              :         URI             = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
     425              : 
     426              :         absolute-URI    = scheme ":" hier-part [ "?" query ]
     427              : 
     428              :         scheme          = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
     429              :         @endcode
     430              : 
     431              :         @par Specification
     432              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.1"
     433              :             >3.1. Scheme (rfc3986)</a>
     434              : 
     435              :         @see
     436              :             @ref has_scheme,
     437              :             @ref scheme.
     438              :     */
     439              :     urls::scheme
     440              :     scheme_id() const noexcept;
     441              : 
     442              :     //--------------------------------------------
     443              :     //
     444              :     // Authority
     445              :     //
     446              :     //--------------------------------------------
     447              : 
     448              :     /** Return true if an authority is present
     449              : 
     450              :         This function returns true if the url
     451              :         contains an authority. The presence of
     452              :         an authority is denoted by a double
     453              :         slash ("//") at the beginning or after
     454              :         the scheme.
     455              : 
     456              :         @par Example
     457              :         @code
     458              :         assert( url_view( "http://www.example.com/index.htm" ).has_authority() );
     459              :         @endcode
     460              : 
     461              :         @par Complexity
     462              :         Constant.
     463              : 
     464              :         @par Exception Safety
     465              :         Throws nothing.
     466              : 
     467              :         @par BNF
     468              :         @code
     469              :         authority       = [ userinfo "@" ] host [ ":" port ]
     470              : 
     471              :         URI             = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
     472              : 
     473              :         absolute-URI    = scheme ":" hier-part [ "?" query ]
     474              : 
     475              :         URI-reference   = URI / relative-ref
     476              : 
     477              :         relative-ref    = relative-part [ "?" query ] [ "#" fragment ]
     478              : 
     479              :         hier-part       = "//" authority path-abempty
     480              :                         ; (more...)
     481              : 
     482              :         relative-part   = "//" authority path-abempty
     483              :                         ; (more...)
     484              : 
     485              :         @endcode
     486              : 
     487              :         @par Specification
     488              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2"
     489              :             >3.2. Authority (rfc3986)</a>
     490              : 
     491              :         @see
     492              :             @ref authority,
     493              :             @ref encoded_authority.
     494              :     */
     495              :     bool
     496         4791 :     has_authority() const noexcept
     497              :     {
     498         4791 :         return pi_->len(id_user) > 0;
     499              :     }
     500              : 
     501              :     /** Return the authority
     502              : 
     503              :         This function returns the authority as
     504              :         an @ref authority_view.
     505              : 
     506              :         @par Example
     507              :         @code
     508              :         authority_view a = url_view( "https://www.example.com:8080/index.htm" ).authority();
     509              :         @endcode
     510              : 
     511              :         @par Complexity
     512              :         Constant.
     513              : 
     514              :         @par Exception Safety
     515              :         Throws nothing.
     516              : 
     517              :         @par BNF
     518              :         @code
     519              :         authority   = [ userinfo "@" ] host [ ":" port ]
     520              :         @endcode
     521              : 
     522              :         @par Specification
     523              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2"
     524              :             >3.2. Authority (rfc3986)</a>
     525              : 
     526              :         @see
     527              :             @ref encoded_authority,
     528              :             @ref has_authority.
     529              :     */
     530              :     authority_view
     531              :     authority() const noexcept;
     532              : 
     533              :     /** Return the authority.
     534              : 
     535              :         If present, this function returns a
     536              :         string representing the authority (which
     537              :         may be empty).
     538              :         Otherwise it returns an empty string.
     539              :         The returned string may contain
     540              :         percent escapes.
     541              : 
     542              :         @par Example
     543              :         @code
     544              :         assert( url_view( "file://Network%20Drive/My%2DFiles" ).encoded_authority() == "Network%20Drive" );
     545              :         @endcode
     546              : 
     547              :         @par Complexity
     548              :         Constant.
     549              : 
     550              :         @par Exception Safety
     551              :         Throws nothing.
     552              : 
     553              :         @par BNF
     554              :         @code
     555              :         authority   = [ userinfo "@" ] host [ ":" port ]
     556              :         @endcode
     557              : 
     558              :         @par Specification
     559              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2"
     560              :             >3.2. Authority (rfc3986)</a>
     561              : 
     562              :         @see
     563              :             @ref authority,
     564              :             @ref has_authority.
     565              :     */
     566              :     pct_string_view
     567              :     encoded_authority() const noexcept;
     568              : 
     569              :     //--------------------------------------------
     570              :     //
     571              :     // Userinfo
     572              :     //
     573              :     //--------------------------------------------
     574              : 
     575              :     /** Return true if a userinfo is present
     576              : 
     577              :         This function returns true if this
     578              :         contains a userinfo.
     579              : 
     580              :         @par Example
     581              :         @code
     582              :         assert( url_view( "http://jane%2Ddoe:pass@example.com" ).has_userinfo() );
     583              :         @endcode
     584              : 
     585              :         @par Complexity
     586              :         Constant.
     587              : 
     588              :         @par Exception Safety
     589              :         Throws nothing.
     590              : 
     591              :         @par BNF
     592              :         @code
     593              :         userinfo    = user [ ":" [ password ] ]
     594              : 
     595              :         authority   = [ userinfo "@" ] host [ ":" port ]
     596              :         @endcode
     597              : 
     598              :         @par Specification
     599              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.1"
     600              :             >3.2.1. User Information (rfc3986)</a>
     601              : 
     602              :         @see
     603              :             @ref has_password,
     604              :             @ref encoded_password,
     605              :             @ref encoded_user,
     606              :             @ref encoded_userinfo,
     607              :             @ref password,
     608              :             @ref user,
     609              :             @ref userinfo.
     610              : 
     611              :     */
     612              :     bool
     613              :     has_userinfo() const noexcept;
     614              : 
     615              :     /** Return true if a password is present
     616              : 
     617              :         This function returns true if the
     618              :         userinfo is present and contains
     619              :         a password.
     620              : 
     621              :         @par Example
     622              :         @code
     623              :         assert( url_view( "http://jane%2Ddoe:pass@example.com" ).has_password() );
     624              :         @endcode
     625              : 
     626              :         @par Complexity
     627              :         Constant.
     628              : 
     629              :         @par Exception Safety
     630              :         Throws nothing.
     631              : 
     632              :         @par BNF
     633              :         @code
     634              :         userinfo    = user [ ":" [ password ] ]
     635              : 
     636              :         user        = *( unreserved / pct-encoded / sub-delims )
     637              :         password    = *( unreserved / pct-encoded / sub-delims / ":" )
     638              :         @endcode
     639              : 
     640              :         @par Specification
     641              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.1"
     642              :             >3.2.1. User Information (rfc3986)</a>
     643              : 
     644              :         @see
     645              :             @ref has_userinfo,
     646              :             @ref encoded_password,
     647              :             @ref encoded_user,
     648              :             @ref encoded_userinfo,
     649              :             @ref password,
     650              :             @ref user,
     651              :             @ref userinfo.
     652              :     */
     653              :     bool
     654              :     has_password() const noexcept;
     655              : 
     656              :     /** Return the userinfo
     657              : 
     658              :         If present, this function returns a
     659              :         string representing the userinfo (which
     660              :         may be empty).
     661              :         Otherwise it returns an empty string.
     662              :         Any percent-escapes in the string are
     663              :         decoded first.
     664              : 
     665              :         @note
     666              :         This function uses the string token
     667              :         return type customization. Depending on
     668              :         the token passed, the return type and
     669              :         behavior of the function can be different.
     670              :         See @ref string_token::return_string
     671              :         for more information.
     672              : 
     673              :         @par Example
     674              :         @code
     675              :         assert( url_view( "http://jane%2Ddoe:pass@example.com" ).userinfo() == "jane-doe:pass" );
     676              :         @endcode
     677              : 
     678              :         @par Complexity
     679              :         Linear in `this->userinfo().size()`.
     680              : 
     681              :         @par Exception Safety
     682              :         Calls to allocate may throw.
     683              : 
     684              :         @return When called with no arguments,
     685              :         a value of type `std::string` is
     686              :         returned. Otherwise, the return type
     687              :         and meaning depends on the string token
     688              :         passed to the function.
     689              : 
     690              :         @par BNF
     691              :         @code
     692              :         userinfo    = user [ ":" [ password ] ]
     693              : 
     694              :         authority   = [ userinfo "@" ] host [ ":" port ]
     695              :         @endcode
     696              : 
     697              :         @par Specification
     698              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.1"
     699              :             >3.2.1. User Information (rfc3986)</a>
     700              : 
     701              :         @see
     702              :             @ref has_password,
     703              :             @ref has_userinfo,
     704              :             @ref encoded_password,
     705              :             @ref encoded_user,
     706              :             @ref encoded_userinfo,
     707              :             @ref password,
     708              :             @ref user.
     709              :     */
     710              :     template<BOOST_URL_STRTOK_TPARAM>
     711              :     BOOST_URL_STRTOK_RETURN
     712           34 :     userinfo(
     713              :         BOOST_URL_STRTOK_ARG(token)) const
     714              :     {
     715           34 :         encoding_opts opt;
     716           34 :         opt.space_as_plus = false;
     717           68 :         return encoded_userinfo().decode(
     718           68 :             opt, std::move(token));
     719              :     }
     720              : 
     721              :     /** Return the userinfo
     722              : 
     723              :         If present, this function returns a
     724              :         string representing the userinfo (which
     725              :         may be empty).
     726              :         Otherwise it returns an empty string.
     727              :         The returned string may contain
     728              :         percent escapes.
     729              : 
     730              :         @par Example
     731              :         @code
     732              :         assert( url_view( "http://jane%2Ddoe:pass@example.com" ).encoded_userinfo() == "jane%2Ddoe:pass" );
     733              :         @endcode
     734              : 
     735              :         @par Complexity
     736              :         Constant.
     737              : 
     738              :         @par Exception Safety
     739              :         Throws nothing
     740              : 
     741              :         @par BNF
     742              :         @code
     743              :         userinfo    = user [ ":" [ password ] ]
     744              : 
     745              :         authority   = [ userinfo "@" ] host [ ":" port ]
     746              :         @endcode
     747              : 
     748              :         @par Specification
     749              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.1"
     750              :             >3.2.1. User Information (rfc3986)</a>
     751              : 
     752              :         @see
     753              :             @ref has_password,
     754              :             @ref has_userinfo,
     755              :             @ref encoded_password,
     756              :             @ref encoded_user,
     757              :             @ref password,
     758              :             @ref user,
     759              :             @ref userinfo.
     760              :     */
     761              :     pct_string_view
     762              :     encoded_userinfo() const noexcept;
     763              : 
     764              :     //--------------------------------------------
     765              : 
     766              :     /** Return the user
     767              : 
     768              :         If present, this function returns a
     769              :         string representing the user (which
     770              :         may be empty).
     771              :         Otherwise it returns an empty string.
     772              :         Any percent-escapes in the string are
     773              :         decoded first.
     774              : 
     775              :         @par Example
     776              :         @code
     777              :         assert( url_view( "http://jane%2Ddoe:pass@example.com" ).user() == "jane-doe" );
     778              :         @endcode
     779              : 
     780              :         @par Complexity
     781              :         Linear in `this->user().size()`.
     782              : 
     783              :         @par Exception Safety
     784              :         Calls to allocate may throw.
     785              : 
     786              :         @par BNF
     787              :         @code
     788              :         userinfo    = user [ ":" [ password ] ]
     789              : 
     790              :         user        = *( unreserved / pct-encoded / sub-delims )
     791              :         password    = *( unreserved / pct-encoded / sub-delims / ":" )
     792              :         @endcode
     793              : 
     794              :         @par Specification
     795              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.1"
     796              :             >3.2.1. User Information (rfc3986)</a>
     797              : 
     798              :         @see
     799              :             @ref has_password,
     800              :             @ref has_userinfo,
     801              :             @ref encoded_password,
     802              :             @ref encoded_user,
     803              :             @ref encoded_userinfo,
     804              :             @ref password,
     805              :             @ref userinfo.
     806              :     */
     807              :     template<BOOST_URL_STRTOK_TPARAM>
     808              :     BOOST_URL_STRTOK_RETURN
     809           55 :     user(
     810              :         BOOST_URL_STRTOK_ARG(token)) const
     811              :     {
     812           55 :         encoding_opts opt;
     813           55 :         opt.space_as_plus = false;
     814          110 :         return encoded_user().decode(
     815          110 :             opt, std::move(token));
     816              :     }
     817              : 
     818              :     /** Return the user
     819              : 
     820              :         If present, this function returns a
     821              :         string representing the user (which
     822              :         may be empty).
     823              :         Otherwise it returns an empty string.
     824              :         The returned string may contain
     825              :         percent escapes.
     826              : 
     827              :         @par Example
     828              :         @code
     829              :         assert( url_view( "http://jane%2Ddoe:pass@example.com" ).encoded_user() == "jane%2Ddoe" );
     830              :         @endcode
     831              : 
     832              :         @par Complexity
     833              :         Constant.
     834              : 
     835              :         @par Exception Safety
     836              :         Throws nothing.
     837              : 
     838              :         @par BNF
     839              :         @code
     840              :         userinfo    = user [ ":" [ password ] ]
     841              : 
     842              :         user        = *( unreserved / pct-encoded / sub-delims )
     843              :         password    = *( unreserved / pct-encoded / sub-delims / ":" )
     844              :         @endcode
     845              : 
     846              :         @par Specification
     847              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.1"
     848              :             >3.2.1. User Information (rfc3986)</a>
     849              : 
     850              :         @see
     851              :             @ref has_password,
     852              :             @ref has_userinfo,
     853              :             @ref encoded_password,
     854              :             @ref encoded_userinfo,
     855              :             @ref password,
     856              :             @ref user,
     857              :             @ref userinfo.
     858              :     */
     859              :     pct_string_view
     860              :     encoded_user() const noexcept;
     861              : 
     862              :     /** Return the password
     863              : 
     864              :         If present, this function returns a
     865              :         string representing the password (which
     866              :         may be an empty string).
     867              :         Otherwise it returns an empty string.
     868              :         Any percent-escapes in the string are
     869              :         decoded first.
     870              : 
     871              :         @par Example
     872              :         @code
     873              :         assert( url_view( "http://jane%2Ddoe:pass@example.com" ).password() == "pass" );
     874              :         @endcode
     875              : 
     876              :         @par Complexity
     877              :         Linear in `this->password().size()`.
     878              : 
     879              :         @par Exception Safety
     880              :         Calls to allocate may throw.
     881              : 
     882              :         @par BNF
     883              :         @code
     884              :         userinfo    = user [ ":" [ password ] ]
     885              : 
     886              :         user        = *( unreserved / pct-encoded / sub-delims )
     887              :         password    = *( unreserved / pct-encoded / sub-delims / ":" )
     888              :         @endcode
     889              : 
     890              :         @par Specification
     891              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.1"
     892              :             >3.2.1. User Information (rfc3986)</a>
     893              : 
     894              :         @see
     895              :             @ref has_password,
     896              :             @ref has_userinfo,
     897              :             @ref encoded_password,
     898              :             @ref encoded_user,
     899              :             @ref encoded_userinfo,
     900              :             @ref user,
     901              :             @ref userinfo.
     902              :     */
     903              :     template<BOOST_URL_STRTOK_TPARAM>
     904              :     BOOST_URL_STRTOK_RETURN
     905           25 :     password(
     906              :         BOOST_URL_STRTOK_ARG(token)) const
     907              :     {
     908           25 :         encoding_opts opt;
     909           25 :         opt.space_as_plus = false;
     910           50 :         return encoded_password().decode(
     911           50 :             opt, std::move(token));
     912              :     }
     913              : 
     914              :     /** Return the password
     915              : 
     916              :         This function returns the password portion
     917              :         of the userinfo as a percent-encoded string.
     918              : 
     919              :         @par Example
     920              :         @code
     921              :         assert( url_view( "http://jane%2Ddoe:pass@example.com" ).encoded_password() == "pass" );
     922              :         @endcode
     923              : 
     924              :         @par Complexity
     925              :         Constant.
     926              : 
     927              :         @par Exception Safety
     928              :         Throws nothing.
     929              : 
     930              :         @par BNF
     931              :         @code
     932              :         userinfo    = user [ ":" [ password ] ]
     933              : 
     934              :         user        = *( unreserved / pct-encoded / sub-delims )
     935              :         password    = *( unreserved / pct-encoded / sub-delims / ":" )
     936              :         @endcode
     937              : 
     938              :         @par Specification
     939              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.1"
     940              :             >3.2.1. User Information (rfc3986)</a>
     941              : 
     942              :         @see
     943              :             @ref has_password,
     944              :             @ref has_userinfo,
     945              :             @ref encoded_user,
     946              :             @ref encoded_userinfo,
     947              :             @ref password,
     948              :             @ref user,
     949              :             @ref userinfo.
     950              :     */
     951              :     pct_string_view
     952              :     encoded_password() const noexcept;
     953              : 
     954              :     //--------------------------------------------
     955              :     //
     956              :     // Host
     957              :     //
     958              :     //--------------------------------------------
     959              : 
     960              :     /** Return the host type
     961              : 
     962              :         This function returns one of the
     963              :         following constants representing the
     964              :         type of host present.
     965              : 
     966              :         @li @ref host_type::ipv4
     967              :         @li @ref host_type::ipv6
     968              :         @li @ref host_type::ipvfuture
     969              :         @li @ref host_type::name
     970              :         @li @ref host_type::none
     971              : 
     972              :         When @ref has_authority is false, the
     973              :         host type is @ref host_type::none.
     974              : 
     975              :         @par Example
     976              :         @code
     977              :         assert( url_view( "https://192.168.0.1/local.htm" ).host_type() == host_type::ipv4 );
     978              :         @endcode
     979              : 
     980              :         @par Complexity
     981              :         Constant.
     982              : 
     983              :         @par Exception Safety
     984              :         Throws nothing.
     985              : 
     986              :         @par Specification
     987              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
     988              :             >3.2.2. Host (rfc3986)</a>
     989              :     */
     990              :     urls::host_type
     991          439 :     host_type() const noexcept
     992              :     {
     993          439 :         return pi_->host_type_;
     994              :     }
     995              : 
     996              :     /** Return the host
     997              : 
     998              :         This function returns the host portion
     999              :         of the authority as a string, or the
    1000              :         empty string if there is no authority.
    1001              :         Any percent-escapes in the string are
    1002              :         decoded first.
    1003              : 
    1004              :         @par Example
    1005              :         @code
    1006              :         assert( url_view( "https://www%2droot.example.com/" ).host() == "www-root.example.com" );
    1007              :         @endcode
    1008              : 
    1009              :         @par Complexity
    1010              :         Linear in `this->host().size()`.
    1011              : 
    1012              :         @par Exception Safety
    1013              :         Calls to allocate may throw.
    1014              : 
    1015              :         @par BNF
    1016              :         @code
    1017              :         host        = IP-literal / IPv4address / reg-name
    1018              : 
    1019              :         IP-literal  = "[" ( IPv6address / IPvFuture  ) "]"
    1020              : 
    1021              :         reg-name    = *( unreserved / pct-encoded / "-" / ".")
    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              :     template<BOOST_URL_STRTOK_TPARAM>
    1029              :     BOOST_URL_STRTOK_RETURN
    1030           65 :     host(
    1031              :         BOOST_URL_STRTOK_ARG(token)) const
    1032              :     {
    1033           65 :         encoding_opts opt;
    1034           65 :         opt.space_as_plus = false;
    1035          130 :         return encoded_host().decode(
    1036          130 :             opt, std::move(token));
    1037              :     }
    1038              : 
    1039              :     /** Return the host
    1040              : 
    1041              :         This function returns the host portion
    1042              :         of the authority as a string, or the
    1043              :         empty string if there is no authority.
    1044              :         The returned string may contain
    1045              :         percent escapes.
    1046              : 
    1047              :         @par Example
    1048              :         @code
    1049              :         assert( url_view( "https://www%2droot.example.com/" ).encoded_host() == "www%2droot.example.com" );
    1050              :         @endcode
    1051              : 
    1052              :         @par Complexity
    1053              :         Constant.
    1054              : 
    1055              :         @par Exception Safety
    1056              :         Throws nothing.
    1057              : 
    1058              :         @par BNF
    1059              :         @code
    1060              :         host        = IP-literal / IPv4address / reg-name
    1061              : 
    1062              :         IP-literal  = "[" ( IPv6address / IPvFuture  ) "]"
    1063              : 
    1064              :         reg-name    = *( unreserved / pct-encoded / "-" / ".")
    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              :     pct_string_view
    1072              :     encoded_host() const noexcept;
    1073              : 
    1074              :     /** Return the host
    1075              : 
    1076              :         The value returned by this function
    1077              :         depends on the type of host returned
    1078              :         from the function @ref host_type.
    1079              : 
    1080              :         @li If the type is @ref host_type::ipv4,
    1081              :         then the IPv4 address string is returned.
    1082              : 
    1083              :         @li If the type is @ref host_type::ipv6,
    1084              :         then the IPv6 address string is returned,
    1085              :         without any enclosing brackets.
    1086              : 
    1087              :         @li If the type is @ref host_type::ipvfuture,
    1088              :         then the IPvFuture address string is returned,
    1089              :         without any enclosing brackets.
    1090              : 
    1091              :         @li If the type is @ref host_type::name,
    1092              :         then the host name string is returned.
    1093              :         Any percent-escapes in the string are
    1094              :         decoded first.
    1095              : 
    1096              :         @li If the type is @ref host_type::none,
    1097              :         then an empty string is returned.
    1098              : 
    1099              :         @par Example
    1100              :         @code
    1101              :         assert( url_view( "https://[1::6:c0a8:1]/" ).host_address() == "1::6:c0a8:1" );
    1102              :         @endcode
    1103              : 
    1104              :         @par Complexity
    1105              :         Linear in `this->host_address().size()`.
    1106              : 
    1107              :         @par Exception Safety
    1108              :         Calls to allocate may throw.
    1109              : 
    1110              :         @par BNF
    1111              :         @code
    1112              :         host        = IP-literal / IPv4address / reg-name
    1113              : 
    1114              :         IP-literal  = "[" ( IPv6address / IPvFuture  ) "]"
    1115              : 
    1116              :         reg-name    = *( unreserved / pct-encoded / "-" / ".")
    1117              :         @endcode
    1118              : 
    1119              :         @par Specification
    1120              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
    1121              :             >3.2.2. Host (rfc3986)</a>
    1122              :     */
    1123              :     template<BOOST_URL_STRTOK_TPARAM>
    1124              :     BOOST_URL_STRTOK_RETURN
    1125           98 :     host_address(
    1126              :         BOOST_URL_STRTOK_ARG(token)) const
    1127              :     {
    1128           98 :         encoding_opts opt;
    1129           98 :         opt.space_as_plus = false;
    1130          196 :         return encoded_host_address().decode(
    1131          196 :             opt, std::move(token));
    1132              :     }
    1133              : 
    1134              :     /** Return the host
    1135              : 
    1136              :         The value returned by this function
    1137              :         depends on the type of host returned
    1138              :         from the function @ref host_type.
    1139              : 
    1140              :         @li If the type is @ref host_type::ipv4,
    1141              :         then the IPv4 address string is returned.
    1142              : 
    1143              :         @li If the type is @ref host_type::ipv6,
    1144              :         then the IPv6 address string is returned,
    1145              :         without any enclosing brackets.
    1146              : 
    1147              :         @li If the type is @ref host_type::ipvfuture,
    1148              :         then the IPvFuture address string is returned,
    1149              :         without any enclosing brackets.
    1150              : 
    1151              :         @li If the type is @ref host_type::name,
    1152              :         then the host name string is returned.
    1153              :         Any percent-escapes in the string are
    1154              :         decoded first.
    1155              : 
    1156              :         @li If the type is @ref host_type::none,
    1157              :         then an empty string is returned.
    1158              :         The returned string may contain
    1159              :         percent escapes.
    1160              : 
    1161              :         @par Example
    1162              :         @code
    1163              :         assert( url_view( "https://www%2droot.example.com/" ).encoded_host_address() == "www%2droot.example.com" );
    1164              :         @endcode
    1165              : 
    1166              :         @par Complexity
    1167              :         Constant.
    1168              : 
    1169              :         @par Exception Safety
    1170              :         Throws nothing.
    1171              : 
    1172              :         @par BNF
    1173              :         @code
    1174              :         host        = IP-literal / IPv4address / reg-name
    1175              : 
    1176              :         IP-literal  = "[" ( IPv6address / IPvFuture  ) "]"
    1177              : 
    1178              :         reg-name    = *( unreserved / pct-encoded / "-" / ".")
    1179              :         @endcode
    1180              : 
    1181              :         @par Specification
    1182              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
    1183              :             >3.2.2. Host (rfc3986)</a>
    1184              :     */
    1185              :     pct_string_view
    1186              :     encoded_host_address() const noexcept;
    1187              : 
    1188              :     /** Return the host IPv4 address
    1189              : 
    1190              :         If the host type is @ref host_type::ipv4,
    1191              :         this function returns the address as
    1192              :         a value of type @ref ipv4_address.
    1193              :         Otherwise, if the host type is not an IPv4
    1194              :         address, it returns a default-constructed
    1195              :         value which is equal to the unspecified
    1196              :         address "0.0.0.0".
    1197              : 
    1198              :         @par Example
    1199              :         @code
    1200              :         assert( url_view( "http://127.0.0.1/index.htm?user=win95" ).host_ipv4_address() == ipv4_address( "127.0.0.1" ) );
    1201              :         @endcode
    1202              : 
    1203              :         @par Complexity
    1204              :         Constant.
    1205              : 
    1206              :         @par Exception Safety
    1207              :         Throws nothing.
    1208              : 
    1209              :         @par BNF
    1210              :         @code
    1211              :         IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet
    1212              : 
    1213              :         dec-octet   = DIGIT                 ; 0-9
    1214              :                     / %x31-39 DIGIT         ; 10-99
    1215              :                     / "1" 2DIGIT            ; 100-199
    1216              :                     / "2" %x30-34 DIGIT     ; 200-249
    1217              :                     / "25" %x30-35          ; 250-255
    1218              :         @endcode
    1219              : 
    1220              :         @par Specification
    1221              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
    1222              :             >3.2.2. Host (rfc3986)</a>
    1223              :     */
    1224              :     ipv4_address
    1225              :     host_ipv4_address() const noexcept;
    1226              : 
    1227              :     /** Return the host IPv6 address
    1228              : 
    1229              :         If the host type is @ref host_type::ipv6,
    1230              :         this function returns the address as
    1231              :         a value of type @ref ipv6_address.
    1232              :         Otherwise, if the host type is not an IPv6
    1233              :         address, it returns a default-constructed
    1234              :         value which is equal to the unspecified
    1235              :         address "0:0:0:0:0:0:0:0".
    1236              : 
    1237              :         @par Example
    1238              :         @code
    1239              :         assert( url_view( "ftp://[::1]/" ).host_ipv6_address() == ipv6_address( "::1" ) );
    1240              :         @endcode
    1241              : 
    1242              :         @par Complexity
    1243              :         Constant.
    1244              : 
    1245              :         @par Exception Safety
    1246              :         Throws nothing.
    1247              : 
    1248              :         @par BNF
    1249              :         @code
    1250              :         IPv6address =                            6( h16 ":" ) ls32
    1251              :                     /                       "::" 5( h16 ":" ) ls32
    1252              :                     / [               h16 ] "::" 4( h16 ":" ) ls32
    1253              :                     / [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32
    1254              :                     / [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32
    1255              :                     / [ *3( h16 ":" ) h16 ] "::"    h16 ":"   ls32
    1256              :                     / [ *4( h16 ":" ) h16 ] "::"              ls32
    1257              :                     / [ *5( h16 ":" ) h16 ] "::"              h16
    1258              :                     / [ *6( h16 ":" ) h16 ] "::"
    1259              : 
    1260              :         ls32        = ( h16 ":" h16 ) / IPv4address
    1261              :                     ; least-significant 32 bits of address
    1262              : 
    1263              :         h16         = 1*4HEXDIG
    1264              :                     ; 16 bits of address represented in hexadecimal
    1265              :         @endcode
    1266              : 
    1267              :         @par Specification
    1268              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
    1269              :             >3.2.2. Host (rfc3986)</a>
    1270              :     */
    1271              :     ipv6_address
    1272              :     host_ipv6_address() const noexcept;
    1273              : 
    1274              :     /** Return the host IPvFuture address
    1275              : 
    1276              :         If the host type is @ref host_type::ipvfuture,
    1277              :         this function returns the address as
    1278              :         a string.
    1279              :         Otherwise, if the host type is not an
    1280              :         IPvFuture address, it returns an
    1281              :         empty string.
    1282              : 
    1283              :         @par Example
    1284              :         @code
    1285              :         assert( url_view( "http://[v1fe.d:9]/index.htm" ).host_ipvfuture() == "v1fe.d:9" );
    1286              :         @endcode
    1287              : 
    1288              :         @par Complexity
    1289              :         Constant.
    1290              : 
    1291              :         @par Exception Safety
    1292              :         Throws nothing.
    1293              : 
    1294              :         @par BNF
    1295              :         @code
    1296              :         IPvFuture  = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" )
    1297              :         @endcode
    1298              : 
    1299              :         @par Specification
    1300              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
    1301              :             >3.2.2. Host (rfc3986)</a>
    1302              :     */
    1303              :     core::string_view
    1304              :     host_ipvfuture() const noexcept;
    1305              : 
    1306              :     /** Return the host name
    1307              : 
    1308              :         If the host type is @ref host_type::name,
    1309              :         this function returns the name as
    1310              :         a string. Otherwise an empty string is returned.
    1311              :         Any percent-escapes in the string are
    1312              :         decoded first.
    1313              : 
    1314              :         @par Example
    1315              :         @code
    1316              :         assert( url_view( "https://www%2droot.example.com/" ).host_name() == "www-root.example.com" );
    1317              :         @endcode
    1318              : 
    1319              :         @par Complexity
    1320              :         Linear in `this->host_name().size()`.
    1321              : 
    1322              :         @par Exception Safety
    1323              :         Calls to allocate may throw.
    1324              : 
    1325              :         @par BNF
    1326              :         @code
    1327              :         host        = IP-literal / IPv4address / reg-name
    1328              : 
    1329              :         IP-literal  = "[" ( IPv6address / IPvFuture  ) "]"
    1330              : 
    1331              :         reg-name    = *( unreserved / pct-encoded / "-" / ".")
    1332              :         @endcode
    1333              : 
    1334              :         @par Specification
    1335              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
    1336              :             >3.2.2. Host (rfc3986)</a>
    1337              :     */
    1338              :     template<BOOST_URL_STRTOK_TPARAM>
    1339              :     BOOST_URL_STRTOK_RETURN
    1340           93 :     host_name(
    1341              :         BOOST_URL_STRTOK_ARG(token)) const
    1342              :     {
    1343           93 :         encoding_opts opt;
    1344           93 :         opt.space_as_plus = false;
    1345          186 :         return encoded_host_name().decode(
    1346          186 :             opt, std::move(token));
    1347              :     }
    1348              : 
    1349              :     /** Return the host name
    1350              : 
    1351              :         If the host type is @ref host_type::name,
    1352              :         this function returns the name as
    1353              :         a string.
    1354              :         Otherwise, if the host type is not an
    1355              :         name, it returns an empty string.
    1356              :         The returned string may contain
    1357              :         percent escapes.
    1358              : 
    1359              :         @par Example
    1360              :         @code
    1361              :         assert( url_view( "https://www%2droot.example.com/" ).encoded_host_name() == "www%2droot.example.com" );
    1362              :         @endcode
    1363              : 
    1364              :         @par Complexity
    1365              :         Constant.
    1366              : 
    1367              :         @par Exception Safety
    1368              :         Throws nothing.
    1369              : 
    1370              :         @par BNF
    1371              :         @code
    1372              :         host        = IP-literal / IPv4address / reg-name
    1373              : 
    1374              :         IP-literal  = "[" ( IPv6address / IPvFuture  ) "]"
    1375              : 
    1376              :         reg-name    = *( unreserved / pct-encoded / "-" / ".")
    1377              :         @endcode
    1378              : 
    1379              :         @par Specification
    1380              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
    1381              :             >3.2.2. Host (rfc3986)</a>
    1382              :     */
    1383              :     pct_string_view
    1384              :     encoded_host_name() const noexcept;
    1385              : 
    1386              :     /** Return the IPv6 Zone ID
    1387              : 
    1388              :         If the host type is @ref host_type::ipv6,
    1389              :         this function returns the Zone ID as
    1390              :         a string. Otherwise an empty string is returned.
    1391              :         Any percent-escapes in the string are
    1392              :         decoded first.
    1393              : 
    1394              :         @par Example
    1395              :         @code
    1396              :         assert( url_view( "http://[fe80::1%25eth0]/" ).zone_id() == "eth0" );
    1397              :         @endcode
    1398              : 
    1399              :         @par Complexity
    1400              :         Linear in `this->encoded_zone_id().size()`.
    1401              : 
    1402              :         @par Exception Safety
    1403              :         Calls to allocate may throw.
    1404              : 
    1405              :         @par BNF
    1406              :         @code
    1407              :         host        = IP-literal / IPv4address / reg-name
    1408              : 
    1409              :         IP-literal = "[" ( IPv6address / IPv6addrz / IPvFuture  ) "]"
    1410              : 
    1411              :         ZoneID = 1*( unreserved / pct-encoded )
    1412              : 
    1413              :         IPv6addrz = IPv6address "%25" ZoneID
    1414              :         @endcode
    1415              : 
    1416              :         @par Specification
    1417              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc6874"
    1418              :             >Representing IPv6 Zone Identifiers in Address Literals and Uniform Resource Identifiers</a>
    1419              :     */
    1420              :     template<BOOST_URL_STRTOK_TPARAM>
    1421              :     BOOST_URL_STRTOK_RETURN
    1422            5 :     zone_id(
    1423              :         BOOST_URL_STRTOK_ARG(token)) const
    1424              :     {
    1425            5 :         encoding_opts opt;
    1426            5 :         opt.space_as_plus = false;
    1427           10 :         return encoded_zone_id().decode(
    1428           10 :             opt, std::move(token));
    1429              :     }
    1430              : 
    1431              :     /** Return the IPv6 Zone ID
    1432              : 
    1433              :         If the host type is @ref host_type::ipv6,
    1434              :         this function returns the Zone ID as
    1435              :         a string. Otherwise an empty string is returned.
    1436              :         The returned string may contain
    1437              :         percent escapes.
    1438              : 
    1439              :         @par Example
    1440              :         @code
    1441              :         assert( url_view( "http://[fe80::1%25eth0]/" ).encoded_zone_id() == "eth0" );
    1442              :         @endcode
    1443              : 
    1444              :         @par Complexity
    1445              :         Constant.
    1446              : 
    1447              :         @par Exception Safety
    1448              :         Throws nothing.
    1449              : 
    1450              :         @par BNF
    1451              :         @code
    1452              :         host        = IP-literal / IPv4address / reg-name
    1453              : 
    1454              :         IP-literal = "[" ( IPv6address / IPv6addrz / IPvFuture  ) "]"
    1455              : 
    1456              :         ZoneID = 1*( unreserved / pct-encoded )
    1457              : 
    1458              :         IPv6addrz = IPv6address "%25" ZoneID
    1459              :         @endcode
    1460              : 
    1461              :         @par Specification
    1462              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc6874"
    1463              :             >Representing IPv6 Zone Identifiers in Address Literals and Uniform Resource Identifiers</a>
    1464              :     */
    1465              :     pct_string_view
    1466              :     encoded_zone_id() const noexcept;
    1467              : 
    1468              :     //--------------------------------------------
    1469              :     //
    1470              :     // Port
    1471              :     //
    1472              :     //--------------------------------------------
    1473              : 
    1474              :     /** Return true if a port is present
    1475              : 
    1476              :         This function returns true if an
    1477              :         authority is present and contains a port.
    1478              : 
    1479              :         @par Example
    1480              :         @code
    1481              :         assert( url_view( "wss://www.example.com:443" ).has_port() );
    1482              :         @endcode
    1483              : 
    1484              :         @par Complexity
    1485              :         Constant.
    1486              : 
    1487              :         @par Exception Safety
    1488              :         Throws nothing.
    1489              : 
    1490              :         @par BNF
    1491              :         @code
    1492              :         authority   = [ userinfo "@" ] host [ ":" port ]
    1493              : 
    1494              :         port        = *DIGIT
    1495              :         @endcode
    1496              : 
    1497              :         @par Specification
    1498              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.3"
    1499              :             >3.2.3. Port (rfc3986)</a>
    1500              : 
    1501              :         @see
    1502              :             @ref encoded_host_and_port,
    1503              :             @ref port,
    1504              :             @ref port_number.
    1505              :     */
    1506              :     bool
    1507              :     has_port() const noexcept;
    1508              : 
    1509              :     /** Return the port
    1510              : 
    1511              :         If present, this function returns a
    1512              :         string representing the port (which
    1513              :         may be empty).
    1514              :         Otherwise it returns an empty string.
    1515              : 
    1516              :         @par Example
    1517              :         @code
    1518              :         assert( url_view( "http://localhost.com:8080" ).port() == "8080" );
    1519              :         @endcode
    1520              : 
    1521              :         @par Complexity
    1522              :         Constant.
    1523              : 
    1524              :         @par Exception Safety
    1525              :         Throws nothing.
    1526              : 
    1527              :         @par BNF
    1528              :         @code
    1529              :         port        = *DIGIT
    1530              :         @endcode
    1531              : 
    1532              :         @par Specification
    1533              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.3"
    1534              :             >3.2.3. Port (rfc3986)</a>
    1535              : 
    1536              :         @see
    1537              :             @ref encoded_host_and_port,
    1538              :             @ref has_port,
    1539              :             @ref port_number.
    1540              :     */
    1541              :     core::string_view
    1542              :     port() const noexcept;
    1543              : 
    1544              :     /** Return the port
    1545              : 
    1546              :         If a port is present and the numerical
    1547              :         value is representable, it is returned
    1548              :         as an unsigned integer. Otherwise, the
    1549              :         number zero is returned.
    1550              : 
    1551              :         @par Example
    1552              :         @code
    1553              :         assert( url_view( "http://localhost.com:8080" ).port_number() == 8080 );
    1554              :         @endcode
    1555              : 
    1556              :         @par Complexity
    1557              :         Constant.
    1558              : 
    1559              :         @par Exception Safety
    1560              :         Throws nothing.
    1561              : 
    1562              :         @par BNF
    1563              :         @code
    1564              :         port        = *DIGIT
    1565              :         @endcode
    1566              : 
    1567              :         @par Specification
    1568              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.3"
    1569              :             >3.2.3. Port (rfc3986)</a>
    1570              : 
    1571              :         @see
    1572              :             @ref encoded_host_and_port,
    1573              :             @ref has_port,
    1574              :             @ref port.
    1575              :     */
    1576              :     std::uint16_t
    1577              :     port_number() const noexcept;
    1578              : 
    1579              :     //--------------------------------------------
    1580              :     //
    1581              :     // Path
    1582              :     //
    1583              :     //--------------------------------------------
    1584              : 
    1585              :     /** Return true if the path is absolute
    1586              : 
    1587              :         This function returns true if the path
    1588              :         begins with a forward slash ('/').
    1589              : 
    1590              :         @par Example
    1591              :         @code
    1592              :         assert( url_view( "/path/to/file.txt" ).is_path_absolute() );
    1593              :         @endcode
    1594              : 
    1595              :         @par Complexity
    1596              :         Constant.
    1597              : 
    1598              :         @par Exception Safety
    1599              :         Throws nothing.
    1600              : 
    1601              :         @par BNF
    1602              :         @code
    1603              :         path          = path-abempty    ; begins with "/" or is empty
    1604              :                       / path-absolute   ; begins with "/" but not "//"
    1605              :                       / path-noscheme   ; begins with a non-colon segment
    1606              :                       / path-rootless   ; begins with a segment
    1607              :                       / path-empty      ; zero characters
    1608              : 
    1609              :         path-abempty  = *( "/" segment )
    1610              :         path-absolute = "/" [ segment-nz *( "/" segment ) ]
    1611              :         path-noscheme = segment-nz-nc *( "/" segment )
    1612              :         path-rootless = segment-nz *( "/" segment )
    1613              :         path-empty    = 0<pchar>
    1614              :         @endcode
    1615              : 
    1616              :         @par Specification
    1617              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.3"
    1618              :             >3.3.  Path (rfc3986)</a>
    1619              : 
    1620              :         @see
    1621              :             @ref encoded_path,
    1622              :             @ref encoded_segments.
    1623              :             @ref path,
    1624              :             @ref segments.
    1625              :     */
    1626              :     bool
    1627         1542 :     is_path_absolute() const noexcept
    1628              :     {
    1629              :         return
    1630         2671 :             pi_->len(id_path) > 0 &&
    1631         2671 :             pi_->cs_[pi_->offset(id_path)] == '/';
    1632              :     }
    1633              : 
    1634              :     /** Return the path
    1635              : 
    1636              :         This function returns the path as a
    1637              :         string. The path may be empty.
    1638              :         Any percent-escapes in the string are
    1639              :         decoded first.
    1640              : 
    1641              :         @par Example
    1642              :         @code
    1643              :         assert( url_view( "file:///Program%20Files/Games/config.ini" ).path() == "/Program Files/Games/config.ini" );
    1644              :         @endcode
    1645              : 
    1646              :         @par Complexity
    1647              :         Linear in `this->path().size()`.
    1648              : 
    1649              :         @par Exception Safety
    1650              :         Calls to allocate may throw.
    1651              : 
    1652              :         @par BNF
    1653              :         @code
    1654              :         path          = path-abempty    ; begins with "/" or is empty
    1655              :                       / path-absolute   ; begins with "/" but not "//"
    1656              :                       / path-noscheme   ; begins with a non-colon segment
    1657              :                       / path-rootless   ; begins with a segment
    1658              :                       / path-empty      ; zero characters
    1659              : 
    1660              :         path-abempty  = *( "/" segment )
    1661              :         path-absolute = "/" [ segment-nz *( "/" segment ) ]
    1662              :         path-noscheme = segment-nz-nc *( "/" segment )
    1663              :         path-rootless = segment-nz *( "/" segment )
    1664              :         path-empty    = 0<pchar>
    1665              :         @endcode
    1666              : 
    1667              :         @par Specification
    1668              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.3"
    1669              :             >3.3. Path (rfc3986)</a>
    1670              : 
    1671              :         @see
    1672              :             @ref is_path_absolute,
    1673              :             @ref encoded_path,
    1674              :             @ref encoded_segments.
    1675              :             @ref segments.
    1676              :     */
    1677              :     template<BOOST_URL_STRTOK_TPARAM>
    1678              :     BOOST_URL_STRTOK_RETURN
    1679           19 :     path(
    1680              :         BOOST_URL_STRTOK_ARG(token)) const
    1681              :     {
    1682           19 :         encoding_opts opt;
    1683           19 :         opt.space_as_plus = false;
    1684           41 :         return encoded_path().decode(
    1685           41 :             opt, std::move(token));
    1686              :     }
    1687              : 
    1688              :     /** Return the path
    1689              : 
    1690              :         This function returns the path as a
    1691              :         string. The path may be empty.
    1692              :         Any percent-escapes in the string are
    1693              :         decoded first.
    1694              : 
    1695              :         @par Example
    1696              :         @code
    1697              :         assert( url_view( "file:///Program%20Files/Games/config.ini" ).encoded_path() == "/Program%20Files/Games/config.ini" );
    1698              :         @endcode
    1699              : 
    1700              :         @par Complexity
    1701              :         Constant.
    1702              : 
    1703              :         @par Exception Safety
    1704              :         Throws nothing.
    1705              : 
    1706              :         @par BNF
    1707              :         @code
    1708              :         path          = path-abempty    ; begins with "/" or is empty
    1709              :                       / path-absolute   ; begins with "/" but not "//"
    1710              :                       / path-noscheme   ; begins with a non-colon segment
    1711              :                       / path-rootless   ; begins with a segment
    1712              :                       / path-empty      ; zero characters
    1713              : 
    1714              :         path-abempty  = *( "/" segment )
    1715              :         path-absolute = "/" [ segment-nz *( "/" segment ) ]
    1716              :         path-noscheme = segment-nz-nc *( "/" segment )
    1717              :         path-rootless = segment-nz *( "/" segment )
    1718              :         path-empty    = 0<pchar>
    1719              :         @endcode
    1720              : 
    1721              :         @par Specification
    1722              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.3"
    1723              :             >3.3. Path (rfc3986)</a>
    1724              : 
    1725              :         @see
    1726              :             @ref is_path_absolute,
    1727              :             @ref encoded_segments.
    1728              :             @ref path,
    1729              :             @ref segments.
    1730              :     */
    1731              :     pct_string_view
    1732              :     encoded_path() const noexcept;
    1733              : 
    1734              :     /** Return the path as a container of segments
    1735              : 
    1736              :         This function returns a bidirectional
    1737              :         view of strings over the path.
    1738              :         The returned view references the same
    1739              :         underlying character buffer; ownership
    1740              :         is not transferred.
    1741              :         Any percent-escapes in strings returned
    1742              :         when iterating the view are decoded first.
    1743              : 
    1744              :         @par Example
    1745              :         @code
    1746              :         segments_view sv = url_view( "/path/to/file.txt" ).segments();
    1747              :         @endcode
    1748              : 
    1749              :         @par Complexity
    1750              :         Constant.
    1751              : 
    1752              :         @par Exception Safety
    1753              :         Throws nothing.
    1754              : 
    1755              :         @par BNF
    1756              :         @code
    1757              :         path          = [ "/" ] segment *( "/" segment )
    1758              :         @endcode
    1759              : 
    1760              :         @par Specification
    1761              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.3"
    1762              :             >3.3. Path (rfc3986)</a>
    1763              : 
    1764              :         @see
    1765              :             @ref is_path_absolute,
    1766              :             @ref encoded_path,
    1767              :             @ref encoded_segments.
    1768              :             @ref path,
    1769              :             @ref segments_view.
    1770              :     */
    1771              :     segments_view
    1772              :     segments() const noexcept;
    1773              : 
    1774              :     /** Return the path as a container of segments
    1775              : 
    1776              :         This function returns a bidirectional
    1777              :         view of strings over the path.
    1778              :         The returned view references the same
    1779              :         underlying character buffer; ownership
    1780              :         is not transferred.
    1781              :         Strings returned when iterating the
    1782              :         range may contain percent escapes.
    1783              : 
    1784              :         @par Example
    1785              :         @code
    1786              :         segments_encoded_view sv = url_view( "/path/to/file.txt" ).encoded_segments();
    1787              :         @endcode
    1788              : 
    1789              :         @par Complexity
    1790              :         Constant.
    1791              : 
    1792              :         @par Exception Safety
    1793              :         Throws nothing.
    1794              : 
    1795              :         @par BNF
    1796              :         @code
    1797              :         path          = path-abempty    ; begins with "/" or is empty
    1798              :                       / path-absolute   ; begins with "/" but not "//"
    1799              :                       / path-noscheme   ; begins with a non-colon segment
    1800              :                       / path-rootless   ; begins with a segment
    1801              :                       / path-empty      ; zero characters
    1802              : 
    1803              :         path-abempty  = *( "/" segment )
    1804              :         path-absolute = "/" [ segment-nz *( "/" segment ) ]
    1805              :         path-noscheme = segment-nz-nc *( "/" segment )
    1806              :         path-rootless = segment-nz *( "/" segment )
    1807              :         path-empty    = 0<pchar>
    1808              :         @endcode
    1809              : 
    1810              :         @par Specification
    1811              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.3"
    1812              :             >3.3. Path (rfc3986)</a>
    1813              : 
    1814              :         @see
    1815              :             @ref is_path_absolute,
    1816              :             @ref encoded_path,
    1817              :             @ref path,
    1818              :             @ref segments,
    1819              :             @ref segments_encoded_view.
    1820              :     */
    1821              :     segments_encoded_view
    1822              :     encoded_segments() const noexcept;
    1823              : 
    1824              :     //--------------------------------------------
    1825              :     //
    1826              :     // Query
    1827              :     //
    1828              :     //--------------------------------------------
    1829              : 
    1830              :     /** Return true if a query is present
    1831              : 
    1832              :         This function returns true if this
    1833              :         contains a query. An empty query is
    1834              :         distinct from having no query.
    1835              : 
    1836              :         @par Example
    1837              :         @code
    1838              :         assert( url_view( "/sql?id=42&col=name&page-size=20" ).has_query() );
    1839              :         @endcode
    1840              : 
    1841              :         @par Complexity
    1842              :         Constant.
    1843              : 
    1844              :         @par Exception Safety
    1845              :         Throws nothing.
    1846              : 
    1847              :         @par BNF
    1848              :         @code
    1849              :         query           = *( pchar / "/" / "?" )
    1850              : 
    1851              :         query-param     = key [ "=" value ]
    1852              :         query-params    = [ query-param ] *( "&" query-param )
    1853              :         @endcode
    1854              : 
    1855              :         @par Specification
    1856              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.4
    1857              :             >3.4.  Query (rfc3986)</a>
    1858              :         @li <a href="https://en.wikipedia.org/wiki/Query_string"
    1859              :             >Query string (Wikipedia)</a>
    1860              : 
    1861              :         @see
    1862              :             @ref encoded_params,
    1863              :             @ref encoded_query,
    1864              :             @ref params,
    1865              :             @ref query.
    1866              :     */
    1867              :     bool
    1868              :     has_query() const noexcept;
    1869              : 
    1870              :     /** Return the query
    1871              : 
    1872              :         If this contains a query, it is returned
    1873              :         as a string (which may be empty).
    1874              :         Otherwise, an empty string is returned.
    1875              :         Any percent-escapes in the string are
    1876              :         decoded first.
    1877              :         <br>
    1878              :         When plus signs appear in the query
    1879              :         portion of the url, they are converted
    1880              :         to spaces automatically upon decoding.
    1881              :         This behavior can be changed by setting
    1882              :         decode options.
    1883              : 
    1884              :         @par Example
    1885              :         @code
    1886              :         assert( url_view( "/sql?id=42&name=jane%2Ddoe&page+size=20" ).query() == "id=42&name=jane-doe&page size=20" );
    1887              :         @endcode
    1888              : 
    1889              :         @par Complexity
    1890              :         Linear in `this->query().size()`.
    1891              : 
    1892              :         @par Exception Safety
    1893              :         Calls to allocate may throw.
    1894              : 
    1895              :         @par BNF
    1896              :         @code
    1897              :         query           = *( pchar / "/" / "?" )
    1898              : 
    1899              :         query-param     = key [ "=" value ]
    1900              :         query-params    = [ query-param ] *( "&" query-param )
    1901              :         @endcode
    1902              : 
    1903              :         @par Specification
    1904              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.4
    1905              :             >3.4.  Query (rfc3986)</a>
    1906              :         @li <a href="https://en.wikipedia.org/wiki/Query_string"
    1907              :             >Query string (Wikipedia)</a>
    1908              : 
    1909              :         @see
    1910              :             @ref encoded_params,
    1911              :             @ref encoded_query,
    1912              :             @ref has_query,
    1913              :             @ref params.
    1914              :     */
    1915              :     template<BOOST_URL_STRTOK_TPARAM>
    1916              :     BOOST_URL_STRTOK_RETURN
    1917           29 :     query(
    1918              :         BOOST_URL_STRTOK_ARG(token)) const
    1919              :     {
    1920              :         // When interacting with the query as
    1921              :         // an intact string, we do not treat
    1922              :         // the plus sign as an encoded space.
    1923           29 :         encoding_opts opt;
    1924           29 :         opt.space_as_plus = false;
    1925           58 :         return encoded_query().decode(
    1926           58 :             opt, std::move(token));
    1927              :     }
    1928              : 
    1929              :     /** Return the query
    1930              : 
    1931              :         If this contains a query, it is returned
    1932              :         as a string (which may be empty).
    1933              :         Otherwise, an empty string is returned.
    1934              :         The returned string may contain
    1935              :         percent escapes.
    1936              : 
    1937              :         @par Example
    1938              :         @code
    1939              :         assert( url_view( "/sql?id=42&name=jane%2Ddoe&page+size=20" ).encoded_query() == "id=42&name=jane%2Ddoe&page+size=20" );
    1940              :         @endcode
    1941              : 
    1942              :         @par Complexity
    1943              :         Constant.
    1944              : 
    1945              :         @par Exception Safety
    1946              :         Throws nothing.
    1947              : 
    1948              :         @par BNF
    1949              :         @code
    1950              :         query           = *( pchar / "/" / "?" )
    1951              : 
    1952              :         query-param     = key [ "=" value ]
    1953              :         query-params    = [ query-param ] *( "&" query-param )
    1954              :         @endcode
    1955              : 
    1956              :         @par Specification
    1957              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.4
    1958              :             >3.4.  Query (rfc3986)</a>
    1959              :         @li <a href="https://en.wikipedia.org/wiki/Query_string"
    1960              :             >Query string (Wikipedia)</a>
    1961              : 
    1962              :         @see
    1963              :             @ref encoded_params,
    1964              :             @ref has_query,
    1965              :             @ref params,
    1966              :             @ref query.
    1967              :     */
    1968              :     pct_string_view
    1969              :     encoded_query() const noexcept;
    1970              : 
    1971              :     /** Return the query as a container of parameters
    1972              : 
    1973              :         This function returns a bidirectional
    1974              :         view of key/value pairs over the query.
    1975              :         The returned view references the same
    1976              :         underlying character buffer; ownership
    1977              :         is not transferred.
    1978              :         Any percent-escapes in strings returned
    1979              :         when iterating the view are decoded first.
    1980              : 
    1981              :         @par Example
    1982              :         @code
    1983              :         params_view pv = url_view( "/sql?id=42&name=jane%2Ddoe&page+size=20" ).params();
    1984              :         @endcode
    1985              : 
    1986              :         @par Complexity
    1987              :         Constant.
    1988              : 
    1989              :         @par Exception Safety
    1990              :         Throws nothing.
    1991              : 
    1992              :         @par BNF
    1993              :         @code
    1994              :         query           = *( pchar / "/" / "?" )
    1995              : 
    1996              :         query-param     = key [ "=" value ]
    1997              :         query-params    = [ query-param ] *( "&" query-param )
    1998              :         @endcode
    1999              : 
    2000              :         @par Specification
    2001              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.4
    2002              :             >3.4.  Query (rfc3986)</a>
    2003              :         @li <a href="https://en.wikipedia.org/wiki/Query_string"
    2004              :             >Query string (Wikipedia)</a>
    2005              : 
    2006              :         @see
    2007              :             @ref encoded_params,
    2008              :             @ref encoded_query,
    2009              :             @ref has_query,
    2010              :             @ref query.
    2011              :     */
    2012              :     params_view
    2013              :     params() const noexcept;
    2014              : 
    2015              :     params_view
    2016              :     params(encoding_opts opt) const noexcept;
    2017              : 
    2018              :     /** Return the query as a container of parameters
    2019              : 
    2020              :         This function returns a bidirectional
    2021              :         view of key/value pairs over the query.
    2022              :         The returned view references the same
    2023              :         underlying character buffer; ownership
    2024              :         is not transferred.
    2025              :         Strings returned when iterating the
    2026              :         range may contain percent escapes.
    2027              : 
    2028              :         @par Example
    2029              :         @code
    2030              :         params_encoded_view pv = url_view( "/sql?id=42&name=jane%2Ddoe&page+size=20" ).encoded_params();
    2031              :         @endcode
    2032              : 
    2033              :         @par Complexity
    2034              :         Constant.
    2035              : 
    2036              :         @par Exception Safety
    2037              :         Throws nothing.
    2038              : 
    2039              :         @par Specification
    2040              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.4"
    2041              :             >3.4. Query (rfc3986)</a>
    2042              : 
    2043              :         @par BNF
    2044              :         @code
    2045              :         query           = *( pchar / "/" / "?" )
    2046              : 
    2047              :         query-param     = key [ "=" value ]
    2048              :         query-params    = [ query-param ] *( "&" query-param )
    2049              :         @endcode
    2050              : 
    2051              :         @par Specification
    2052              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.4
    2053              :             >3.4.  Query (rfc3986)</a>
    2054              :         @li <a href="https://en.wikipedia.org/wiki/Query_string"
    2055              :             >Query string (Wikipedia)</a>
    2056              : 
    2057              :         @see
    2058              :             @ref encoded_query,
    2059              :             @ref has_query,
    2060              :             @ref params,
    2061              :             @ref query.
    2062              :     */
    2063              :     params_encoded_view
    2064              :     encoded_params() const noexcept;
    2065              : 
    2066              :     //--------------------------------------------
    2067              :     //
    2068              :     // Fragment
    2069              :     //
    2070              :     //--------------------------------------------
    2071              : 
    2072              :     /** Return true if a fragment is present
    2073              : 
    2074              :         This function returns true if the url
    2075              :         contains a fragment.
    2076              :         An empty fragment is distinct from
    2077              :         no fragment.
    2078              : 
    2079              :         @par Example
    2080              :         @code
    2081              :         assert( url_view( "http://www.example.com/index.htm#anchor" ).has_fragment() );
    2082              :         @endcode
    2083              : 
    2084              :         @par Complexity
    2085              :         Constant.
    2086              : 
    2087              :         @par Exception Safety
    2088              :         Throws nothing.
    2089              : 
    2090              :         @par BNF
    2091              :         @code
    2092              :         URI           = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
    2093              : 
    2094              :         relative-ref  = relative-part [ "?" query ] [ "#" fragment ]
    2095              :         @endcode
    2096              : 
    2097              :         @par Specification
    2098              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.5"
    2099              :             >3.5. Fragment (rfc3986)</a>
    2100              : 
    2101              :         @see
    2102              :             @ref encoded_fragment,
    2103              :             @ref fragment.
    2104              :     */
    2105              :     bool
    2106              :     has_fragment() const noexcept;
    2107              : 
    2108              :     /** Return the fragment
    2109              : 
    2110              :         This function calculates the fragment
    2111              :         of the url, with percent escapes decoded
    2112              :         and without the leading pound sign ('#')
    2113              :         whose presence indicates that the url
    2114              :         contains a fragment.
    2115              : 
    2116              :         <br>
    2117              : 
    2118              :         This function accepts an optional
    2119              :         <em>StringToken</em> parameter which
    2120              :         controls the return type and behavior
    2121              :         of the function:
    2122              : 
    2123              :         @li When called with no arguments,
    2124              :         the return type of the function is
    2125              :         `std::string`. Otherwise
    2126              : 
    2127              :         @li When called with a string token,
    2128              :         the behavior and return type of the
    2129              :         function depends on the type of string
    2130              :         token being passed.
    2131              : 
    2132              :         @par Example
    2133              :         @code
    2134              :         assert( url_view( "http://www.example.com/index.htm#a%2D1" ).fragment() == "a-1" );
    2135              :         @endcode
    2136              : 
    2137              :         @par Complexity
    2138              :         Linear in `this->fragment().size()`.
    2139              : 
    2140              :         @par Exception Safety
    2141              :         Calls to allocate may throw.
    2142              :         String tokens may throw exceptions.
    2143              : 
    2144              :         @param token An optional string token to
    2145              :         use. If this parameter is omitted, the
    2146              :         function returns a new `std::string`.
    2147              : 
    2148              :         @par BNF
    2149              :         @code
    2150              :         fragment        = *( pchar / "/" / "?" )
    2151              : 
    2152              :         fragment-part   = [ "#" fragment ]
    2153              :         @endcode
    2154              : 
    2155              :         @par Specification
    2156              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.5"
    2157              :             >3.5. Fragment (rfc3986)</a>
    2158              : 
    2159              :         @see
    2160              :             @ref encoded_fragment,
    2161              :             @ref has_fragment.
    2162              :     */
    2163              :     template<BOOST_URL_STRTOK_TPARAM>
    2164              :     BOOST_URL_STRTOK_RETURN
    2165           17 :     fragment(
    2166              :         BOOST_URL_STRTOK_ARG(token)) const
    2167              :     {
    2168           17 :         encoding_opts opt;
    2169           17 :         opt.space_as_plus = false;
    2170           34 :         return encoded_fragment().decode(
    2171           34 :             opt, std::move(token));
    2172              :     }
    2173              : 
    2174              :     /** Return the fragment
    2175              : 
    2176              :         This function returns the fragment as a
    2177              :         string with percent-escapes.
    2178              :         Ownership is not transferred; the
    2179              :         string returned references the underlying
    2180              :         character buffer, which must remain valid
    2181              :         or else undefined behavior occurs.
    2182              : 
    2183              :         @par Example
    2184              :         @code
    2185              :         assert( url_view( "http://www.example.com/index.htm#a%2D1" ).encoded_fragment() == "a%2D1" );
    2186              :         @endcode
    2187              : 
    2188              :         @par Complexity
    2189              :         Constant.
    2190              : 
    2191              :         @par Exception Safety
    2192              :         Throws nothing.
    2193              : 
    2194              :         @par BNF
    2195              :         @code
    2196              :         fragment        = *( pchar / "/" / "?" )
    2197              : 
    2198              :         pchar           = unreserved / pct-encoded / sub-delims / ":" / "@"
    2199              :         @endcode
    2200              : 
    2201              :         @par Specification
    2202              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.5"
    2203              :             >3.5. Fragment (rfc3986)</a>
    2204              : 
    2205              :         @see
    2206              :             @ref fragment,
    2207              :             @ref has_fragment.
    2208              :     */
    2209              :     pct_string_view
    2210              :     encoded_fragment() const noexcept;
    2211              : 
    2212              :     //--------------------------------------------
    2213              :     //
    2214              :     // Compound Fields
    2215              :     //
    2216              :     //--------------------------------------------
    2217              : 
    2218              :     /** Return the host and port
    2219              : 
    2220              :         If an authority is present, this
    2221              :         function returns the host and optional
    2222              :         port as a string, which may be empty.
    2223              :         Otherwise it returns an empty string.
    2224              :         The returned string may contain
    2225              :         percent escapes.
    2226              : 
    2227              :         @par Example
    2228              :         @code
    2229              :         assert( url_view( "http://www.example.com:8080/index.htm" ).encoded_host_and_port() == "www.example.com:8080" );
    2230              :         @endcode
    2231              : 
    2232              :         @par Complexity
    2233              :         Constant.
    2234              : 
    2235              :         @par Exception Safety
    2236              :         Throws nothing.
    2237              : 
    2238              :         @par BNF
    2239              :         @code
    2240              :         authority   = [ userinfo "@" ] host [ ":" port ]
    2241              :         @endcode
    2242              : 
    2243              :         @par Specification
    2244              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
    2245              :             >3.2.2.  Host (rfc3986)</a>
    2246              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.3"
    2247              :             >3.2.3. Port (rfc3986)</a>
    2248              : 
    2249              :         @see
    2250              :             @ref has_port,
    2251              :             @ref port,
    2252              :             @ref port_number.
    2253              :     */
    2254              :     pct_string_view
    2255              :     encoded_host_and_port() const noexcept;
    2256              : 
    2257              :     /** Return the origin
    2258              : 
    2259              :         If an authority is present, this
    2260              :         function returns the scheme and
    2261              :         authority portion of the url.
    2262              :         Otherwise, an empty string is
    2263              :         returned.
    2264              :         The returned string may contain
    2265              :         percent escapes.
    2266              : 
    2267              :         @par Example
    2268              :         @code
    2269              :         assert( url_view( "http://www.example.com:8080/index.htm?text=none#h1" ).encoded_origin() == "http://www.example.com:8080" );
    2270              :         @endcode
    2271              : 
    2272              :         @par Complexity
    2273              :         Constant.
    2274              : 
    2275              :         @par Exception Safety
    2276              :         Throws nothing.
    2277              : 
    2278              :         @see
    2279              :             @ref encoded_resource,
    2280              :             @ref encoded_target.
    2281              :     */
    2282              :     pct_string_view
    2283              :     encoded_origin() const noexcept;
    2284              : 
    2285              :     /** Return the resource
    2286              : 
    2287              :         This function returns the resource, which
    2288              :         is the portion of the url that includes
    2289              :         only the path, query, and fragment.
    2290              :         The returned string may contain
    2291              :         percent escapes.
    2292              : 
    2293              :         @par Example
    2294              :         @code
    2295              :         assert( url_view( "http://www.example.com/index.html?query#frag" ).encoded_resource() == "/index.html?query#frag" );
    2296              :         @endcode
    2297              : 
    2298              :         @par Complexity
    2299              :         Constant.
    2300              : 
    2301              :         @par Exception Safety
    2302              :         Throws nothing.
    2303              : 
    2304              :         @par Specification
    2305              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.3"
    2306              :             >3.3. Path (rfc3986)</a>
    2307              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.4"
    2308              :             >3.4. Query (rfc3986)</a>
    2309              : 
    2310              :         @see
    2311              :             @ref encoded_origin,
    2312              :             @ref encoded_target.
    2313              :     */
    2314              :     pct_string_view
    2315              :     encoded_resource() const noexcept;
    2316              : 
    2317              :     /** Return the target
    2318              : 
    2319              :         This function returns the target, which
    2320              :         is the portion of the url that includes
    2321              :         only the path and query.
    2322              :         The returned string may contain
    2323              :         percent escapes.
    2324              : 
    2325              :         @par Example
    2326              :         @code
    2327              :         assert( url_view( "http://www.example.com/index.html?query#frag" ).encoded_target() == "/index.html?query" );
    2328              :         @endcode
    2329              : 
    2330              :         @par Complexity
    2331              :         Constant.
    2332              : 
    2333              :         @par Exception Safety
    2334              :         Throws nothing.
    2335              : 
    2336              :         @par Specification
    2337              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.3"
    2338              :             >3.3. Path (rfc3986)</a>
    2339              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.4"
    2340              :             >3.4. Query (rfc3986)</a>
    2341              : 
    2342              :         @see
    2343              :             @ref encoded_origin,
    2344              :             @ref encoded_resource.
    2345              :     */
    2346              :     pct_string_view
    2347              :     encoded_target() const noexcept;
    2348              : 
    2349              :     //--------------------------------------------
    2350              :     //
    2351              :     // Comparison
    2352              :     //
    2353              :     //--------------------------------------------
    2354              : 
    2355              :     /** Return the result of comparing this with another url
    2356              : 
    2357              :         This function compares two URLs
    2358              :         according to Syntax-Based comparison
    2359              :         algorithm.
    2360              : 
    2361              :         @par Complexity
    2362              :         Linear in `min( u0.size(), u1.size() )`
    2363              : 
    2364              :         @par Exception Safety
    2365              :         Throws nothing.
    2366              : 
    2367              :         @par Specification
    2368              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-6.2.2"
    2369              :             >6.2.2 Syntax-Based Normalization (rfc3986)</a>
    2370              : 
    2371              :         @return -1 if `*this < other`, 0 if
    2372              :             `this == other`, and 1 if `this > other`.
    2373              :     */
    2374              :     int
    2375              :     compare(url_view_base const& other) const noexcept;
    2376              : 
    2377              :     /** Return the result of comparing two URLs
    2378              : 
    2379              :         The URLs are compared component by
    2380              :         component as if they were first
    2381              :         normalized.
    2382              : 
    2383              :         @par Example
    2384              :         @code
    2385              :         url_view u0( "http://www.a.com/index.htm" );
    2386              :         url_view u1( "http://www.a.com/index.htm" );
    2387              :         assert( u0 == u1 );
    2388              :         @endcode
    2389              : 
    2390              :         @par Effects
    2391              :         @code
    2392              :         url a(u0);
    2393              :         a.normalize();
    2394              :         url b(u1);
    2395              :         b.normalize();
    2396              :         return a.buffer() == b.buffer();
    2397              :         @endcode
    2398              : 
    2399              :         @par Complexity
    2400              :         Linear in `min( u0.size(), u1.size() )`
    2401              : 
    2402              :         @par Exception Safety
    2403              :         Throws nothing
    2404              : 
    2405              :         @return `true` if `u0 == u1`
    2406              : 
    2407              :         @par Specification
    2408              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-6.2.2"
    2409              :             >6.2.2 Syntax-Based Normalization (rfc3986)</a>
    2410              :     */
    2411              :     friend
    2412              :     bool
    2413           73 :     operator==(
    2414              :         url_view_base const& u0,
    2415              :         url_view_base const& u1) noexcept
    2416              :     {
    2417           73 :         return u0.compare(u1) == 0;
    2418              :     }
    2419              : 
    2420              :     /** Return the result of comparing two URLs
    2421              : 
    2422              :         The URLs are compared component by
    2423              :         component as if they were first
    2424              :         normalized.
    2425              : 
    2426              :         @par Example
    2427              :         @code
    2428              :         url_view u0( "http://www.a.com/index.htm" );
    2429              :         url_view u1( "http://www.b.com/index.htm" );
    2430              :         assert( u0 != u1 );
    2431              :         @endcode
    2432              : 
    2433              :         @par Effects
    2434              :         @code
    2435              :         url a(u0);
    2436              :         a.normalize();
    2437              :         url b(u1);
    2438              :         b.normalize();
    2439              :         return a.buffer() != b.buffer();
    2440              :         @endcode
    2441              : 
    2442              :         @par Complexity
    2443              :         Linear in `min( u0.size(), u1.size() )`
    2444              : 
    2445              :         @par Exception Safety
    2446              :         Throws nothing
    2447              : 
    2448              :         @return `true` if `u0 != u1`
    2449              : 
    2450              :         @par Specification
    2451              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-6.2.2"
    2452              :             >6.2.2 Syntax-Based Normalization (rfc3986)</a>
    2453              :     */
    2454              :     friend
    2455              :     bool
    2456           25 :     operator!=(
    2457              :         url_view_base const& u0,
    2458              :         url_view_base const& u1) noexcept
    2459              :     {
    2460           25 :         return ! (u0 == u1);
    2461              :     }
    2462              : 
    2463              :     /** Return the result of comparing two URLs
    2464              : 
    2465              :         The URLs are compared component by
    2466              :         component as if they were first
    2467              :         normalized.
    2468              : 
    2469              :         @par Example
    2470              :         @code
    2471              :         url_view u0( "http://www.a.com/index.htm" );
    2472              :         url_view u1( "http://www.b.com/index.htm" );
    2473              :         assert( u0 < u1 );
    2474              :         @endcode
    2475              : 
    2476              :         @par Effects
    2477              :         @code
    2478              :         url a(u0);
    2479              :         a.normalize();
    2480              :         url b(u1);
    2481              :         b.normalize();
    2482              :         return a.buffer() < b.buffer();
    2483              :         @endcode
    2484              : 
    2485              :         @par Complexity
    2486              :         Linear in `min( u0.size(), u1.size() )`
    2487              : 
    2488              :         @par Exception Safety
    2489              :         Throws nothing
    2490              : 
    2491              :         @return `true` if `u0 < u1`
    2492              : 
    2493              :         @par Specification
    2494              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-6.2.2"
    2495              :             >6.2.2 Syntax-Based Normalization (rfc3986)</a>
    2496              :     */
    2497              :     friend
    2498              :     bool
    2499           23 :     operator<(
    2500              :         url_view_base const& u0,
    2501              :         url_view_base const& u1) noexcept
    2502              :     {
    2503           23 :         return u0.compare(u1) < 0;
    2504              :     }
    2505              : 
    2506              :     /** Return the result of comparing two URLs
    2507              : 
    2508              :         The URLs are compared component by
    2509              :         component as if they were first
    2510              :         normalized.
    2511              : 
    2512              :         @par Example
    2513              :         @code
    2514              :         url_view u0( "http://www.b.com/index.htm" );
    2515              :         url_view u1( "http://www.b.com/index.htm" );
    2516              :         assert( u0 <= u1 );
    2517              :         @endcode
    2518              : 
    2519              :         @par Effects
    2520              :         @code
    2521              :         url a(u0);
    2522              :         a.normalize();
    2523              :         url b(u1);
    2524              :         b.normalize();
    2525              :         return a.buffer() <= b.buffer();
    2526              :         @endcode
    2527              : 
    2528              :         @par Complexity
    2529              :         Linear in `min( u0.size(), u1.size() )`
    2530              : 
    2531              :         @par Exception Safety
    2532              :         Throws nothing
    2533              : 
    2534              :         @return `true` if `u0 <= u1`
    2535              : 
    2536              :         @par Specification
    2537              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-6.2.2"
    2538              :             >6.2.2 Syntax-Based Normalization (rfc3986)</a>
    2539              :     */
    2540              :     friend
    2541              :     bool
    2542           23 :     operator<=(
    2543              :         url_view_base const& u0,
    2544              :         url_view_base const& u1) noexcept
    2545              :     {
    2546           23 :         return u0.compare(u1) <= 0;
    2547              :     }
    2548              : 
    2549              :     /** Return the result of comparing two URLs
    2550              : 
    2551              :         The URLs are compared component by
    2552              :         component as if they were first
    2553              :         normalized.
    2554              : 
    2555              :         @par Example
    2556              :         @code
    2557              :         url_view u0( "http://www.b.com/index.htm" );
    2558              :         url_view u1( "http://www.a.com/index.htm" );
    2559              :         assert( u0 > u1 );
    2560              :         @endcode
    2561              : 
    2562              :         @par Effects
    2563              :         @code
    2564              :         url a(u0);
    2565              :         a.normalize();
    2566              :         url b(u1);
    2567              :         b.normalize();
    2568              :         return a.buffer() > b.buffer();
    2569              :         @endcode
    2570              : 
    2571              :         @par Complexity
    2572              :         Linear in `min( u0.size(), u1.size() )`
    2573              : 
    2574              :         @par Exception Safety
    2575              :         Throws nothing
    2576              : 
    2577              :         @return `true` if `u0 > u1`
    2578              : 
    2579              :         @par Specification
    2580              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-6.2.2"
    2581              :             >6.2.2 Syntax-Based Normalization (rfc3986)</a>
    2582              :     */
    2583              :     friend
    2584              :     bool
    2585           23 :     operator>(
    2586              :         url_view_base const& u0,
    2587              :         url_view_base const& u1) noexcept
    2588              :     {
    2589           23 :         return u0.compare(u1) > 0;
    2590              :     }
    2591              : 
    2592              :     /** Return the result of comparing two URLs
    2593              : 
    2594              :         The URLs are compared component by
    2595              :         component as if they were first
    2596              :         normalized.
    2597              : 
    2598              :         @par Example
    2599              :         @code
    2600              :         url_view u0( "http://www.a.com/index.htm" );
    2601              :         url_view u1( "http://www.a.com/index.htm" );
    2602              :         assert( u0 >= u1 );
    2603              :         @endcode
    2604              : 
    2605              :         @par Effects
    2606              :         @code
    2607              :         url a(u0);
    2608              :         a.normalize();
    2609              :         url b(u1);
    2610              :         b.normalize();
    2611              :         return a.buffer() >= b.buffer();
    2612              :         @endcode
    2613              : 
    2614              :         @par Complexity
    2615              :         Linear in `min( u0.size(), u1.size() )`
    2616              : 
    2617              :         @par Exception Safety
    2618              :         Throws nothing
    2619              : 
    2620              :         @return `true` if `u0 >= u1`
    2621              : 
    2622              :         @par Specification
    2623              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-6.2.2"
    2624              :             >6.2.2 Syntax-Based Normalization (rfc3986)</a>
    2625              :     */
    2626              :     friend
    2627              :     bool
    2628           23 :     operator>=(
    2629              :         url_view_base const& u0,
    2630              :         url_view_base const& u1) noexcept
    2631              :     {
    2632           23 :         return u0.compare(u1) >= 0;
    2633              :     }
    2634              : 
    2635              :     /** Format the url to the output stream
    2636              : 
    2637              :         This function serializes the url to
    2638              :         the specified output stream. Any
    2639              :         percent-escapes are emitted as-is;
    2640              :         no decoding is performed.
    2641              : 
    2642              :         @par Example
    2643              :         @code
    2644              :         url_view u( "http://www.example.com/index.htm" );
    2645              :         std::stringstream ss;
    2646              :         ss << u;
    2647              :         assert( ss.str() == "http://www.example.com/index.htm" );
    2648              :         @endcode
    2649              : 
    2650              :         @par Effects
    2651              :         @code
    2652              :         return os << u.buffer();
    2653              :         @endcode
    2654              : 
    2655              :         @par Complexity
    2656              :         Linear in `u.buffer().size()`
    2657              : 
    2658              :         @par Exception Safety
    2659              :         Basic guarantee.
    2660              : 
    2661              :         @return A reference to the output stream, for chaining
    2662              : 
    2663              :         @param os The output stream to write to.
    2664              : 
    2665              :         @param u The url to write.
    2666              :     */
    2667              :     friend
    2668              :     std::ostream&
    2669            5 :     operator<<(
    2670              :         std::ostream& os,
    2671              :         url_view_base const& u)
    2672              :     {
    2673            5 :         return os << u.buffer();
    2674              :     }
    2675              : 
    2676              : private:
    2677              :     //--------------------------------------------
    2678              :     //
    2679              :     // implementation
    2680              :     //
    2681              :     //--------------------------------------------
    2682              :     static
    2683              :     int
    2684              :     segments_compare(
    2685              :         segments_encoded_view seg0,
    2686              :         segments_encoded_view seg1) noexcept;
    2687              : };
    2688              : 
    2689              : //------------------------------------------------
    2690              : 
    2691              : /** Format the url to the output stream
    2692              : 
    2693              :     This function serializes the url to
    2694              :     the specified output stream. Any
    2695              :     percent-escapes are emitted as-is;
    2696              :     no decoding is performed.
    2697              : 
    2698              :     @par Example
    2699              :     @code
    2700              :     url_view u( "http://www.example.com/index.htm" );
    2701              :     std::stringstream ss;
    2702              :     ss << u;
    2703              :     assert( ss.str() == "http://www.example.com/index.htm" );
    2704              :     @endcode
    2705              : 
    2706              :     @par Effects
    2707              :     @code
    2708              :     return os << u.buffer();
    2709              :     @endcode
    2710              : 
    2711              :     @par Complexity
    2712              :     Linear in `u.buffer().size()`
    2713              : 
    2714              :     @par Exception Safety
    2715              :     Basic guarantee.
    2716              : 
    2717              :     @return A reference to the output stream, for chaining
    2718              : 
    2719              :     @param os The output stream to write to.
    2720              : 
    2721              :     @param u The url to write.
    2722              : */
    2723              : std::ostream&
    2724              : operator<<(
    2725              :     std::ostream& os,
    2726              :     url_view_base const& u);
    2727              : 
    2728              : } // urls
    2729              : } // boost
    2730              : 
    2731              : #endif
        

Generated by: LCOV version 2.1