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
13#include <userver/utils/impl/internal_tag_fwd.hpp>
14#include <userver/utils/str_icase.hpp>
15
16USERVER_NAMESPACE_BEGIN
17
18namespace http {
19
20/// @brief Decode URL
21[[deprecated("Use a more strict http::parser::UrlDecode instead")]] std::string UrlDecode(std::string_view range);
22
23/// @brief Encode as URL
24/// @param input_string String to encode
25/// @returns URL-encoded string where special characters are encoded as %XX sequences
26/// @code
27/// auto encoded = UrlEncode("hello world");
28/// // Returns: "hello%20world"
29/// @endcode
30std::string UrlEncode(std::string_view input_string);
31
32using Args = std::unordered_map<std::string, std::string, utils::StrCaseHash>;
33using MultiArgs = std::multimap<std::string, std::string>;
34using PathArgs = std::unordered_map<std::string, std::string>;
35
36/// @brief Make an URL query
37/// @param query_args Map of query parameters
38/// @returns URL query string without leading '?' character
39/// @code
40/// auto query = MakeQuery(http::Args{{"param", "value"}, {"filter", "active"}});
41/// // Returns: "param=value&filter=active"
42/// @endcode
43std::string MakeQuery(const Args& query_args);
44
45/// @brief Make an URL query
46/// @param query_args Multimap of query parameters
47/// @returns URL query string without leading '?' character
48/// @code
49/// http::MultiArgs args = {{"tag", "new"}, {"tag", "featured"}};
50/// auto query = MakeQuery(args);
51/// // Returns: "tag=new&tag=featured"
52/// @endcode
53std::string MakeQuery(const MultiArgs& query_args);
54
55/// @brief Make an URL query
56/// @param query_args Map of query parameters
57/// @returns URL query string without leading '?' character
58/// @code
59/// auto query = MakeQuery(std::unordered_map<std::string, std::string>{{"page", "1"}, {"size", "10"}});
60/// // Returns: "page=1&size=10"
61/// @endcode
62std::string MakeQuery(const std::unordered_map<std::string, std::string>& query_args);
63
64/// @brief Make an URL query
65/// @param query_args Initializer list of query parameters as key-value pairs
66/// @returns URL query string without leading '?' character
67/// @code
68/// auto query = MakeQuery({{"sort", "date"}, {"order", "desc"}});
69/// // Returns: "sort=date&order=desc"
70/// @endcode
71std::string MakeQuery(std::initializer_list<std::pair<std::string_view, std::string_view>> query_args);
72
73/// @brief Make an URL with query arguments
74/// @param path Base URL path
75/// @param query_args Map of query parameters
76/// @returns Complete URL with query string
77/// @code
78/// auto url = MakeUrl("/api/users", http::Args{{"status", "active"}});
79/// // Returns: "/api/users?status=active"
80/// @endcode
81std::string MakeUrl(std::string_view path, const Args& 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/// @code
88/// auto url = MakeUrl("/api/products", std::unordered_map<std::string, std::string>{{"category", "electronics"}});
89/// // Returns: "/api/products?category=electronics"
90/// @endcode
91std::string MakeUrl(std::string_view path, const std::unordered_map<std::string, std::string>& query_args);
92
93/// @brief Make an URL with query arguments
94/// @param path Base URL path
95/// @param query_args Map of query parameters
96/// @param query_multiargs Multimap for query parameters that can have multiple values
97/// @returns Complete URL with query string
98/// @code
99/// http::MultiArgs multi_args = {{"tag", "new"}, {"tag", "featured"}};
100/// auto url = MakeUrl("/api/products", http::Args{{"category", "electronics"}}, multi_args);
101/// // Returns: "/api/products?category=electronics&tag=new&tag=featured"
102/// @endcode
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/// @code
110/// auto url = MakeUrl("/api/search", {{"q", "smartphone"}, {"sort", "relevance"}});
111/// // Returns: "/api/search?q=smartphone&sort=relevance"
112/// @endcode
113std::string
114MakeUrl(std::string_view path, std::initializer_list<std::pair<std::string_view, std::string_view>> query_args);
115
116/// @brief Make a path from a template and arguments
117/// @param path Template string with placeholders in format {name}
118/// @param path_args Map of placeholder names to their values
119/// @returns Formatted path or std::nullopt if formatting fails (e.g., missing placeholder,
120/// invalid format, or empty key in path_args)
121/// @code
122/// auto url = MakeUrlWithPathArgs("/api/v1/users/{user_id}", {{"user_id", "123"}});
123/// // Returns: "/api/v1/users/123"
124/// @endcode
125std::optional<std::string> MakeUrlWithPathArgs(std::string_view path, const PathArgs& path_args);
126
127/// @brief Make an URL with path parameters and query arguments
128/// @param path Template string with placeholders in format {name}
129/// @param path_args Map of placeholder names to their values
130/// @param query_args Map of query parameters
131/// @returns Formatted URL or std::nullopt if path formatting fails
132/// @code
133/// auto url = MakeUrlWithPathArgs("/api/v1/users/{user_id}",
134/// {{"user_id", "123"}},
135/// http::Args{{"filter", "active"}});
136/// // Returns: "/api/v1/users/123?filter=active"
137/// @endcode
138std::optional<std::string>
139MakeUrlWithPathArgs(std::string_view path, const PathArgs& path_args, const Args& query_args);
140
141/// @brief Make an URL with path parameters and query arguments
142/// @param path Template string with placeholders in format {name}
143/// @param path_args Map of placeholder names to their values
144/// @param query_args Map of query parameters
145/// @returns Formatted URL or std::nullopt if path formatting fails
146/// @code
147/// auto url = MakeUrlWithPathArgs("/api/v1/users/{user_id}",
148/// {{"user_id", "123"}},
149/// std::unordered_map<std::string, std::string>{{"page", "1"}});
150/// // Returns: "/api/v1/users/123?page=1"
151/// @endcode
152std::optional<std::string> MakeUrlWithPathArgs(
153 std::string_view path,
154 const PathArgs& path_args,
155 const std::unordered_map<std::string, std::string>& query_args
156);
157
158/// @brief Make an URL with path parameters and query arguments, supporting multiple values for the same key
159/// @param path Template string with placeholders in format {name}
160/// @param path_args Map of placeholder names to their values
161/// @param query_args Map of query parameters
162/// @param query_multiargs Multimap for query parameters that can have multiple values
163/// @returns Formatted URL or std::nullopt if path formatting fails
164/// @code
165/// http::MultiArgs multi_args = {{"tag", "new"}, {"tag", "featured"}};
166/// auto url = MakeUrlWithPathArgs("/api/v1/products/{category}",
167/// {{"category", "electronics"}},
168/// http::Args{{"sort", "price"}},
169/// multi_args);
170/// // Returns: "/api/v1/products/electronics?sort=price&tag=new&tag=featured"
171/// @endcode
172std::optional<std::string> MakeUrlWithPathArgs(
173 std::string_view path,
174 const PathArgs& path_args,
175 const Args& query_args,
176 MultiArgs query_multiargs
177);
178
179/// @brief Make an URL with path parameters and query arguments
180/// @param path Template string with placeholders in format {name}
181/// @param path_args Map of placeholder names to their values
182/// @param query_args Initializer list of query parameters as key-value pairs
183/// @returns Formatted URL or std::nullopt if path formatting fails
184/// @code
185/// auto url = MakeUrlWithPathArgs("/api/v1/search/{term}",
186/// {{"term", "laptop"}},
187/// {{"brand", "apple"}, {"price_max", "2000"}});
188/// // Returns: "/api/v1/search/laptop?brand=apple&price_max=2000"
189/// @endcode
190std::optional<std::string> MakeUrlWithPathArgs(
191 std::string_view path,
192 const PathArgs& path_args,
193 std::initializer_list<std::pair<std::string_view, std::string_view>> query_args
194);
195
196/// @brief Returns URL part before the first '?' character
197/// @param url Full URL to extract from
198/// @returns URL without query string
199/// @code
200/// auto base = ExtractMetaTypeFromUrl("https://example.com/api/users?page=1&sort=name");
201/// // Returns: "https://example.com/api/users"
202/// @endcode
203std::string ExtractMetaTypeFromUrl(const std::string& url);
204
205/// @brief Returns HTTP path part of a URL
206/// @param url Full URL to extract from
207/// @returns Path component of the URL
208/// @code
209/// auto path = ExtractPath("https://example.com/api/users");
210/// // Returns: "/api/users"
211/// auto path2 = ExtractPath("example.com/api/users");
212/// // Returns: "/api/users"
213/// @endcode
214std::string ExtractPath(std::string_view url);
215
216/// @brief Returns hostname part of a URL
217/// @param url Full URL to extract from
218/// @returns Hostname component of the URL
219/// @code
220/// auto host = ExtractHostname("https://example.com/api/users");
221/// // Returns: "example.com"
222/// auto host2 = ExtractHostname("https://user:pass@example.com:8080/api");
223/// // Returns: "example.com"
224/// auto host3 = ExtractHostname("http://[::1]:8080/");
225/// // Returns: "[::1]"
226/// @endcode
227std::string ExtractHostname(std::string_view url);
228
229namespace impl {
230
231std::string UrlDecode(utils::impl::InternalTag, std::string_view range);
232
233} // namespace impl
234
235} // namespace http
236
237USERVER_NAMESPACE_END