Squid Web Cache master
Loading...
Searching...
No Matches
Uri.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 1996-2025 The Squid Software Foundation and contributors
3 *
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
7 */
8
9#ifndef SQUID_SRC_ANYP_URI_H
10#define SQUID_SRC_ANYP_URI_H
11
12#include "anyp/forward.h"
13#include "anyp/UriScheme.h"
14#include "ip/Address.h"
15#include "rfc2181.h"
16#include "sbuf/SBuf.h"
17
18#include <iosfwd>
19
21
22namespace AnyP
23{
24
31class Uri
32{
34
35public:
36 Uri(): hostIsNumeric_(false) { *host_ = 0; }
37 Uri(AnyP::UriScheme const &aScheme);
38 Uri(const Uri &) = default;
39 Uri(Uri &&) = default;
40 Uri &operator =(const Uri &) = default;
41 Uri &operator =(Uri &&) = default;
42
43 void clear() {
45 hostIsNumeric_ = false;
46 *host_ = 0;
48 port_ = std::nullopt;
49 touch();
50 }
51 void touch();
52
53 bool parse(const HttpRequestMethod &, const SBuf &url);
54
56 static char *cleanup(const char *uri);
57
58 AnyP::UriScheme const & getScheme() const {return scheme_;}
59
61 void setScheme(const AnyP::ProtocolType &p, const char *str) {
62 scheme_ = AnyP::UriScheme(p, str);
63 touch();
64 }
65 void setScheme(const AnyP::UriScheme &s) {
66 scheme_ = s;
67 touch();
68 }
69
70 void userInfo(const SBuf &s) {userInfo_=s; touch();}
73 const SBuf &userInfo() const {return userInfo_;}
74
75 void host(const char *src);
76 const char *host(void) const {return host_;}
77 int hostIsNumeric(void) const {return hostIsNumeric_;}
78 Ip::Address const & hostIP(void) const {return hostAddr_;}
79
82 std::optional<Host> parsedHost() const;
83
87 SBuf hostOrIp() const;
88
90 void port(const Port p) { port_ = p; touch(); }
92 Port port() const { return port_; }
95
96 void path(const char *p) {path_=p; touch();}
97 void path(const SBuf &p) {path_=p; touch();}
98 const SBuf &path() const;
99
106 void addRelativePath(const char *relUrl);
107
109 static const SBuf &SlashPath();
110
112 static const SBuf &Asterisk();
113
116 static SBuf Encode(const SBuf &, const CharacterSet &expected);
117
121 static std::optional<SBuf> Decode(const SBuf &);
122
127 static SBuf DecodeOrDupe(const SBuf &input);
128
139 SBuf &authority(bool requirePort = false) const;
140
148 SBuf &absolute() const;
149
151 SBuf &absolutePath() const;
152
154 SBuf &originForm() const { return absolutePath(); }
155
156private:
158
160 int parsePort(Parser::Tokenizer &) const;
161
183
184 SBuf userInfo_; // aka 'URL-login'
185
186 // XXX: uses char[] instead of SBUf to reduce performance regressions
187 // from c_str() since most code using this is not yet using SBuf
191
193
194 // XXX: for now includes query-string.
196
197 // pre-assembled URI forms
200 mutable SBuf absolute_;
202};
203
204inline std::ostream &
205operator <<(std::ostream &os, const Uri &url)
206{
207 // none means explicit empty string for scheme.
208 if (url.getScheme() != PROTO_NONE)
209 os << url.getScheme().image();
210 os << ":";
211
212 // no authority section on URN
213 if (url.getScheme() != PROTO_URN)
214 os << "//" << url.authority();
215
216 // path is what it is - including absent
217 os << url.absolutePath();
218 return os;
219}
220
221} // namespace AnyP
222
223/* Deprecated functions for Legacy code handling URLs */
224
225class HttpRequest;
226
227void urlInitialize(void);
232const char *urlCanonicalFakeHttps(const HttpRequest * request);
233bool urlIsRelative(const char *);
234char *urlRInternal(const char *host, unsigned short port, const char *dir, const char *name);
235char *urlInternal(const char *dir, const char *name);
236bool urlAppendDomain(char *host);
237
243
277int matchDomainName(const char *host, const char *domain, MatchDomainNameFlags flags = mdnNone);
278bool urlCheckRequest(const HttpRequest *);
280
281#endif /* SQUID_SRC_ANYP_URI_H */
282
char * urlRInternal(const char *host, unsigned short port, const char *dir, const char *name)
bool urlIsRelative(const char *)
Definition Uri.cc:846
MatchDomainNameFlags
Definition Uri.h:238
@ mdnNone
Definition Uri.h:239
@ mdnRejectSubsubDomains
Definition Uri.h:241
@ mdnHonorWildcards
Definition Uri.h:240
void urlInitialize(void)
Definition Uri.cc:212
char * urlInternal(const char *dir, const char *name)
int matchDomainName(const char *host, const char *domain, MatchDomainNameFlags flags=mdnNone)
Definition Uri.cc:903
const char * urlCanonicalFakeHttps(const HttpRequest *request)
Definition Uri.cc:819
bool urlCheckRequest(const HttpRequest *)
Definition Uri.cc:1002
bool urlAppendDomain(char *host)
apply append_domain config to the given hostname
Definition Uri.cc:297
char * urlCanonicalCleanWithoutRequest(const SBuf &url, const HttpRequestMethod &, const AnyP::UriScheme &)
Definition Uri.cc:790
void urlExtMethodConfigure(void)
SBuf image() const
Definition UriScheme.h:57
static const SBuf & SlashPath()
the static '/' default URL-path
Definition Uri.cc:147
Port port() const
authority port subcomponent
Definition Uri.h:92
Uri(Uri &&)=default
SBuf parseHost(Parser::Tokenizer &) const
Definition Uri.cc:632
void parseUrn(Parser::Tokenizer &)
Definition Uri.cc:601
AnyP::UriScheme const & getScheme() const
Definition Uri.h:58
void touch()
clear the cached URI display forms
Definition Uri.cc:712
const SBuf & userInfo() const
Definition Uri.h:73
void clear()
Definition Uri.h:43
SBuf & authority(bool requirePort=false) const
Definition Uri.cc:721
static SBuf DecodeOrDupe(const SBuf &input)
Definition Uri.cc:132
SBuf authorityHttp_
RFC 7230 section 5.3.3 authority, maybe without default-port.
Definition Uri.h:198
void setScheme(const AnyP::ProtocolType &p, const char *str)
convert the URL scheme to that given
Definition Uri.h:61
void path(const char *p)
Definition Uri.h:96
Ip::Address hostAddr_
binary representation of the URI authority if it is a raw-IP
Definition Uri.h:190
char host_[SQUIDHOSTNAMELEN]
string representation of the URI authority name or IP
Definition Uri.h:188
SBuf userInfo_
Definition Uri.h:184
const char * host(void) const
Definition Uri.h:76
SBuf & originForm() const
The RFC 7230 origin-form URI for currently stored values.
Definition Uri.h:154
SBuf & absolutePath() const
RFC 3986 section 4.2 relative reference called 'absolute-path'.
Definition Uri.cc:775
Uri()
Definition Uri.h:36
static std::optional< SBuf > Decode(const SBuf &)
Definition Uri.cc:105
SBuf path_
URI path segment.
Definition Uri.h:195
bool hostIsNumeric_
whether the authority 'host' is a raw-IP
Definition Uri.h:189
std::optional< Host > parsedHost() const
Definition Uri.cc:181
void defaultPort()
reset the port to the default port number for the current scheme
Definition Uri.h:94
MEMPROXY_CLASS(Uri)
SBuf absolutePath_
RFC 3986 section 4.2 absolute-path.
Definition Uri.h:201
SBuf authorityWithPort_
RFC 7230 section 5.3.3 authority with explicit port.
Definition Uri.h:199
static char * cleanup(const char *uri)
Definition Uri.cc:1076
void addRelativePath(const char *relUrl)
Definition Uri.cc:879
void path(const SBuf &p)
Definition Uri.h:97
Port port_
authority port subcomponent
Definition Uri.h:192
void setScheme(const AnyP::UriScheme &s)
Definition Uri.h:65
int parsePort(Parser::Tokenizer &) const
Definition Uri.cc:690
SBuf & absolute() const
Definition Uri.cc:743
static const SBuf & Asterisk()
the static '*' pseudo-URI
Definition Uri.cc:140
void port(const Port p)
reset authority port subcomponent
Definition Uri.h:90
const SBuf & path() const
Definition Uri.cc:200
Uri(const Uri &)=default
bool parse(const HttpRequestMethod &, const SBuf &url)
Definition Uri.cc:326
SBuf absolute_
RFC 7230 section 5.3.2 absolute-URI.
Definition Uri.h:200
Ip::Address const & hostIP(void) const
Definition Uri.h:78
AnyP::UriScheme scheme_
Definition Uri.h:182
int hostIsNumeric(void) const
Definition Uri.h:77
Uri & operator=(const Uri &)=default
SBuf hostOrIp() const
Definition Uri.cc:170
static SBuf Encode(const SBuf &, const CharacterSet &expected)
Definition Uri.cc:76
void userInfo(const SBuf &s)
Definition Uri.h:70
optimized set of C chars, with quick membership test and merge support
RequestFlags flags
AnyP::Uri url
the request URI
void setEmpty()
Fast reset of the stored content to what would be after default constructor.
Definition Address.cc:204
Definition SBuf.h:94
static int port
Definition forward.h:15
std::optional< KnownPort > Port
validated/supported port number (if any)
Definition UriScheme.h:26
std::ostream & operator<<(std::ostream &, const Host &)
Definition Host.cc:80
@ PROTO_NONE
@ PROTO_URN
#define SQUIDHOSTNAMELEN
Definition rfc2181.h:30