ext-boost/boost/url/authority_view.hpp
2023-05-22 18:45:02 +10:00

1463 lines
37 KiB
C++

//
// Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
// Official repository: https://github.com/boostorg/url
//
#ifndef BOOST_URL_AUTHORITY_VIEW_HPP
#define BOOST_URL_AUTHORITY_VIEW_HPP
#include <boost/url/detail/config.hpp>
#include <boost/url/host_type.hpp>
#include <boost/url/ipv4_address.hpp>
#include <boost/url/ipv6_address.hpp>
#include <boost/url/pct_string_view.hpp>
#include <boost/url/detail/except.hpp>
#include <boost/url/detail/url_impl.hpp>
#include <boost/assert.hpp>
#include <cstddef>
#include <iosfwd>
#include <utility>
namespace boost {
namespace urls {
/** A non-owning reference to a valid authority
Objects of this type represent valid authority
strings constructed from a parsed, external
character buffer whose storage is managed
by the caller. That is, it acts like a
@ref string_view in terms of ownership.
The caller is responsible for ensuring
that the lifetime of the underlying
character buffer extends until it is no
longer referenced.
@par Example 1
Construction from a string parses the input
as an <em>authority</em> and throws an
exception on error. Upon success, the
constructed object points to the passed
character buffer; ownership is not
transferred.
@code
authority_view a( "user:pass@www.example.com:8080" );
@endcode
@par Example 2
The parsing function @ref parse_authority returns
a @ref result containing either a valid
@ref authority_view upon succcess, otherwise it
contain an error. The error can be converted to
an exception by the caller if desired:
@code
result< authority_view > rv = parse_authority( "user:pass@www.example.com:8080" );
@endcode
@par BNF
@code
authority = [ userinfo "@" ] host [ ":" port ]
userinfo = user [ ":" [ password ] ]
user = *( unreserved / pct-encoded / sub-delims )
password = *( unreserved / pct-encoded / sub-delims / ":" )
host = IP-literal / IPv4address / reg-name
port = *DIGIT
@endcode
@par Specification
@li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2"
>3.2. Authority (rfc3986)</a>
@see
@ref parse_authority.
*/
class BOOST_SYMBOL_VISIBLE
authority_view
: private detail::parts_base
{
detail::url_impl u_;
#ifndef BOOST_URL_DOCS
// VFALCO docca emits this erroneously
friend struct detail::url_impl;
#endif
explicit
authority_view(
detail::url_impl const& u) noexcept;
public:
//--------------------------------------------
//
// Special Members
//
//--------------------------------------------
/** Destructor
*/
BOOST_URL_DECL
virtual
~authority_view();
/** Constructor
Default constructed authorities
refer to a string with zero length,
which is always valid. This matches
the grammar for a zero-length host.
@par Exception Safety
Throws nothing.
@par Specification
*/
BOOST_URL_DECL
authority_view() noexcept;
/** Construct from a string.
This function attempts to construct
an authority from the string `s`,
which must be a valid ['authority] or
else an exception is thrown. Upon
successful construction, the view
refers to the characters in the
buffer pointed to by `s`.
Ownership is not transferred; The
caller is responsible for ensuring
that the lifetime of the buffer
extends until the view is destroyed.
@par BNF
@code
authority = [ userinfo "@" ] host [ ":" port ]
userinfo = user [ ":" [ password ] ]
user = *( unreserved / pct-encoded / sub-delims )
password = *( unreserved / pct-encoded / sub-delims / ":" )
host = IP-literal / IPv4address / reg-name
port = *DIGIT
@endcode
@par Specification
@li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2"
>3.2. Authority (rfc3986)</a>
@see
@ref parse_authority.
*/
BOOST_URL_DECL
explicit
authority_view(string_view s);
/** Constructor
*/
BOOST_URL_DECL
authority_view(
authority_view const&) noexcept;
/** Assignment
*/
BOOST_URL_DECL
authority_view&
operator=(
authority_view const&) noexcept;
//--------------------------------------------
//
// Observers
//
//--------------------------------------------
/** Return the number of characters in the authority
This function returns the number of
characters in the authority.
@par Example
@code
assert( authority_view( "user:pass@www.example.com:8080" ).size() == 30 );
@endcode
@par Exception Safety
Throws nothing.
*/
std::size_t
size() const noexcept
{
return u_.offset(id_end);
}
/** Return true if the authority is empty
An empty authority has an empty host,
no userinfo, and no port.
@par Example
@code
assert( authority_view( "" ).empty() );
@endcode
@par Exception Safety
Throws nothing.
*/
bool
empty() const noexcept
{
return size() == 0;
}
/** Return a pointer to the first character
This function returns a pointer to the
beginning of the view, which is not
guaranteed to be null-terminated.
@par Exception Safety
Throws nothing.
*/
char const*
data() const noexcept
{
return u_.cs_;
}
/** Return the complete authority
This function returns the authority
as a percent-encoded string.
@par Example
@code
assert( parse_authority( "www.example.com" ).value().buffer() == "www.example.com" );
@endcode
@par BNF
@code
authority = [ userinfo "@" ] host [ ":" port ]
@endcode
@par Exception Safety
Throws nothing.
@par Specification
@li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2"
>3.2. Authority (rfc3986)</a>
*/
string_view
buffer() const noexcept
{
return string_view(data(), size());
}
//--------------------------------------------
//
// Userinfo
//
//--------------------------------------------
/** Return true if a userinfo is present
This function returns true if this
contains a userinfo.
@par Example
@code
assert( url_view( "http://jane%2Ddoe:pass@example.com" ).has_userinfo() );
@endcode
@par Complexity
Constant.
@par Exception Safety
Throws nothing.
@par BNF
@code
userinfo = user [ ":" [ password ] ]
authority = [ userinfo "@" ] host [ ":" port ]
@endcode
@par Specification
@li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.1"
>3.2.1. User Information (rfc3986)</a>
@see
@ref has_password,
@ref encoded_password,
@ref encoded_user,
@ref encoded_userinfo,
@ref password,
@ref user,
@ref userinfo.
*/
BOOST_URL_DECL
bool
has_userinfo() const noexcept;
/** Return the userinfo
If present, this function returns a
string representing the userinfo (which
may be empty).
Otherwise it returns an empty string.
Any percent-escapes in the string are
decoded first.
@par Example
@code
assert( url_view( "http://jane%2Ddoe:pass@example.com" ).userinfo() == "jane-doe:pass" );
@endcode
@par Complexity
Linear in `this->userinfo().size()`.
@par Exception Safety
Calls to allocate may throw.
@par BNF
@code
userinfo = user [ ":" [ password ] ]
authority = [ userinfo "@" ] host [ ":" port ]
@endcode
@par Specification
@li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.1"
>3.2.1. User Information (rfc3986)</a>
@see
@ref has_password,
@ref has_userinfo,
@ref encoded_password,
@ref encoded_user,
@ref encoded_userinfo,
@ref password,
@ref user.
*/
template<BOOST_URL_STRTOK_TPARAM>
BOOST_URL_STRTOK_RETURN
userinfo(
BOOST_URL_STRTOK_ARG(token)) const
{
encoding_opts opt;
opt.space_as_plus = false;
return encoded_userinfo().decode(
opt, std::move(token));
}
/** Return the userinfo
If present, this function returns a
string representing the userinfo (which
may be empty).
Otherwise it returns an empty string.
The returned string may contain
percent escapes.
@par Example
@code
assert( url_view( "http://jane%2Ddoe:pass@example.com" ).encoded_userinfo() == "jane%2Ddoe:pass" );
@endcode
@par Complexity
Constant.
@par Exception Safety
Throws nothing
@par BNF
@code
userinfo = user [ ":" [ password ] ]
authority = [ userinfo "@" ] host [ ":" port ]
@endcode
@par Specification
@li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.1"
>3.2.1. User Information (rfc3986)</a>
@see
@ref has_password,
@ref has_userinfo,
@ref encoded_password,
@ref encoded_user,
@ref password,
@ref user,
@ref userinfo.
*/
BOOST_URL_DECL
pct_string_view
encoded_userinfo() const noexcept;
//--------------------------------------------
/** Return the user
If present, this function returns a
string representing the user (which
may be empty).
Otherwise it returns an empty string.
Any percent-escapes in the string are
decoded first.
@par Example
@code
assert( url_view( "http://jane%2Ddoe:pass@example.com" ).user() == "jane-doe" );
@endcode
@par Complexity
Linear in `this->user().size()`.
@par Exception Safety
Calls to allocate may throw.
@par BNF
@code
userinfo = user [ ":" [ password ] ]
user = *( unreserved / pct-encoded / sub-delims )
password = *( unreserved / pct-encoded / sub-delims / ":" )
@endcode
@par Specification
@li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.1"
>3.2.1. User Information (rfc3986)</a>
@see
@ref has_password,
@ref has_userinfo,
@ref encoded_password,
@ref encoded_user,
@ref encoded_userinfo,
@ref password,
@ref userinfo.
*/
template<BOOST_URL_STRTOK_TPARAM>
BOOST_URL_STRTOK_RETURN
user(
BOOST_URL_STRTOK_ARG(token)) const
{
encoding_opts opt;
opt.space_as_plus = false;
return encoded_user().decode(
opt, std::move(token));
}
/** Return the user
If present, this function returns a
string representing the user (which
may be empty).
Otherwise it returns an empty string.
The returned string may contain
percent escapes.
@par Example
@code
assert( url_view( "http://jane%2Ddoe:pass@example.com" ).encoded_user() == "jane%2Ddoe" );
@endcode
@par Complexity
Constant.
@par Exception Safety
Throws nothing.
@par BNF
@code
userinfo = user [ ":" [ password ] ]
user = *( unreserved / pct-encoded / sub-delims )
password = *( unreserved / pct-encoded / sub-delims / ":" )
@endcode
@par Specification
@li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.1"
>3.2.1. User Information (rfc3986)</a>
@see
@ref has_password,
@ref has_userinfo,
@ref encoded_password,
@ref encoded_userinfo,
@ref password,
@ref user,
@ref userinfo.
*/
BOOST_URL_DECL
pct_string_view
encoded_user() const noexcept;
/** Return true if a password is present
This function returns true if the
userinfo is present and contains
a password.
@par Example
@code
assert( url_view( "http://jane%2Ddoe:pass@example.com" ).has_password() );
@endcode
@par Complexity
Constant.
@par Exception Safety
Throws nothing.
@par BNF
@code
userinfo = user [ ":" [ password ] ]
user = *( unreserved / pct-encoded / sub-delims )
password = *( unreserved / pct-encoded / sub-delims / ":" )
@endcode
@par Specification
@li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.1"
>3.2.1. User Information (rfc3986)</a>
@see
@ref has_userinfo,
@ref encoded_password,
@ref encoded_user,
@ref encoded_userinfo,
@ref password,
@ref user,
@ref userinfo.
*/
BOOST_URL_DECL
bool
has_password() const noexcept;
/** Return the password
If present, this function returns a
string representing the password (which
may be an empty string).
Otherwise it returns an empty string.
Any percent-escapes in the string are
decoded first.
@par Example
@code
assert( url_view( "http://jane%2Ddoe:pass@example.com" ).password() == "pass" );
@endcode
@par Complexity
Linear in `this->password().size()`.
@par Exception Safety
Calls to allocate may throw.
@par BNF
@code
userinfo = user [ ":" [ password ] ]
user = *( unreserved / pct-encoded / sub-delims )
password = *( unreserved / pct-encoded / sub-delims / ":" )
@endcode
@par Specification
@li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.1"
>3.2.1. User Information (rfc3986)</a>
@see
@ref has_password,
@ref has_userinfo,
@ref encoded_password,
@ref encoded_user,
@ref encoded_userinfo,
@ref user,
@ref userinfo.
*/
template<BOOST_URL_STRTOK_TPARAM>
BOOST_URL_STRTOK_RETURN
password(
BOOST_URL_STRTOK_ARG(token)) const
{
encoding_opts opt;
opt.space_as_plus = false;
return encoded_password().decode(
opt, std::move(token));
}
/** Return the password
This function returns the password portion
of the userinfo as a percent-encoded string.
@par Example
@code
assert( url_view( "http://jane%2Ddoe:pass@example.com" ).encoded_password() == "pass" );
@endcode
@par Complexity
Constant.
@par Exception Safety
Throws nothing.
@par BNF
@code
userinfo = user [ ":" [ password ] ]
user = *( unreserved / pct-encoded / sub-delims )
password = *( unreserved / pct-encoded / sub-delims / ":" )
@endcode
@par Specification
@li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.1"
>3.2.1. User Information (rfc3986)</a>
@see
@ref has_password,
@ref has_userinfo,
@ref encoded_user,
@ref encoded_userinfo,
@ref password,
@ref user,
@ref userinfo.
*/
BOOST_URL_DECL
pct_string_view
encoded_password() const noexcept;
//--------------------------------------------
//
// Host
//
//--------------------------------------------
/** Return the host type
This function returns one of the
following constants representing the
type of host present.
@li @ref host_type::ipv4
@li @ref host_type::ipv6
@li @ref host_type::ipvfuture
@li @ref host_type::name
@par Example
@code
assert( url_view( "https://192.168.0.1/local.htm" ).host_type() == host_type::ipv4 );
@endcode
@par Complexity
Constant.
@par Exception Safety
Throws nothing.
@par Specification
@li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
>3.2.2. Host (rfc3986)</a>
*/
urls::host_type
host_type() const noexcept
{
return u_.host_type_;
}
/** Return the host
This function returns the host portion
of the authority as a string, or the
empty string if there is no authority.
Any percent-escapes in the string are
decoded first.
@par Example
@code
assert( url_view( "https://www%2droot.example.com/" ).host() == "www-root.example.com" );
@endcode
@par Complexity
Linear in `this->host().size()`.
@par Exception Safety
Calls to allocate may throw.
@par BNF
@code
host = IP-literal / IPv4address / reg-name
IP-literal = "[" ( IPv6address / IPvFuture ) "]"
reg-name = *( unreserved / pct-encoded / "-" / ".")
@endcode
@par Specification
@li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
>3.2.2. Host (rfc3986)</a>
*/
template<BOOST_URL_STRTOK_TPARAM>
BOOST_URL_STRTOK_RETURN
host(
BOOST_URL_STRTOK_ARG(token)) const
{
encoding_opts opt;
opt.space_as_plus = false;
return encoded_host().decode(
opt, std::move(token));
}
/** Return the host
This function returns the host portion
of the authority as a string, or the
empty string if there is no authority.
The returned string may contain
percent escapes.
@par Example
@code
assert( url_view( "https://www%2droot.example.com/" ).encoded_host() == "www%2droot.example.com" );
@endcode
@par Complexity
Constant.
@par Exception Safety
Throws nothing.
@par BNF
@code
host = IP-literal / IPv4address / reg-name
IP-literal = "[" ( IPv6address / IPvFuture ) "]"
reg-name = *( unreserved / pct-encoded / "-" / ".")
@endcode
@par Specification
@li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
>3.2.2. Host (rfc3986)</a>
*/
BOOST_URL_DECL
pct_string_view
encoded_host() const noexcept;
/** Return the host
The value returned by this function
depends on the type of host returned
from the function @ref host_type.
@li If the type is @ref host_type::ipv4,
then the IPv4 address string is returned.
@li If the type is @ref host_type::ipv6,
then the IPv6 address string is returned,
without any enclosing brackets.
@li If the type is @ref host_type::ipvfuture,
then the IPvFuture address string is returned,
without any enclosing brackets.
@li If the type is @ref host_type::name,
then the host name string is returned.
Any percent-escapes in the string are
decoded first.
@li If the type is @ref host_type::none,
then an empty string is returned.
@par Example
@code
assert( url_view( "https://[1::6:c0a8:1]/" ).host_address() == "1::6:c0a8:1" );
@endcode
@par Complexity
Linear in `this->host_address().size()`.
@par Exception Safety
Calls to allocate may throw.
@par BNF
@code
host = IP-literal / IPv4address / reg-name
IP-literal = "[" ( IPv6address / IPvFuture ) "]"
reg-name = *( unreserved / pct-encoded / "-" / ".")
@endcode
@par Specification
@li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
>3.2.2. Host (rfc3986)</a>
*/
template<BOOST_URL_STRTOK_TPARAM>
BOOST_URL_STRTOK_RETURN
host_address(
BOOST_URL_STRTOK_ARG(token)) const
{
encoding_opts opt;
opt.space_as_plus = false;
return encoded_host_address().decode(
opt, std::move(token));
}
/** Return the host
The value returned by this function
depends on the type of host returned
from the function @ref host_type.
@li If the type is @ref host_type::ipv4,
then the IPv4 address string is returned.
@li If the type is @ref host_type::ipv6,
then the IPv6 address string is returned,
without any enclosing brackets.
@li If the type is @ref host_type::ipvfuture,
then the IPvFuture address string is returned,
without any enclosing brackets.
@li If the type is @ref host_type::name,
then the host name string is returned.
Any percent-escapes in the string are
decoded first.
@li If the type is @ref host_type::none,
then an empty string is returned.
The returned string may contain
percent escapes.
@par Example
@code
assert( url_view( "https://www%2droot.example.com/" ).encoded_host_address() == "www%2droot.example.com" );
@endcode
@par Complexity
Constant.
@par Exception Safety
Throws nothing.
@par BNF
@code
host = IP-literal / IPv4address / reg-name
IP-literal = "[" ( IPv6address / IPvFuture ) "]"
reg-name = *( unreserved / pct-encoded / "-" / ".")
@endcode
@par Specification
@li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
>3.2.2. Host (rfc3986)</a>
*/
BOOST_URL_DECL
pct_string_view
encoded_host_address() const noexcept;
/** Return the host IPv4 address
If the host type is @ref host_type::ipv4,
this function returns the address as
a value of type @ref ipv4_address.
Otherwise, if the host type is not an IPv4
address, it returns a default-constructed
value which is equal to the unspecified
address "0.0.0.0".
@par Example
@code
assert( url_view( "http://127.0.0.1/index.htm?user=win95" ).host_ipv4_address() == ipv4_address( "127.0.0.1" ) );
@endcode
@par Complexity
Constant.
@par Exception Safety
Throws nothing.
@par BNF
@code
IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet
dec-octet = DIGIT ; 0-9
/ %x31-39 DIGIT ; 10-99
/ "1" 2DIGIT ; 100-199
/ "2" %x30-34 DIGIT ; 200-249
/ "25" %x30-35 ; 250-255
@endcode
@par Specification
@li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
>3.2.2. Host (rfc3986)</a>
*/
BOOST_URL_DECL
ipv4_address
host_ipv4_address() const noexcept;
/** Return the host IPv6 address
If the host type is @ref host_type::ipv6,
this function returns the address as
a value of type @ref ipv6_address.
Otherwise, if the host type is not an IPv6
address, it returns a default-constructed
value which is equal to the unspecified
address "0:0:0:0:0:0:0:0".
@par Example
@code
assert( url_view( "ftp://[::1]/" ).host_ipv6_address() == ipv6_address( "::1" ) );
@endcode
@par Complexity
Constant.
@par Exception Safety
Throws nothing.
@par BNF
@code
IPv6address = 6( h16 ":" ) ls32
/ "::" 5( h16 ":" ) ls32
/ [ h16 ] "::" 4( h16 ":" ) ls32
/ [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32
/ [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32
/ [ *3( h16 ":" ) h16 ] "::" h16 ":" ls32
/ [ *4( h16 ":" ) h16 ] "::" ls32
/ [ *5( h16 ":" ) h16 ] "::" h16
/ [ *6( h16 ":" ) h16 ] "::"
ls32 = ( h16 ":" h16 ) / IPv4address
; least-significant 32 bits of address
h16 = 1*4HEXDIG
; 16 bits of address represented in hexadecimal
@endcode
@par Specification
@li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
>3.2.2. Host (rfc3986)</a>
*/
BOOST_URL_DECL
ipv6_address
host_ipv6_address() const noexcept;
/** Return the host IPvFuture address
If the host type is @ref host_type::ipvfuture,
this function returns the address as
a string.
Otherwise, if the host type is not an
IPvFuture address, it returns an
empty string.
@par Example
@code
assert( url_view( "http://[v1fe.d:9]/index.htm" ).host_ipvfuture() == "v1fe.d:9" );
@endcode
@par Complexity
Constant.
@par Exception Safety
Throws nothing.
@par BNF
@code
IPvFuture = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" )
@endcode
@par Specification
@li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
>3.2.2. Host (rfc3986)</a>
*/
BOOST_URL_DECL
string_view
host_ipvfuture() const noexcept;
/** Return the host name
If the host type is @ref host_type::name,
this function returns the name as
a string.
Otherwise, if the host type is not an
name, it returns an empty string.
Any percent-escapes in the string are
decoded first.
@par Example
@code
assert( url_view( "https://www%2droot.example.com/" ).host_name() == "www-root.example.com" );
@endcode
@par Complexity
Linear in `this->host_name().size()`.
@par Exception Safety
Calls to allocate may throw.
@par BNF
@code
host = IP-literal / IPv4address / reg-name
IP-literal = "[" ( IPv6address / IPvFuture ) "]"
reg-name = *( unreserved / pct-encoded / "-" / ".")
@endcode
@par Specification
@li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
>3.2.2. Host (rfc3986)</a>
*/
template<BOOST_URL_STRTOK_TPARAM>
BOOST_URL_STRTOK_RETURN
host_name(
BOOST_URL_STRTOK_ARG(token)) const
{
encoding_opts opt;
opt.space_as_plus = false;
return encoded_host_name().decode(
opt, std::move(token));
}
/** Return the host name
If the host type is @ref host_type::name,
this function returns the name as
a string.
Otherwise, if the host type is not an
name, it returns an empty string.
The returned string may contain
percent escapes.
@par Example
@code
assert( url_view( "https://www%2droot.example.com/" ).encoded_host_name() == "www%2droot.example.com" );
@endcode
@par Complexity
Constant.
@par Exception Safety
Throws nothing.
@par BNF
@code
host = IP-literal / IPv4address / reg-name
IP-literal = "[" ( IPv6address / IPvFuture ) "]"
reg-name = *( unreserved / pct-encoded / "-" / ".")
@endcode
@par Specification
@li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
>3.2.2. Host (rfc3986)</a>
*/
BOOST_URL_DECL
pct_string_view
encoded_host_name() const noexcept;
//--------------------------------------------
//
// Port
//
//--------------------------------------------
/** Return true if a port is present
This function returns true if an
authority is present and contains a port.
@par Example
@code
assert( url_view( "wss://www.example.com:443" ).has_port() );
@endcode
@par Complexity
Constant.
@par Exception Safety
Throws nothing.
@par BNF
@code
authority = [ userinfo "@" ] host [ ":" port ]
port = *DIGIT
@endcode
@par Specification
@li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.3"
>3.2.3. Port (rfc3986)</a>
@see
@ref encoded_host_and_port,
@ref port,
@ref port_number.
*/
BOOST_URL_DECL
bool
has_port() const noexcept;
/** Return the port
If present, this function returns a
string representing the port (which
may be empty).
Otherwise it returns an empty string.
@par Example
@code
assert( url_view( "http://localhost.com:8080" ).port() == "8080" );
@endcode
@par Complexity
Constant.
@par Exception Safety
Throws nothing.
@par BNF
@code
port = *DIGIT
@endcode
@par Specification
@li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.3"
>3.2.3. Port (rfc3986)</a>
@see
@ref encoded_host_and_port,
@ref has_port,
@ref port_number.
*/
BOOST_URL_DECL
string_view
port() const noexcept;
/** Return the port
If a port is present and the numerical
value is representable, it is returned
as an unsigned integer. Otherwise, the
number zero is returned.
@par Example
@code
assert( url_view( "http://localhost.com:8080" ).port_number() == 8080 );
@endcode
@par Complexity
Constant.
@par Exception Safety
Throws nothing.
@par BNF
@code
port = *DIGIT
@endcode
@par Specification
@li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.3"
>3.2.3. Port (rfc3986)</a>
@see
@ref encoded_host_and_port,
@ref has_port,
@ref port.
*/
BOOST_URL_DECL
std::uint16_t
port_number() const noexcept;
/** Return the host and port
If an authority is present, this
function returns the host and optional
port as a string, which may be empty.
Otherwise it returns an empty string.
The returned string may contain
percent escapes.
@par Example
@code
assert( url_view( "http://www.example.com:8080/index.htm" ).encoded_host_and_port() == "www.example.com:8080" );
@endcode
@par Complexity
Constant.
@par Exception Safety
Throws nothing.
@par BNF
@code
authority = [ userinfo "@" ] host [ ":" port ]
@endcode
@par Specification
@li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
>3.2.2. Host (rfc3986)</a>
@li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.3"
>3.2.3. Port (rfc3986)</a>
@see
@ref has_port,
@ref port,
@ref port_number.
*/
BOOST_URL_DECL
pct_string_view
encoded_host_and_port() const noexcept;
//--------------------------------------------
//
// Comparison
//
//--------------------------------------------
/** Return the result of comparing this with another authority
This function compares two authorities
according to Syntax-Based comparison
algorithm.
@par Exception Safety
Throws nothing.
@return -1 if `*this < other`, 0 if
`this == other`, and 1 if `this > other`.
@par Specification
@li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-6.2.2"
>6.2.2 Syntax-Based Normalization (rfc3986)</a>
*/
BOOST_URL_DECL
int
compare(authority_view const& other) const noexcept;
/** Return the result of comparing two authorities
The authorities are compared component
by component as if they were first
normalized.
@par Complexity
Linear in `min( a0.size(), a1.size() )`
@par Exception Safety
Throws nothing
*/
friend
bool
operator==(
authority_view const& a0,
authority_view const& a1) noexcept
{
return a0.compare(a1) == 0;
}
/** Return the result of comparing two authorities
The authorities are compared component
by component as if they were first
normalized.
@par Complexity
Linear in `min( a0.size(), a1.size() )`
@par Exception Safety
Throws nothing
*/
friend
bool
operator!=(
authority_view const& a0,
authority_view const& a1) noexcept
{
return ! (a0 == a1);
}
/** Return the result of comparing two authorities
The authorities are compared component
by component as if they were first
normalized.
@par Complexity
Linear in `min( a0.size(), a1.size() )`
@par Exception Safety
Throws nothing
*/
friend
bool
operator<(
authority_view const& a0,
authority_view const& a1) noexcept
{
return a0.compare(a1) < 0;
}
/** Return the result of comparing two authorities
The authorities are compared component
by component as if they were first
normalized.
@par Complexity
Linear in `min( a0.size(), a1.size() )`
@par Exception Safety
Throws nothing
*/
friend
bool
operator<=(
authority_view const& a0,
authority_view const& a1) noexcept
{
return a0.compare(a1) <= 0;
}
/** Return the result of comparing two authorities
The authorities are compared component
by component as if they were first
normalized.
@par Complexity
Linear in `min( a0.size(), a1.size() )`
@par Exception Safety
Throws nothing
*/
friend
bool
operator>(
authority_view const& a0,
authority_view const& a1) noexcept
{
return a0.compare(a1) > 0;
}
/** Return the result of comparing two authorities
The authorities are compared component
by component as if they were first
normalized.
@par Complexity
Linear in `min( a0.size(), a1.size() )`
@par Exception Safety
Throws nothing
*/
friend
bool
operator>=(
authority_view const& a0,
authority_view const& a1) noexcept
{
return a0.compare(a1) >= 0;
}
//--------------------------------------------
// hidden friend
friend
std::ostream&
operator<<(
std::ostream& os,
authority_view const& a)
{
return os << a.buffer();
}
};
/** Format the encoded authority to the output stream
This function serializes the encoded URL
to the output stream.
@par Example
@code
authority_view a( "www.example.com" );
std::cout << a << std::endl;
@endcode
@return A reference to the output stream, for chaining
@param os The output stream to write to
@param a The URL to write
*/
std::ostream&
operator<<(
std::ostream& os,
authority_view const& a);
//------------------------------------------------
/** Parse an authority
This function parses a string according to
the authority grammar below, and returns an
@ref authority_view referencing the string.
Ownership of the string is not transferred;
the caller is responsible for ensuring that
the lifetime of the string extends until the
view is no longer being accessed.
@par BNF
@code
authority = [ userinfo "@" ] host [ ":" port ]
userinfo = user [ ":" [ password ] ]
user = *( unreserved / pct-encoded / sub-delims )
password = *( unreserved / pct-encoded / sub-delims / ":" )
host = IP-literal / IPv4address / reg-name
port = *DIGIT
@endcode
@par Exception Safety
Throws nothing.
@return A view to the parsed authority
@param s The string to parse
@par Specification
@li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2"
>3.2. Authority (rfc3986)</a>
@see
@ref authority_view.
*/
BOOST_URL_DECL
result<authority_view>
parse_authority(
string_view s) noexcept;
//------------------------------------------------
} // urls
} // boost
#endif