libfilezilla
Loading...
Searching...
No Matches
uri.hpp
Go to the documentation of this file.
1#ifndef LIBFILEZILLA_URI_HEADER
2#define LIBFILEZILLA_URI_HEADER
3
4#include "libfilezilla.hpp"
5
6#include <initializer_list>
7#include <map>
8#include <string>
9
13
14namespace fz {
15
17{
18 normal,
19
22};
23
29class FZ_PUBLIC_SYMBOL uri final
30{
31public:
32 uri() noexcept = default;
33 explicit uri(std::string_view const& in, uri_parsing_flags flags = {});
34
35 void clear();
36
43 bool parse(std::string_view in, uri_parsing_flags flags = {});
44
51 std::string to_string(bool with_query = true) const;
52
54 std::string get_request(bool with_query = true) const;
55
58 std::string get_authority(bool with_userinfo) const;
59
60 bool empty() const;
61 explicit operator bool() const { return !empty(); }
62
64 std::string scheme_;
65
67 std::string user_;
68
70 std::string pass_;
71
73 std::string host_;
74
76 unsigned short port_{};
77
79 std::string path_;
80
88 std::string query_;
89
95 std::string fragment_;
96
98 bool is_absolute() const { return path_[0] == '/'; }
99
105 void resolve(uri const& base);
106
107 bool operator==(uri const& arg) const;
108
109 bool operator!=(uri const& arg) const { return !(*this == arg); }
110
111private:
112 bool FZ_PRIVATE_SYMBOL parse_authority(std::string_view authority);
113};
114
120class FZ_PUBLIC_SYMBOL query_string final
121{
122public:
123 explicit query_string() = default;
124 explicit query_string(std::string_view const& raw, bool plus_is_space = false);
125 explicit query_string(std::pair<std::string, std::string> const& segment);
126 explicit query_string(std::initializer_list<std::pair<std::string, std::string>> const& segments);
127 bool set(std::string_view const& raw, bool plus_is_space = false);
128
129 std::string to_string(bool encode_slashes) const;
130
131 void remove(std::string const& key);
132 std::string& operator[](std::string const& key);
133
134 std::map<std::string, std::string, less_insensitive_ascii> const& pairs() const { return segments_; }
135
136 bool empty() const { return segments_.empty(); }
137
138private:
139 std::map<std::string, std::string, less_insensitive_ascii> segments_;
140};
141
142}
143
144#endif
std::string get_authority(bool with_userinfo) const
Returns [user[:pass]]host[:port] Keeps valid bracketed IPv6 literals unchanged; percent-encodes other...
std::string user_
Optional user part of the authority.
Definition uri.hpp:67
std::string query_
The part of a URI after ? but before #.
Definition uri.hpp:88
std::string get_request(bool with_query=true) const
Returns path and query, separated by question mark.
std::string pass_
Optional password part of the authority.
Definition uri.hpp:70
std::string to_string(bool with_query=true) const
Assembles components into string.
std::string scheme_
Often referred to as the protocol prefix, e.g. ftp://.
Definition uri.hpp:64
std::string path_
Optional path, must start with a slash if set.
Definition uri.hpp:79
std::string fragment_
The part of a URI after #.
Definition uri.hpp:95
unsigned short port_
Optional Port if non-zero.
Definition uri.hpp:76
void resolve(uri const &base)
Resolve a relative URI reference into an absolute URI given a base URL.
bool is_absolute() const
Checks that the URI is absolute, that is the path starting with a slash.
Definition uri.hpp:98
bool parse(std::string_view in, uri_parsing_flags flags={})
Splits uri into components.
std::string host_
Hostname, or IP address literal.
Definition uri.hpp:73
Sets some global macros and further includes string.hpp.
The namespace used by libfilezilla.
Definition apply.hpp:17
uri_parsing_flags
Definition uri.hpp:17
@ assume_authority
If parsing a schemeless URI, assume it has an authority, otherwise it's all seen as path.
Definition uri.hpp:21