userver: userver/http/url.hpp Source File
Loading...
Searching...
No Matches
url.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file userver/http/url.hpp
4/// @brief URL manipulation functions
5/// @ingroup userver_universal
6
7#include <map>
8#include <optional>
9#include <string>
10#include <string_view>
11#include <unordered_map>
12#include <vector>
13
14#include <userver/utils/impl/internal_tag_fwd.hpp>
15#include <userver/utils/str_icase.hpp>
16
17USERVER_NAMESPACE_BEGIN
18
19namespace http {
20
22 std::string_view scheme;
23 std::string_view host;
24 std::string_view path;
25 std::string_view query;
26 std::string_view fragment;
27};
28
29/// @brief Decode URL
30[[deprecated("Use a more strict http::parser::UrlDecode instead")]] std::string UrlDecode(std::string_view range);
31
32/// @brief Encode as URL
33/// @param input_string String to encode
34/// @returns URL-encoded string where special characters are encoded as %XX sequences
35/// @snippet universal/src/http/url_test.cpp UrlEncode example
36std::string UrlEncode(std::string_view input_string);
37
38/// @brief Encode a URL path segment (for use in S3 and similar APIs)
39/// @param input_string String to encode
40/// @returns URL-encoded string where special characters are encoded as %XX sequences,
41/// but path-safe characters (-, _, ., ~, $, &, ,, :, =, @) are kept unescaped
42/// @note This is less aggressive than UrlEncode and is suitable for encoding path segments
43/// where you want to preserve readability of certain special characters
44/// @snippet universal/src/http/url_test.cpp UrlEncodePathSegment example
45std::string UrlEncodePathSegment(std::string_view input_string);
46
47/// @brief Encode an S3 object key for use in URL path
48/// @param key S3 object key (may contain '/' as part of the key name)
49/// @returns URL-encoded path where each segment is encoded but '/' separators are preserved
50/// @note S3 object keys can contain '/' which should be preserved as path separators,
51/// while other special characters should be encoded
52/// @snippet universal/src/http/url_test.cpp EncodeS3Key example
53std::string EncodeS3Key(std::string_view key);
54
55using Args = std::unordered_map<std::string, std::string, utils::StrCaseHash>;
56using MultiArgs = std::multimap<std::string, std::string>;
57using PathArgs = std::unordered_map<std::string, std::string>;
58
59/// @brief Make an URL query
60/// @param query_args Map of query parameters
61/// @returns URL query string without leading '?' character
62/// @snippet universal/src/http/url_test.cpp MakeQuery example
63std::string MakeQuery(const Args& query_args);
64
65/// @brief Make an URL query
66/// @param query_args Multimap of query parameters
67/// @returns URL query string without leading '?' character
68/// @snippet universal/src/http/url_test.cpp MakeQuery MultiArgs
69std::string MakeQuery(const MultiArgs& query_args);
70
71/// @brief Make an URL query
72/// @param query_args Map of query parameters
73/// @returns URL query string without leading '?' character
74/// @snippet universal/src/http/url_test.cpp MakeQuery unordered_map example
75std::string MakeQuery(const std::unordered_map<std::string, std::string>& query_args);
76
77/// @brief Make an URL query
78/// @param query_args Initializer list of query parameters as key-value pairs
79/// @returns URL query string without leading '?' character
80/// @snippet universal/src/http/url_test.cpp MakeQuery initializer list example
81std::string MakeQuery(std::initializer_list<std::pair<std::string_view, std::string_view>> query_args);
82
83/// @brief Make an URL with query arguments
84/// @param path Base URL path
85/// @param query_args Map of query parameters
86/// @returns Complete URL with query string
87/// @snippet universal/src/http/url_test.cpp MakeUrl example
88std::string MakeUrl(std::string_view path, const Args& query_args);
89
90/// @brief Make an URL with query arguments
91/// @param path Base URL path
92/// @param query_args Map of query parameters
93/// @returns Complete URL with query string
94/// @snippet universal/src/http/url_test.cpp MakeUrl with unordered_map example
95std::string MakeUrl(std::string_view path, const std::unordered_map<std::string, std::string>& query_args);
96
97/// @brief Make an URL with query arguments
98/// @param path Base URL path
99/// @param query_args Map of query parameters
100/// @param query_multiargs Multimap for query parameters that can have multiple values
101/// @returns Complete URL with query string
102/// @snippet universal/src/http/url_test.cpp MakeUrl with MultiArgs example
103std::string MakeUrl(std::string_view path, const Args& query_args, MultiArgs query_multiargs);
104
105/// @brief Make an URL with query arguments
106/// @param path Base URL path
107/// @param query_args Initializer list of query parameters as key-value pairs
108/// @returns Complete URL with query string
109/// @snippet universal/src/http/url_test.cpp MakeUrl with initializer list example
110std::string MakeUrl(
111 std::string_view path,
112 std::initializer_list<std::pair<std::string_view, std::string_view>> query_args
113);
114
115/// @brief Make an URL with query arguments
116/// @param path Base URL path
117/// @param query_args vector of query parameters as key-value pairs
118/// @returns Complete URL with query string
119std::string MakeUrl(
120 std::string_view path,
121 const std::vector<std::pair<std::string_view, std::string_view>>& query_args
122);
123
124/// @brief Make a path from a template and arguments
125/// @param path Template string with placeholders in format {name}
126/// @param path_args Map of placeholder names to their values
127/// @returns Formatted path or std::nullopt if formatting fails (e.g., missing placeholder,
128/// invalid format, or empty key in path_args)
129/// @snippet universal/src/http/url_test.cpp MakeUrlWithPathArgs example
130std::optional<std::string> MakeUrlWithPathArgs(std::string_view path, const PathArgs& path_args);
131
132/// @brief Make an URL with path parameters and query arguments
133/// @param path Template string with placeholders in format {name}
134/// @param path_args Map of placeholder names to their values
135/// @param query_args Map of query parameters
136/// @returns Formatted URL or std::nullopt if path formatting fails
137/// @snippet universal/src/http/url_test.cpp MakeUrlWithPathArgs with query example
138std::optional<std::string> MakeUrlWithPathArgs(
139 std::string_view path,
140 const PathArgs& path_args,
141 const Args& query_args
142);
143
144/// @brief Make an URL with path parameters and query arguments
145/// @param path Template string with placeholders in format {name}
146/// @param path_args Map of placeholder names to their values
147/// @param query_args Map of query parameters
148/// @returns Formatted URL or std::nullopt if path formatting fails
149/// @snippet universal/src/http/url_test.cpp MakeUrlWithPathArgs unordered map query args
150std::optional<std::string> MakeUrlWithPathArgs(
151 std::string_view path,
152 const PathArgs& path_args,
153 const std::unordered_map<std::string, std::string>& query_args
154);
155
156/// @brief Make an URL with path parameters and query arguments, supporting multiple values for the same key
157/// @param path Template string with placeholders in format {name}
158/// @param path_args Map of placeholder names to their values
159/// @param query_args Map of query parameters
160/// @param query_multiargs Multimap for query parameters that can have multiple values
161/// @returns Formatted URL or std::nullopt if path formatting fails
162/// @snippet universal/src/http/url_test.cpp MakeUrlWithPathArgs MultiArgs
163std::optional<std::string> MakeUrlWithPathArgs(
164 std::string_view path,
165 const PathArgs& path_args,
166 const Args& query_args,
167 MultiArgs query_multiargs
168);
169
170/// @brief Make an URL with path parameters and query arguments
171/// @param path Template string with placeholders in format {name}
172/// @param path_args Map of placeholder names to their values
173/// @param query_args Initializer list of query parameters as key-value pairs
174/// @returns Formatted URL or std::nullopt if path formatting fails
175/// @snippet universal/src/http/url_test.cpp MakeUrlWithPathArgs with initializer list example
176std::optional<std::string> MakeUrlWithPathArgs(
177 std::string_view path,
178 const PathArgs& path_args,
179 std::initializer_list<std::pair<std::string_view, std::string_view>> query_args
180);
181
182/// @brief Returns URL part before the first '?' character
183/// @param url Full URL to extract from
184/// @returns URL without query string
185/// @snippet universal/src/http/url_test.cpp ExtractMetaTypeFromUrl example
186std::string ExtractMetaTypeFromUrl(std::string_view url);
187std::string_view ExtractMetaTypeFromUrlView(std::string_view url);
188
189// TODO: rename to ExtractPathAndQuery()
190/// @brief Returns HTTP path part of a URL
191/// @param url Full URL to extract from
192/// @returns Path component of the URL
193/// @snippet universal/src/http/url_test.cpp ExtractPathOnly example
194std::string ExtractPath(std::string_view url);
195std::string_view ExtractPathView(std::string_view url);
196
197/// @brief Returns HTTP path part of a URL
198/// @param url Full URL to extract from
199/// @returns Path component of the URL
200/// @snippet universal/src/http/url_test.cpp ExtractPathOnly example 2
201std::string ExtractPathOnly(std::string_view url);
202
203/// @brief Returns hostname part of a URL
204/// @param url Full URL to extract from
205/// @returns Hostname component of the URL
206/// @snippet universal/src/http/url_test.cpp ExtractHostname example
207std::string ExtractHostname(std::string_view url);
208std::string_view ExtractHostnameView(std::string_view url);
209
210/// @brief Returns scheme part of a URL
211/// @param url Full URL to extract from
212/// @returns Scheme component of the URL
213/// @snippet universal/src/http/url_test.cpp ExtractScheme example
214std::string ExtractScheme(std::string_view url);
215std::string_view ExtractSchemeView(std::string_view url);
216
217/// @brief Returns query part of a URL
218/// @param url Full URL to extract from
219/// @returns Query component of the URL
220/// @snippet universal/src/http/url_test.cpp ExtractQuery example
221std::string ExtractQuery(std::string_view url);
222std::string_view ExtractQueryView(std::string_view url);
223
224/// @brief Returns fragment part of a URL
225/// @param url Full URL to extract from
226/// @returns Fragment component of the URL
227/// @snippet universal/src/http/url_test.cpp ExtractFragment example
228std::string ExtractFragment(std::string_view url);
229std::string_view ExtractFragmentView(std::string_view url);
230
231/// @brief Returns decomposed URL as a struct,
232/// broken into main parts: scheme, host, path, query, and fragment
234
235namespace impl {
236
237std::string UrlDecode(utils::impl::InternalTag, std::string_view range);
238
239} // namespace impl
240
241} // namespace http
242
243USERVER_NAMESPACE_END