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