287 lines
6.8 KiB
C++
287 lines
6.8 KiB
C++
|
//
|
||
|
// Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
|
||
|
// Copyright (c) 2022 Alan de Freitas (alandefreitas@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_PARAMS_VIEW_HPP
|
||
|
#define BOOST_URL_PARAMS_VIEW_HPP
|
||
|
|
||
|
#include <boost/url/detail/config.hpp>
|
||
|
#include <boost/url/params_base.hpp>
|
||
|
|
||
|
namespace boost {
|
||
|
namespace urls {
|
||
|
|
||
|
/** A view representing query parameters in a URL
|
||
|
|
||
|
Objects of this type are used to interpret
|
||
|
the query parameters as a bidirectional view
|
||
|
of key/value pairs.
|
||
|
|
||
|
The view does not retain ownership of the
|
||
|
elements and instead references the original
|
||
|
character buffer. The caller is responsible
|
||
|
for ensuring that the lifetime of the buffer
|
||
|
extends until it is no longer referenced.
|
||
|
|
||
|
@par Example
|
||
|
@code
|
||
|
url_view u( "?first=John&last=Doe" );
|
||
|
|
||
|
params_view p = u.params();
|
||
|
@endcode
|
||
|
|
||
|
Percent escapes in strings returned when
|
||
|
dereferencing iterators are automatically
|
||
|
decoded.
|
||
|
|
||
|
@par Iterator Invalidation
|
||
|
Changes to the underlying character buffer
|
||
|
can invalidate iterators which reference it.
|
||
|
*/
|
||
|
class params_view
|
||
|
: public params_base
|
||
|
{
|
||
|
friend class url_view_base;
|
||
|
friend class params_encoded_view;
|
||
|
friend class params_ref;
|
||
|
|
||
|
params_view(
|
||
|
detail::query_ref const& ref,
|
||
|
encoding_opts opt) noexcept;
|
||
|
|
||
|
public:
|
||
|
/** Constructor
|
||
|
|
||
|
Default-constructed params have
|
||
|
zero elements.
|
||
|
|
||
|
@par Example
|
||
|
@code
|
||
|
params_view qp;
|
||
|
@endcode
|
||
|
|
||
|
@par Effects
|
||
|
@code
|
||
|
return params_view( "" );
|
||
|
@endcode
|
||
|
|
||
|
@par Complexity
|
||
|
Constant.
|
||
|
|
||
|
@par Exception Safety
|
||
|
Throws nothing.
|
||
|
*/
|
||
|
params_view() = default;
|
||
|
|
||
|
/** Constructor
|
||
|
|
||
|
After construction both views reference
|
||
|
the same character buffer.
|
||
|
|
||
|
Ownership is not transferred; the caller
|
||
|
is responsible for ensuring the lifetime
|
||
|
of the buffer extends until it is no
|
||
|
longer referenced.
|
||
|
|
||
|
@par Postconditions
|
||
|
@code
|
||
|
this->buffer().data() == other.buffer().data()
|
||
|
@endcode
|
||
|
|
||
|
@par Complexity
|
||
|
Constant.
|
||
|
|
||
|
@par Exception Safety
|
||
|
Throws nothing
|
||
|
*/
|
||
|
params_view(
|
||
|
params_view const& other) = default;
|
||
|
|
||
|
/** Constructor
|
||
|
|
||
|
After construction both views will
|
||
|
reference the same character buffer
|
||
|
but this instance will use the specified
|
||
|
@ref encoding_opts when the values
|
||
|
are decoded.
|
||
|
|
||
|
Ownership is not transferred; the caller
|
||
|
is responsible for ensuring the lifetime
|
||
|
of the buffer extends until it is no
|
||
|
longer referenced.
|
||
|
|
||
|
@par Postconditions
|
||
|
@code
|
||
|
this->buffer().data() == other.buffer().data()
|
||
|
@endcode
|
||
|
|
||
|
@par Complexity
|
||
|
Constant.
|
||
|
|
||
|
@par Exception Safety
|
||
|
Throws nothing
|
||
|
*/
|
||
|
params_view(
|
||
|
params_view const& other,
|
||
|
encoding_opts opt) noexcept;
|
||
|
|
||
|
/** Constructor
|
||
|
|
||
|
This function constructs params from
|
||
|
a valid query parameter string, which
|
||
|
can contain percent escapes. Unlike
|
||
|
the parameters in URLs, the string
|
||
|
passed here should not start with "?".
|
||
|
Upon construction, the view references
|
||
|
the character buffer pointed to by `s`.
|
||
|
The caller is responsible for ensuring
|
||
|
that the lifetime of the buffer extends
|
||
|
until it is no longer referenced.
|
||
|
|
||
|
@par Example
|
||
|
@code
|
||
|
params_view qp( "first=John&last=Doe" );
|
||
|
@endcode
|
||
|
|
||
|
@par Effects
|
||
|
@code
|
||
|
return parse_query( s ).value();
|
||
|
@endcode
|
||
|
|
||
|
@par Postconditions
|
||
|
@code
|
||
|
this->buffer().data() == s.data()
|
||
|
@endcode
|
||
|
|
||
|
@par Complexity
|
||
|
Linear in `s`.
|
||
|
|
||
|
@par Exception Safety
|
||
|
Exceptions thrown on invalid input.
|
||
|
|
||
|
@throw system_error
|
||
|
`s` contains an invalid query parameter
|
||
|
string.
|
||
|
|
||
|
@param s The string to parse.
|
||
|
|
||
|
@par BNF
|
||
|
@code
|
||
|
query-params = [ query-param ] *( "&" query-param )
|
||
|
|
||
|
query-param = key [ "=" value ]
|
||
|
@endcode
|
||
|
|
||
|
@par Specification
|
||
|
@li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.4"
|
||
|
>3.4. Query</a>
|
||
|
*/
|
||
|
BOOST_URL_DECL
|
||
|
params_view(
|
||
|
core::string_view s);
|
||
|
|
||
|
/** Constructor
|
||
|
|
||
|
This function constructs params from
|
||
|
a valid query parameter string, which
|
||
|
can contain percent escapes.
|
||
|
|
||
|
This instance will use the specified
|
||
|
@ref encoding_opts when the values
|
||
|
are decoded.
|
||
|
|
||
|
Unlike the parameters in URLs, the string
|
||
|
passed here should not start with "?".
|
||
|
Upon construction, the view will
|
||
|
reference the character buffer pointed
|
||
|
to by `s`. The caller is responsible
|
||
|
for ensuring that the lifetime of the
|
||
|
buffer extends until it is no longer
|
||
|
referenced.
|
||
|
|
||
|
@par Example
|
||
|
@code
|
||
|
encoding_opts opt;
|
||
|
opt.space_as_plus = true;
|
||
|
params_view qp( "name=John+Doe", opt );
|
||
|
@endcode
|
||
|
|
||
|
@par Effects
|
||
|
@code
|
||
|
return params_view(parse_query( s ).value(), opt);
|
||
|
@endcode
|
||
|
|
||
|
@par Postconditions
|
||
|
@code
|
||
|
this->buffer().data() == s.data()
|
||
|
@endcode
|
||
|
|
||
|
@par Complexity
|
||
|
Linear in `s`.
|
||
|
|
||
|
@par Exception Safety
|
||
|
Exceptions thrown on invalid input.
|
||
|
|
||
|
@throw system_error
|
||
|
`s` contains an invalid query parameter
|
||
|
string.
|
||
|
|
||
|
@param s The string to parse.
|
||
|
|
||
|
@param opt The options for decoding. If
|
||
|
this parameter is omitted, `space_as_plus`
|
||
|
is used.
|
||
|
|
||
|
@par BNF
|
||
|
@code
|
||
|
query-params = [ query-param ] *( "&" query-param )
|
||
|
|
||
|
query-param = key [ "=" value ]
|
||
|
@endcode
|
||
|
|
||
|
@par Specification
|
||
|
@li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.4"
|
||
|
>3.4. Query</a>
|
||
|
*/
|
||
|
BOOST_URL_DECL
|
||
|
params_view(
|
||
|
core::string_view s,
|
||
|
encoding_opts opt);
|
||
|
|
||
|
/** Assignment
|
||
|
|
||
|
After assignment, both views reference
|
||
|
the same underlying character buffer.
|
||
|
|
||
|
Ownership is not transferred; the caller
|
||
|
is responsible for ensuring the lifetime
|
||
|
of the buffer extends until it is no
|
||
|
longer referenced.
|
||
|
|
||
|
@par Postconditions
|
||
|
@code
|
||
|
this->buffer().data() == other.buffer().data()
|
||
|
@endcode
|
||
|
|
||
|
@par Complexity
|
||
|
Constant
|
||
|
|
||
|
@par Exception Safety
|
||
|
Throws nothing
|
||
|
*/
|
||
|
params_view&
|
||
|
operator=(
|
||
|
params_view const&) = default;
|
||
|
};
|
||
|
|
||
|
} // urls
|
||
|
} // boost
|
||
|
|
||
|
#endif
|