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 
20 class HttpRequestMethod;
21 
22 namespace AnyP
23 {
24 
31 class Uri
32 {
34 
35 public:
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 
156 private:
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_;
201  mutable SBuf absolutePath_;
202 };
203 
204 inline std::ostream &
205 operator <<(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 
225 class HttpRequest;
226 
227 void urlInitialize(void);
232 const char *urlCanonicalFakeHttps(const HttpRequest * request);
233 bool urlIsRelative(const char *);
234 char *urlRInternal(const char *host, unsigned short port, const char *dir, const char *name);
235 char *urlInternal(const char *dir, const char *name);
236 bool urlAppendDomain(char *host);
237 
239  mdnNone = 0,
242 };
243 
277 int matchDomainName(const char *host, const char *domain, MatchDomainNameFlags flags = mdnNone);
278 bool urlCheckRequest(const HttpRequest *);
279 void urlExtMethodConfigure(void);
280 
281 #endif /* SQUID_SRC_ANYP_URI_H */
282 
static char * cleanup(const char *uri)
Definition: Uri.cc:1088
bool hostIsNumeric_
whether the authority 'host' is a raw-IP
Definition: Uri.h:189
@ mdnNone
Definition: Uri.h:239
bool urlAppendDomain(char *host)
apply append_domain config to the given hostname
Definition: Uri.cc:297
void userInfo(const SBuf &s)
Definition: Uri.h:70
AnyP::Uri url
the request URI
Definition: HttpRequest.h:115
Definition: Uri.h:31
char host_[SQUIDHOSTNAMELEN]
string representation of the URI authority name or IP
Definition: Uri.h:188
@ mdnHonorWildcards
Definition: Uri.h:240
RequestFlags flags
Definition: HttpRequest.h:141
@ PROTO_NONE
Definition: ProtocolType.h:24
SBuf hostOrIp() const
Definition: Uri.cc:170
bool parse(const HttpRequestMethod &, const SBuf &url)
Definition: Uri.cc:326
std::ostream & operator<<(std::ostream &, const Host &)
Definition: Host.cc:80
Definition: SBuf.h:93
void defaultPort()
reset the port to the default port number for the current scheme
Definition: Uri.h:94
SBuf authorityWithPort_
RFC 7230 section 5.3.3 authority with explicit port.
Definition: Uri.h:199
const char * urlCanonicalFakeHttps(const HttpRequest *request)
Definition: Uri.cc:831
static int port
Definition: ldap_backend.cc:70
void urlInitialize(void)
Definition: Uri.cc:212
void urlExtMethodConfigure(void)
char * urlCanonicalCleanWithoutRequest(const SBuf &url, const HttpRequestMethod &, const AnyP::UriScheme &)
Definition: Uri.cc:802
void setScheme(const AnyP::UriScheme &s)
Definition: Uri.h:65
Port port() const
authority port subcomponent
Definition: Uri.h:92
@ PROTO_URN
Definition: ProtocolType.h:35
bool urlCheckRequest(const HttpRequest *)
Definition: Uri.cc:1014
ProtocolType
Definition: ProtocolType.h:23
Uri & operator=(const Uri &)=default
AnyP::UriScheme scheme_
Definition: Uri.h:182
void path(const SBuf &p)
Definition: Uri.h:97
void clear()
Definition: Uri.h:43
bool urlIsRelative(const char *)
Definition: Uri.cc:858
int parsePort(Parser::Tokenizer &) const
Definition: Uri.cc:702
Definition: forward.h:14
const SBuf & userInfo() const
Definition: Uri.h:73
MatchDomainNameFlags
Definition: Uri.h:238
std::optional< Host > parsedHost() const
Definition: Uri.cc:181
static std::optional< SBuf > Decode(const SBuf &)
Definition: Uri.cc:105
void parseUrn(Parser::Tokenizer &)
Definition: Uri.cc:601
char * urlInternal(const char *dir, const char *name)
SBuf image() const
Definition: UriScheme.h:57
SBuf path_
URI path segment.
Definition: Uri.h:195
SBuf absolute_
RFC 7230 section 5.3.2 absolute-URI.
Definition: Uri.h:200
const AnyP::UriScheme & getScheme() const
Definition: Uri.h:58
void port(const Port p)
reset authority port subcomponent
Definition: Uri.h:90
SBuf absolutePath_
RFC 3986 section 4.2 absolute-path.
Definition: Uri.h:201
SBuf & authority(bool requirePort=false) const
Definition: Uri.cc:733
char * urlRInternal(const char *host, unsigned short port, const char *dir, const char *name)
int matchDomainName(const char *host, const char *domain, MatchDomainNameFlags flags=mdnNone)
Definition: Uri.cc:915
void setEmpty()
Fast reset of the stored content to what would be after default constructor.
Definition: Address.cc:204
void addRelativePath(const char *relUrl)
Definition: Uri.cc:891
Port port_
authority port subcomponent
Definition: Uri.h:192
MEMPROXY_CLASS(Uri)
SBuf authorityHttp_
RFC 7230 section 5.3.3 authority, maybe without default-port.
Definition: Uri.h:198
static const SBuf & SlashPath()
the static '/' default URL-path
Definition: Uri.cc:147
SBuf & absolute() const
Definition: Uri.cc:755
void path(const char *p)
Definition: Uri.h:96
@ mdnRejectSubsubDomains
Definition: Uri.h:241
const Ip::Address & hostIP(void) const
Definition: Uri.h:78
SBuf userInfo_
Definition: Uri.h:184
std::optional< KnownPort > Port
validated/supported port number (if any)
Definition: UriScheme.h:26
Uri()
Definition: Uri.h:36
SBuf & absolutePath() const
RFC 3986 section 4.2 relative reference called 'absolute-path'.
Definition: Uri.cc:787
int hostIsNumeric(void) const
Definition: Uri.h:77
optimized set of C chars, with quick membership test and merge support
Definition: CharacterSet.h:17
static SBuf DecodeOrDupe(const SBuf &input)
Definition: Uri.cc:132
const SBuf & path() const
Definition: Uri.cc:200
void setScheme(const AnyP::ProtocolType &p, const char *str)
convert the URL scheme to that given
Definition: Uri.h:61
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
Ip::Address hostAddr_
binary representation of the URI authority if it is a raw-IP
Definition: Uri.h:190
static const SBuf & Asterisk()
the static '*' pseudo-URI
Definition: Uri.cc:140
static SBuf Encode(const SBuf &, const CharacterSet &expected)
Definition: Uri.cc:76
SBuf parseHost(Parser::Tokenizer &) const
Definition: Uri.cc:632
#define SQUIDHOSTNAMELEN
Definition: rfc2181.h:30
void touch()
clear the cached URI display forms
Definition: Uri.cc:724

 

Introduction

Documentation

Support

Miscellaneous