11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
21PROMEKI_NAMESPACE_BEGIN
75 PROMEKI_DATATYPE(Url, DataTypeUrl, 1)
78 Error writeToStream(DataStream &s) const;
80 template <uint32_t V> static Result<Url> readFromStream(DataStream &s);
83 static constexpr
int PortUnset = -1;
100 static Result<Url> fromString(const String &s);
116 static String percentEncode(const String &s, const
char *safe =
nullptr);
125 static String percentDecode(const String &s, Error *err =
nullptr);
140 explicit Url(const String &s) : Url(fromString(s).first()) {}
143 explicit Url(
const char *s) : Url(fromString(String(s)).first()) {}
151 bool isValid()
const {
return !_scheme.isEmpty(); }
154 const String &scheme()
const {
return _scheme; }
157 const String &userInfo()
const {
return _userInfo; }
165 const String &host()
const {
return _host; }
170 int port()
const {
return _port; }
173 const String &path()
const {
return _path; }
184 const Map<String, String> &query()
const {
return _query; }
195 String queryValue(
const String &key,
const String &defaultValue = String())
const {
196 return _query.value(key, defaultValue);
204 bool hasQueryValue(
const String &key)
const {
return _query.contains(key); }
207 const String &fragment()
const {
return _fragment; }
218 bool hasAuthority()
const {
return _hasAuthority; }
221 Url &setScheme(
const String &s);
224 Url &setUserInfo(
const String &s) {
235 Url &setHost(
const String &s);
238 Url &setPort(
int p) {
244 Url &setPath(
const String &s) {
250 Url &setQuery(
const Map<String, String> &q) {
257 Url &setQueryValue(
const String &key,
const String &value) {
258 _query.insert(key, value);
264 Url &removeQueryValue(
const String &key) {
291 const String &rawQuery()
const {
return _rawQuery; }
304 Url &setRawQuery(
const String &q) {
310 Url &setFragment(
const String &s) {
324 Url &setHasAuthority(
bool v) {
337 String toString()
const;
358 String redactedString()
const;
393 String briefForLog()
const;
396 bool operator==(
const Url &other)
const;
399 bool operator!=(
const Url &other)
const {
return !(*
this == other); }
405 int _port = PortUnset;
407 Map<String, String> _query;
410 bool _hasAuthority =
false;
415PROMEKI_FORMAT_VIA_TOSTRING(promeki::Url);