4#ifndef _Stroika_Foundation_IO_Network_UniformResourceIdentification_h_
5#define _Stroika_Foundation_IO_Network_UniformResourceIdentification_h_ 1
7#include "Stroika/Foundation/StroikaPreComp.h"
14#include "Stroika/Foundation/Common/Common.h"
16#include "Stroika/Foundation/Containers/Mapping.h"
36namespace Stroika::Foundation::IO::Network::UniformResourceIdentification {
38 using Characters::String;
143 template <Characters::IConvertibleToString STRINGISH_T>
160 nonvirtual
void Validate ()
const;
172 nonvirtual strong_ordering operator<=> (
const SchemeType& rhs)
const;
177 nonvirtual
bool operator== (
const SchemeType& rhs)
const;
183 nonvirtual optional<PortType> GetDefaultPort ()
const;
203 static constexpr auto eDecoded = StringPCTEncodedFlag::eDecoded;
204 static constexpr auto ePCTEncoded = StringPCTEncodedFlag::ePCTEncoded;
227 nonvirtual
Host& operator= (
const Host&) =
default;
228 nonvirtual
Host& operator= (
Host&&)
noexcept =
default;
251 nonvirtual optional<String> AsRegisteredName ()
const;
279 template <
typename RESULT_TYPE = String>
280 nonvirtual RESULT_TYPE
As (optional<StringPCTEncodedFlag> pctEncode = {})
const
281 requires (same_as<RESULT_TYPE, String> or same_as<RESULT_TYPE, string>);
286 nonvirtual strong_ordering operator<=> (
const Host& rhs)
const;
291 nonvirtual
bool operator== (
const Host& rhs)
const;
294 static strong_ordering TWC_ (
const Host& lhs,
const Host& rhs);
304 [[deprecated (
"Since Stroika v3.0d5 - use As<String>(StringPCTEncodedFlag::eDecoded)")]]
String AsDecoded ()
const
306 return As<String> (StringPCTEncodedFlag::eDecoded);
308 template <
typename RESULT_TYPE = String>
309 [[deprecated (
"Since Stroika v3.0d5 - use As<String>(StringPCTEncodedFlag::ePCTEncoded)")]] RESULT_TYPE AsEncoded ()
const
311 return As<RESULT_TYPE> (StringPCTEncodedFlag::ePCTEncoded);
316 static pair<optional<String>, optional<InternetAddress>> ParseRaw_ (
const String& raw);
319 static String EncodeAsRawURL_ (
const String& registeredName);
320 static String EncodeAsRawURL_ (
const InternetAddress& ipAddr);
323 String fEncodedName_;
324 optional<String> fRegisteredName_;
325 optional<InternetAddress> fInternetAddress_;
346 static constexpr auto eDecoded = StringPCTEncodedFlag::eDecoded;
347 static constexpr auto ePCTEncoded = StringPCTEncodedFlag::ePCTEncoded;
390 template <
typename RESULT_TYPE = String>
391 nonvirtual RESULT_TYPE
As (optional<StringPCTEncodedFlag> pctEncoded = {})
const
392 requires (same_as<RESULT_TYPE, String> or same_as<RESULT_TYPE, string>);
397 nonvirtual strong_ordering operator<=> (
const UserInfo& rhs)
const;
402 nonvirtual
bool operator== (
const UserInfo& rhs)
const;
415 [[deprecated (
"Since Stroika v3.0d5 - use As<String>(StringPCTEncodedFlag::eDecoded)")]]
String AsDecoded ()
const
417 return As<String> (StringPCTEncodedFlag::eDecoded);
419 template <
typename RESULT_TYPE = String>
420 [[deprecated (
"Since Stroika v3.0d5 - use As<String>(StringPCTEncodedFlag::ePCTEncoded)")]] RESULT_TYPE AsEncoded ()
const
422 return As<RESULT_TYPE> (StringPCTEncodedFlag::ePCTEncoded);
427 static String ParseRaw_ (
const String& raw);
430 static String EncodeAsRawURL_ (
const String& decodedName);
433 String fEncodedUserInfo_;
438 String UserInfo::AsEncoded ()
const;
440 string UserInfo::AsEncoded ()
const;
452 static constexpr auto eDecoded = StringPCTEncodedFlag::eDecoded;
453 static constexpr auto ePCTEncoded = StringPCTEncodedFlag::ePCTEncoded;
461 Authority (
const optional<Host>& h = nullopt,
const optional<PortType>& port = nullopt,
const optional<UserInfo>& userInfo = nullopt);
479 static optional<Authority>
Parse (
const String& rawURLAuthorityText);
495 template <
typename T>
496 nonvirtual T
As (optional<StringPCTEncodedFlag> pctEncode = {})
const;
504 nonvirtual optional<Host>
GetHost ()
const;
509 nonvirtual
void SetHost (
const optional<Host>& host);
514 nonvirtual optional<PortType> GetPort ()
const;
519 nonvirtual
void SetPort (
const optional<PortType>& port);
530 nonvirtual optional<UserInfo>
GetUserInfo ()
const;
536 nonvirtual
void SetUserInfo (
const optional<UserInfo>& userInfo);
541 nonvirtual strong_ordering operator<=> (
const Authority& rhs)
const;
546 nonvirtual
bool operator== (
const Authority& rhs)
const;
559 optional<Host> fHost_;
560 optional<PortType> fPort_;
561 optional<UserInfo> fUserInfo_;
584 Query (
const u8string& query);
590 nonvirtual
Query& operator= (
const Query&) =
default;
591 nonvirtual
Query& operator= (
Query&&) =
default;
597 nonvirtual
String operator() (
const u8string& idx)
const;
601 nonvirtual
bool HasField (
const u8string& idx)
const;
602 nonvirtual
bool HasField (
const String& idx)
const;
608 nonvirtual optional<String>
Lookup (
const String& idx)
const;
611 nonvirtual
void AddField (
const String& idx,
const String& value);
614 nonvirtual
void RemoveFieldIfAny (
const u8string& idx);
615 nonvirtual
void RemoveFieldIfAny (
const String& idx);
620 nonvirtual
String ComputeQueryString ()
const;
625 nonvirtual strong_ordering operator<=> (
const Query& rhs)
const;
630 nonvirtual
bool operator== (
const Query& rhs)
const;
633 static strong_ordering TWC_ (
const Query& lhs,
const Query& rhs);
650 u8string EncodeURLQueryStringField (
const String& s);
665 bool allowSubDelims =
false;
666 bool allowGenDelims =
false;
667 bool allowPChar =
false;
668 bool allowFragOrQueryChars =
false;
669 bool allowPathCharacters =
false;
679 String PCTDecode2String (
const u8string& s);
697#include "UniformResourceIdentification.inl"
String is like std::u32string, except it is much easier to use, often much more space efficient,...