]> git.ipfire.org Git - thirdparty/squid.git/blame - src/HttpRequest.h
Simplify appending SBuf to String (#2108)
[thirdparty/squid.git] / src / HttpRequest.h
CommitLineData
528b2c61 1/*
1f7b830e 2 * Copyright (C) 1996-2025 The Squid Software Foundation and contributors
528b2c61 3 *
bbc27441
AJ
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.
528b2c61 7 */
8
ff9d9458
FC
9#ifndef SQUID_SRC_HTTPREQUEST_H
10#define SQUID_SRC_HTTPREQUEST_H
528b2c61 11
c8ab5ec6 12#include "anyp/Uri.h"
582c2af2 13#include "base/CbcPointer.h"
4a3b98d7 14#include "dns/forward.h"
83b053a0 15#include "error/Error.h"
582c2af2 16#include "HierarchyLogEntry.h"
63df1d28 17#include "http/Message.h"
f35c0145 18#include "http/RequestMethod.h"
e16571ed 19#include "MasterXaction.h"
d06e17ea 20#include "Notes.h"
f206b652 21#include "RequestFlags.h"
582c2af2
FC
22
23#if USE_AUTH
24#include "auth/UserRequest.h"
25#endif
3ff65596
AR
26#if USE_ADAPTATION
27#include "adaptation/History.h"
28#endif
29#if ICAP_CLIENT
30#include "adaptation/icap/History.h"
31#endif
a98c2da5
AJ
32#if USE_SQUID_EUI
33#include "eui/Eui48.h"
34#include "eui/Eui64.h"
35#endif
582c2af2 36
cd4a5c60
CT
37class AccessLogEntry;
38typedef RefCount<AccessLogEntry> AccessLogEntryPointer;
f5e17947
CT
39class CachePeer;
40class ConnStateData;
41class Downloader;
a2ac85d9 42
924f73bc 43/* Http Request */
17802cf1 44void httpRequestPack(void *obj, Packable *p);
5cafad19 45
924f73bc 46class HttpHdrRange;
47
63df1d28 48class HttpRequest: public Http::Message
a2ac85d9 49{
741c2986 50 MEMPROXY_CLASS(HttpRequest);
a2ac85d9 51
52public:
b248c2a3 53 typedef RefCount<HttpRequest> Pointer;
f3630c67 54
e16571ed
AJ
55 HttpRequest(const MasterXaction::Pointer &);
56 HttpRequest(const HttpRequestMethod& aMethod, AnyP::ProtocolType aProtocol, const char *schemeImage, const char *aUrlpath, const MasterXaction::Pointer &);
337b9aa4
AR
57 ~HttpRequest() override;
58 void reset() override;
4a56ee8d 59
d31d59d8 60 void initHTTP(const HttpRequestMethod& aMethod, AnyP::ProtocolType aProtocol, const char *schemeImage, const char *aUrlpath);
75faaa7a 61
337b9aa4 62 HttpRequest *clone() const override;
fa0e6114 63
c2a7cefd
AJ
64 /// Whether response to this request is potentially cachable
65 /// \retval false Not cacheable.
66 /// \retval true Possibly cacheable. Response factors will determine.
67 bool maybeCacheable();
610ee341 68
79c8035e
AR
69 bool conditional() const; ///< has at least one recognized If-* header
70
655daa06
AR
71 /// whether the client is likely to be able to handle a 1xx reply
72 bool canHandle1xx() const;
73
bec110e4
EB
74 /// \returns a pointer to a local static buffer containing request URI
75 /// that honors strip_query_terms and %-encodes unsafe URI characters
76 char *canonicalCleanUrl() const;
77
3ff65596
AR
78#if USE_ADAPTATION
79 /// Returns possibly nil history, creating it if adapt. logging is enabled
a22e6cd3
AR
80 Adaptation::History::Pointer adaptLogHistory() const;
81 /// Returns possibly nil history, creating it if requested
82 Adaptation::History::Pointer adaptHistory(bool createIfNone = false) const;
aaf0559d
AR
83 /// Makes their history ours, throwing on conflicts
84 void adaptHistoryImport(const HttpRequest &them);
3ff65596
AR
85#endif
86#if ICAP_CLIENT
87 /// Returns possibly nil history, creating it if icap logging is enabled
88 Adaptation::Icap::History::Pointer icapHistory() const;
89#endif
90
f5e17947
CT
91 /* If a request goes through several destinations, then the following two
92 * methods will be called several times, in destinations-dependent order. */
93 /// get ready to be sent to the given cache_peer, including originserver
94 void prepForPeering(const CachePeer &peer);
95 /// get ready to be sent directly to an origin server, excluding originserver
96 void prepForDirect();
97
4a3b98d7 98 void recordLookup(const Dns::LookupDetails &detail);
3ff65596 99
64b66b76 100 /// sets error detail if no earlier detail was available
83b053a0 101 void detailError(const err_type c, const ErrorDetail::Pointer &d) { error.update(c, d); }
129fe2a1
CT
102 /// clear error details, useful for retries/repeats
103 void clearError();
64b66b76 104
cd4a5c60
CT
105 /// associates the request with a from-client connection manager
106 void manager(const CbcPointer<ConnStateData> &aMgr, const AccessLogEntryPointer &al);
107
5cafad19 108protected:
5cafad19 109 void clean();
5cafad19 110
4a56ee8d 111 void init();
a2ac85d9 112
5cafad19 113public:
60745f24 114 HttpRequestMethod method;
c8ab5ec6 115 AnyP::Uri url; ///< the request URI
4a56ee8d 116
cc192b50 117private:
3ff65596
AR
118#if USE_ADAPTATION
119 mutable Adaptation::History::Pointer adaptHistory_; ///< per-HTTP transaction info
120#endif
121#if ICAP_CLIENT
122 mutable Adaptation::Icap::History::Pointer icapHistory_; ///< per-HTTP transaction info
123#endif
124
cc192b50 125public:
2f1431ea 126#if USE_AUTH
c7baff40 127 Auth::UserRequest::Pointer auth_user_request;
2f1431ea 128#endif
4a56ee8d 129
851feda6
AJ
130 /// RFC 7230 section 5.5 - Effective Request URI
131 const SBuf &effectiveRequestUri() const;
4a56ee8d 132
a8a0b1c2
EC
133 /**
134 * If defined, store_id_program mapped the request URL to this ID.
135 * Store uses this ID (and not the URL) to find and store entries,
136 * avoiding caching duplicate entries when different URLs point to
137 * "essentially the same" cachable resource.
138 */
139 String store_id;
140
f206b652 141 RequestFlags flags;
4a56ee8d 142
a2ac85d9 143 HttpHdrRange *range;
4a56ee8d 144
a2ac85d9 145 time_t ims;
4a56ee8d 146
a2ac85d9 147 int imslen;
4a56ee8d 148
b7ac5457 149 Ip::Address client_addr;
4a56ee8d 150
33b24cf0 151#if FOLLOW_X_FORWARDED_FOR
b7ac5457 152 Ip::Address indirect_client_addr;
33b24cf0 153#endif /* FOLLOW_X_FORWARDED_FOR */
3d674977 154
b7ac5457 155 Ip::Address my_addr;
4a56ee8d 156
a2ac85d9 157 HierarchyLogEntry hier;
4a56ee8d 158
3ff65596
AR
159 int dnsWait; ///< sum of DNS lookup delays in milliseconds, for %dt
160
83b053a0 161 Error error; ///< the first transaction problem encountered (or falsy)
4a56ee8d 162
f53969cc 163 char *peer_login; /* Configured peer login:password */
4a56ee8d 164
f53969cc 165 time_t lastmod; /* Used on refreshes */
4a56ee8d 166
90ab8f20
AJ
167 /// The variant second-stage cache key. Generated from Vary header pattern for this request.
168 SBuf vary_headers;
4a56ee8d 169
f53969cc 170 char *peer_domain; /* Configured peer forceddomain */
4a56ee8d 171
35fb56c9
AJ
172 String myportname; // Internal tag name= value from port this requests arrived in.
173
f53969cc 174 String tag; /* Internal tag for this request */
4a56ee8d 175
f53969cc 176 String extacl_user; /* User name returned by extacl lookup */
4a56ee8d 177
f53969cc 178 String extacl_passwd; /* Password returned by extacl lookup */
4a56ee8d 179
f53969cc 180 String extacl_log; /* String to be used for access.log purposes */
8596962e 181
f53969cc 182 String extacl_message; /* String to be used for error page purposes */
8c93a598 183
33b24cf0 184#if FOLLOW_X_FORWARDED_FOR
3d674977 185 String x_forwarded_for_iterator; /* XXX a list of IP addresses */
33b24cf0 186#endif /* FOLLOW_X_FORWARDED_FOR */
3d674977 187
46017fdd
CT
188 /// A strong etag of the cached entry. Used for refreshing that entry.
189 String etag;
190
ec69bdb2
CT
191 /// whether we have responded with HTTP 100 or FTP 150 already
192 bool forcedBodyContinuation;
193
8596962e 194public:
5cafad19 195 bool multipartRangeRequest() const;
4a56ee8d 196
337b9aa4 197 bool parseFirstLine(const char *start, const char *end) override;
4a56ee8d 198
337b9aa4 199 bool expectingBody(const HttpRequestMethod& unused, int64_t&) const override;
4a56ee8d 200
58217e94 201 bool bodyNibbled() const; // the request has a [partially] consumed body
202
51b5dcf5 203 int prefixLen() const;
4a56ee8d 204
5cafad19 205 void swapOut(StoreEntry * e);
4a56ee8d 206
1f28a150 207 void pack(Packable * p) const;
4a56ee8d 208
17802cf1 209 static void httpRequestPack(void *obj, Packable *p);
8596962e 210
6c880a16
AJ
211 static HttpRequest * FromUrl(const SBuf &url, const MasterXaction::Pointer &, const HttpRequestMethod &method = Http::METHOD_GET);
212
213 /// \deprecated use SBuf variant instead
214 static HttpRequest * FromUrlXXX(const char * url, const MasterXaction::Pointer &, const HttpRequestMethod &method = Http::METHOD_GET);
26ac0430 215
582c2af2 216 ConnStateData *pinnedConnection();
d67acb4e 217
a8a0b1c2
EC
218 /**
219 * Returns the current StoreID for the request as a nul-terminated char*.
220 * Always returns the current id for the request
851feda6 221 * (either the effective request URI or modified ID by the helper).
a8a0b1c2 222 */
851feda6 223 const SBuf storeId();
a8a0b1c2 224
b1cf2350
AJ
225 /**
226 * The client connection manager, if known;
227 * Used for any response actions needed directly to the client.
228 * ie 1xx forwarding or connection pinning state changes
229 */
40d34a62 230 CbcPointer<ConnStateData> clientConnectionManager;
655daa06 231
4b5ea8a6 232 /// The Downloader object which initiated the HTTP request if any
cda7024f
CT
233 CbcPointer<Downloader> downloader;
234
5ceaee75 235 /// the master transaction this request belongs to. Never nil.
e16571ed 236 MasterXaction::Pointer masterXaction;
5ceaee75 237
f0baf149
AR
238 /// forgets about the cached Range header (for a reason)
239 void ignoreRange(const char *reason);
11e3fa1c
AJ
240 int64_t getRangeOffsetLimit(); /* the result of this function gets cached in rangeOffsetLimit */
241
75d47340
CT
242 /// \returns existing non-empty transaction annotations,
243 /// creates and returns empty annotations otherwise
244 NotePairs::Pointer notes();
245 bool hasNotes() const { return bool(theNotes) && !theNotes->empty(); }
246
337b9aa4 247 void configureContentLengthInterpreter(Http::ContentLengthInterpreter &) override {}
4f1c93a7 248
4bd88eb4
AJ
249 /// Check whether the message framing headers are valid.
250 /// \returns Http::scNone or an HTTP error status
251 Http::StatusCode checkEntityFraming() const;
252
4f1c93a7
EB
253 /// Parses request header using Parser.
254 /// Use it in contexts where the Parser object is available.
255 bool parseHeader(Http1::Parser &hp);
256 /// Parses request header from the buffer.
257 /// Use it in contexts where the Parser object not available.
258 bool parseHeader(const char *buffer, const size_t size);
259
8596962e 260private:
11e3fa1c
AJ
261 mutable int64_t rangeOffsetLimit; /* caches the result of getRangeOffsetLimit */
262
75d47340
CT
263 /// annotations added by the note directive and helpers
264 /// and(or) by annotate_transaction/annotate_client ACLs.
265 NotePairs::Pointer theNotes;
8596962e 266protected:
337b9aa4 267 void packFirstLineInto(Packable * p, bool full_uri) const override;
4a56ee8d 268
337b9aa4 269 bool sanityCheckStartLine(const char *buf, const size_t hdr_len, Http::StatusCode *error) override;
4a56ee8d 270
337b9aa4 271 void hdrCacheInit() override;
26ac0430 272
337b9aa4 273 bool inheritProperties(const Http::Message *) override;
a2ac85d9 274};
528b2c61 275
75d47340
CT
276class ConnStateData;
277/**
278 * Updates ConnStateData ids and HttpRequest notes from helpers received notes.
279 */
280void UpdateRequestNotes(ConnStateData *csd, HttpRequest &request, NotePairs const &notes);
281
ea35939b
A
282/// \returns listening/*_port address used by the client connection (or nil)
283/// nil parameter(s) indicate missing caller information and are handled safely
284const Ip::Address *FindListeningPortAddress(const HttpRequest *, const AccessLogEntry *);
285
380b09ae 286/// \returns listening/*_port port number used by the client connection (or nothing)
b6c0f0dc 287/// nil parameter(s) indicate missing caller information and are handled safely
380b09ae 288AnyP::Port FindListeningPortNumber(const HttpRequest *, const AccessLogEntry *);
b6c0f0dc 289
ff9d9458 290#endif /* SQUID_SRC_HTTPREQUEST_H */
f53969cc 291