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_PARAMS_VIEW_HPP
12 : #define BOOST_URL_PARAMS_VIEW_HPP
13 :
14 : #include <boost/url/detail/config.hpp>
15 : #include <boost/url/params_base.hpp>
16 :
17 : namespace boost {
18 : namespace urls {
19 :
20 : /** A view representing query parameters in a URL
21 :
22 : Objects of this type are used to interpret
23 : the query parameters as a bidirectional view
24 : of key/value pairs.
25 :
26 : The view does not retain ownership of the
27 : elements and instead references the original
28 : character buffer. The caller is responsible
29 : for ensuring that the lifetime of the buffer
30 : extends until it is no longer referenced.
31 :
32 : @par Example
33 : @code
34 : url_view u( "?first=John&last=Doe" );
35 :
36 : params_view p = u.params();
37 : @endcode
38 :
39 : Percent escapes in strings returned when
40 : dereferencing iterators are automatically
41 : decoded.
42 :
43 : @par Iterator Invalidation
44 : Changes to the underlying character buffer
45 : can invalidate iterators which reference it.
46 : */
47 : class params_view
48 : : public params_base
49 : {
50 : friend class url_view_base;
51 : friend class params_encoded_view;
52 : friend class params_ref;
53 :
54 : params_view(
55 : detail::query_ref const& ref,
56 : encoding_opts opt) noexcept;
57 :
58 : public:
59 : /** Constructor
60 :
61 : Default-constructed params have
62 : zero elements.
63 :
64 : @par Example
65 : @code
66 : params_view qp;
67 : @endcode
68 :
69 : @par Effects
70 : @code
71 : return params_view( "" );
72 : @endcode
73 :
74 : @par Complexity
75 : Constant.
76 :
77 : @par Exception Safety
78 : Throws nothing.
79 : */
80 1 : params_view() = default;
81 :
82 : /** Constructor
83 :
84 : After construction both views reference
85 : the same character buffer.
86 :
87 : Ownership is not transferred; the caller
88 : is responsible for ensuring the lifetime
89 : of the buffer extends until it is no
90 : longer referenced.
91 :
92 : @par Postconditions
93 : @code
94 : this->buffer().data() == other.buffer().data()
95 : @endcode
96 :
97 : @par Complexity
98 : Constant.
99 :
100 : @par Exception Safety
101 : Throws nothing
102 : */
103 : params_view(
104 : params_view const& other) = default;
105 :
106 : /** Constructor
107 :
108 : After construction both views will
109 : reference the same character buffer
110 : but this instance will use the specified
111 : @ref encoding_opts when the values
112 : are decoded.
113 :
114 : Ownership is not transferred; the caller
115 : is responsible for ensuring the lifetime
116 : of the buffer extends until it is no
117 : longer referenced.
118 :
119 : @par Postconditions
120 : @code
121 : this->buffer().data() == other.buffer().data()
122 : @endcode
123 :
124 : @par Complexity
125 : Constant.
126 :
127 : @par Exception Safety
128 : Throws nothing
129 : */
130 : params_view(
131 : params_view const& other,
132 : encoding_opts opt) noexcept;
133 :
134 : /** Constructor
135 :
136 : This function constructs params from
137 : a valid query parameter string, which
138 : can contain percent escapes. Unlike
139 : the parameters in URLs, the string
140 : passed here should not start with "?".
141 : Upon construction, the view references
142 : the character buffer pointed to by `s`.
143 : The caller is responsible for ensuring
144 : that the lifetime of the buffer extends
145 : until it is no longer referenced.
146 :
147 : @par Example
148 : @code
149 : params_view qp( "first=John&last=Doe" );
150 : @endcode
151 :
152 : @par Effects
153 : @code
154 : return parse_query( s ).value();
155 : @endcode
156 :
157 : @par Postconditions
158 : @code
159 : this->buffer().data() == s.data()
160 : @endcode
161 :
162 : @par Complexity
163 : Linear in `s`.
164 :
165 : @par Exception Safety
166 : Exceptions thrown on invalid input.
167 :
168 : @throw system_error
169 : `s` contains an invalid query parameter
170 : string.
171 :
172 : @param s The string to parse.
173 :
174 : @par BNF
175 : @code
176 : query-params = [ query-param ] *( "&" query-param )
177 :
178 : query-param = key [ "=" value ]
179 : @endcode
180 :
181 : @par Specification
182 : @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.4"
183 : >3.4. Query</a>
184 : */
185 : BOOST_URL_DECL
186 : params_view(
187 : core::string_view s);
188 :
189 : /** Constructor
190 :
191 : This function constructs params from
192 : a valid query parameter string, which
193 : can contain percent escapes.
194 :
195 : This instance will use the specified
196 : @ref encoding_opts when the values
197 : are decoded.
198 :
199 : Unlike the parameters in URLs, the string
200 : passed here should not start with "?".
201 : Upon construction, the view will
202 : reference the character buffer pointed
203 : to by `s`. The caller is responsible
204 : for ensuring that the lifetime of the
205 : buffer extends until it is no longer
206 : referenced.
207 :
208 : @par Example
209 : @code
210 : encoding_opts opt;
211 : opt.space_as_plus = true;
212 : params_view qp( "name=John+Doe", opt );
213 : @endcode
214 :
215 : @par Effects
216 : @code
217 : return params_view(parse_query( s ).value(), opt);
218 : @endcode
219 :
220 : @par Postconditions
221 : @code
222 : this->buffer().data() == s.data()
223 : @endcode
224 :
225 : @par Complexity
226 : Linear in `s`.
227 :
228 : @par Exception Safety
229 : Exceptions thrown on invalid input.
230 :
231 : @throw system_error
232 : `s` contains an invalid query parameter
233 : string.
234 :
235 : @param s The string to parse.
236 :
237 : @param opt The options for decoding. If
238 : this parameter is omitted, `space_as_plus`
239 : is used.
240 :
241 : @par BNF
242 : @code
243 : query-params = [ query-param ] *( "&" query-param )
244 :
245 : query-param = key [ "=" value ]
246 : @endcode
247 :
248 : @par Specification
249 : @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.4"
250 : >3.4. Query</a>
251 : */
252 : BOOST_URL_DECL
253 : params_view(
254 : core::string_view s,
255 : encoding_opts opt);
256 :
257 : /** Assignment
258 :
259 : After assignment, both views reference
260 : the same underlying character buffer.
261 :
262 : Ownership is not transferred; the caller
263 : is responsible for ensuring the lifetime
264 : of the buffer extends until it is no
265 : longer referenced.
266 :
267 : @par Postconditions
268 : @code
269 : this->buffer().data() == other.buffer().data()
270 : @endcode
271 :
272 : @par Complexity
273 : Constant
274 :
275 : @par Exception Safety
276 : Throws nothing
277 : */
278 : params_view&
279 : operator=(
280 : params_view const&) = default;
281 : };
282 :
283 : } // urls
284 : } // boost
285 :
286 : #endif
|