12 inline URI::URI (
const optional<SchemeType>& scheme,
const optional<Authority>& authority,
const String& path,
13 const optional<String>& query,
const optional<String>& fragment)
15 , fAuthority_{authority}
18 , fFragment_{fragment}
24 CheckValidPathForAuthority_ (authority, path);
26 template <Characters::IConvertibleToString STRISH_TYPE>
27 inline URI::URI (STRISH_TYPE&& encodedURI)
28 : URI{Parse (forward<STRISH_TYPE> (encodedURI))}
31 inline bool URI::IsRelativeReference ()
const
34 return fScheme_.has_value ();
36 inline optional<URI::SchemeType> URI::GetScheme ()
const
41 inline void URI::SetScheme (
const optional<SchemeType>& scheme)
49 inline void URI::SetScheme (
const SchemeType& scheme)
55 inline optional<URI::Authority> URI::GetAuthority ()
const
60 inline void URI::SetAuthority (
const optional<Authority>& authority)
63 CheckValidPathForAuthority_ (authority, fPath_);
64 fAuthority_ = authority;
66 inline PortType URI::GetPortValue ()
const
69 optional<PortType> op = fAuthority_ ? fAuthority_->GetPort () : optional<PortType>{};
73 static constexpr PortType kDefault_{0};
75 return fScheme_->GetDefaultPort ().value_or (kDefault_);
79 inline String URI::GetPath ()
const
84 inline void URI::SetPath (
const String& path)
87 CheckValidPathForAuthority_ (fAuthority_, path);
90 inline URI URI::GetSchemeAndAuthority ()
const
92 return URI{GetScheme (), GetAuthority ()};
94 template <Common::IAnyOf<String,
string, URI> RETURN_TYPE>
95 RETURN_TYPE URI::GetAuthorityRelativeResource ()
const
98 if constexpr (same_as<RETURN_TYPE, String>) {
99 static constexpr UniformResourceIdentification::PCTEncodeOptions kPathEncodeOptions_{
100 .allowSubDelims =
false, .allowGenDelims =
false, .allowPChar =
true, .allowFragOrQueryChars =
false, .allowPathCharacters =
true};
103 static constexpr UniformResourceIdentification::PCTEncodeOptions kQueryEncodeOptions_{
104 .allowSubDelims =
false, .allowGenDelims =
false, .allowPChar =
false, .allowFragOrQueryChars =
true};
105 result <<
"?"sv << UniformResourceIdentification::PCTEncode2String (*fQuery_, kQueryEncodeOptions_);
107 return result.
str ();
109 if constexpr (same_as<RETURN_TYPE, string>) {
110 return GetAuthorityRelativeResource<String> ().
AsASCII ();
112 if constexpr (same_as<RETURN_TYPE, URI>) {
113 return URI{nullopt, nullopt, GetPath (), GetQuery<String> ()};
116 template <Common::IAnyOf<String, optional<String>> RETURN_VALUE>
117 RETURN_VALUE URI::GetAbsPath ()
const
119 Debug::AssertExternallySynchronizedMutex::ReadContext declareContext{fThisAssertExternallySynchronized_};
120 if constexpr (same_as<RETURN_VALUE, String>) {
121 if (
auto op = GetAbsPath<optional<String>> ()) {
124 static const auto kException_ = Execution::RuntimeErrorException{
"This URI does not have an absolute path"sv};
125 Execution::Throw (kException_);
127 if constexpr (same_as<RETURN_VALUE, optional<String>>) {
128 if (fPath_.empty ()) {
131 if (fPath_.StartsWith (
"/"sv)) {
137 template <Common::IAnyOf<String, URI::Query> RETURN_TYPE>
138 inline optional<RETURN_TYPE> URI::GetQuery ()
const
140 Debug::AssertExternallySynchronizedMutex::ReadContext declareContext{fThisAssertExternallySynchronized_};
141 if constexpr (same_as<RETURN_TYPE, String>) {
144 if constexpr (same_as<RETURN_TYPE, Query>) {
146 return Query{*fQuery_};
151 inline void URI::SetQuery (
const optional<String>& query)
153 Debug::AssertExternallySynchronizedMutex::WriteContext declareContext{fThisAssertExternallySynchronized_};
156 inline void URI::SetQuery (
const optional<Query>& query)
158 Debug::AssertExternallySynchronizedMutex::WriteContext declareContext{fThisAssertExternallySynchronized_};
159 fQuery_ = query ? query->ComputeQueryString () : optional<String>{};
161 inline optional<String> URI::LookupQueryArg (
const String& arg)
const
169 inline optional<String> URI::GetFragment ()
const
174 inline void URI::SetFragment (
const optional<String>& fragment)
177 fFragment_ = fragment;
179 inline strong_ordering URI::operator<=> (
const URI& rhs)
const
181 return URI::TWC_ (*
this, rhs);
183 inline bool URI::operator== (
const URI& rhs)
const
185 return URI::TWC_ (*
this, rhs) == 0;
187 template <Common::IAnyOf<String,
string> T>
188 inline T URI::As (optional<StringPCTEncodedFlag> pctEncode)
const
190 if constexpr (same_as<T, String>) {
191 return AsString_ (pctEncode);
193 if constexpr (same_as<T, string>) {
194 return AsString_ (pctEncode).AsASCII ();
202 constexpr EnumNames<IO::Network::URI::NormalizationStyle> DefaultNames<IO::Network::URI::NormalizationStyle>::k{{{
203 {IO::Network::URI::NormalizationStyle::eRFC3986, L
"RFC3986"},
Similar to String, but intended to more efficiently construct a String. Mutable type (String is large...
nonvirtual String str() const
String is like std::u32string, except it is much easier to use, often much more space efficient,...
nonvirtual T AsASCII() const
shared_lock< const AssertExternallySynchronizedMutex > ReadContext
Instantiate AssertExternallySynchronizedMutex::ReadContext to designate an area of code where protect...
unique_lock< AssertExternallySynchronizedMutex > WriteContext
Instantiate AssertExternallySynchronizedMutex::WriteContext to designate an area of code where protec...