errorpage.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 1996-2023 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 /* DEBUG: section 04 Error Generation */
10 
11 #ifndef SQUID_SRC_ERRORPAGE_H
12 #define SQUID_SRC_ERRORPAGE_H
13 
14 #include "cbdata.h"
15 #include "comm/forward.h"
16 #include "error/Detail.h"
17 #include "error/forward.h"
18 #include "http/forward.h"
19 #include "http/StatusCode.h"
20 #include "ip/Address.h"
21 #include "log/forward.h"
22 #include "sbuf/SBuf.h"
23 #include "SquidString.h"
24 /* auth/UserRequest.h is empty unless USE_AUTH is defined */
25 #include "auth/UserRequest.h"
26 
27 #include <optional>
28 
30 typedef void ERCB(int fd, void *, size_t);
31 
77 class MemBuf;
78 class StoreEntry;
79 class wordlist;
80 
81 namespace ErrorPage {
82 
83 class Build;
84 
85 } // namespace ErrorPage
86 
89 {
91 
92 public:
95  ErrorState() = delete; // not implemented.
96 
99 
100  ~ErrorState();
101 
104 
108  HttpReply *BuildHttpReply(void);
109 
111  void detailError(const ErrorDetail::Pointer &dCode) { detail = dCode; }
112 
114  void validate();
115 
118 
119 private:
121 
124 
126  SBuf buildBody();
127 
131  SBuf compileBody(const char *text, bool allowRecursion);
132 
134  void compileLegacyCode(Build &build);
135 
137  void compileLogformatCode(Build &build);
138 
144  SBuf compile(const char *input, bool building_deny_info_url, bool allowRecursion);
145 
149  void noteBuildError(const char *const msg, const char * const errorLocation) {
150  noteBuildError_(msg, errorLocation, false);
151  }
152 
158  void bypassBuildErrorXXX(const char *const msg, const char * const errorLocation) {
159  noteBuildError_(msg, errorLocation, true);
160  }
161 
167  int Dump(MemBuf * mb);
168 
169 public:
172  char *err_language = nullptr;
174 #if USE_AUTH
176 #endif
178  char *url = nullptr;
179  int xerrno = 0;
180  std::optional<SBuf> dnsError;
181  time_t ttl = 0;
182 
184  char *redirect_url = nullptr;
186  void *callback_data = nullptr;
187 
188  struct {
189  wordlist *server_msg = nullptr;
190  char *request = nullptr;
191  char *reply = nullptr;
192  char *cwd_msg = nullptr;
193  MemBuf *listing = nullptr;
194  } ftp;
195 
196  char *request_hdrs = nullptr;
197  char *err_msg = nullptr; /* Preformatted error message from the cache */
198 
200 
201  // TODO: Replace type, xerrno and detail with Error while adding a virtual
202  // Error::Detail::sysError() method to extract errno in detailError().
206 
208 
209 private:
210  void noteBuildError_(const char *msg, const char *errorLocation, bool forceBypass);
211 
212  static const SBuf LogformatMagic;
213 };
214 
224 void errorInitialize(void);
225 
227 void errorClean(void);
228 
249 void errorSend(const Comm::ConnectionPointer &conn, ErrorState *err);
250 
267 void errorAppendEntry(StoreEntry *entry, ErrorState *err);
268 
270 err_type errorReservePageId(const char *page_name, const SBuf &cfgLocation);
271 
272 const char *errorPageName(int pageId);
273 
281 {
282 public:
283  TemplateFile(const char *name, const err_type code);
284  virtual ~TemplateFile() {}
285 
287  bool loaded() const {return wasLoaded;}
288 
296  void loadDefault();
297 
304  bool loadFor(const HttpRequest *request);
305 
310  bool loadFromFile(const char *path);
311 
313  const char *language() {return errLanguage.termedBuf();}
314 
316 
317  bool silent;
318 
319 protected:
321  virtual bool parse() { return true; }
322 
324  virtual void setDefault() {}
325 
331  bool tryLoadTemplate(const char *lang);
332 
334  bool wasLoaded;
338 };
339 
353 bool strHdrAcptLangGetItem(const String &hdr, char *lang, int langLen, size_t &pos);
354 
355 std::ostream &operator <<(std::ostream &, const ErrorState *);
356 
357 #endif /* SQUID_SRC_ERRORPAGE_H */
358 
void ERCB(int fd, void *, size_t)
error page callback
Definition: errorpage.h:30
char * cwd_msg
Definition: errorpage.h:192
MemBuf * listing
Definition: errorpage.h:193
ERCB * callback
Definition: errorpage.h:185
@ scNone
Definition: StatusCode.h:21
String templateName
The name of the template.
Definition: errorpage.h:336
bool loadFromFile(const char *path)
Definition: errorpage.cc:424
void errorAppendEntry(StoreEntry *entry, ErrorState *err)
Definition: errorpage.cc:738
bool loaded() const
return true if the data loaded from disk without any problem
Definition: errorpage.h:287
int Dump(MemBuf *mb)
Definition: errorpage.cc:852
char * reply
Definition: errorpage.h:191
bool wasLoaded
True if the template data read from disk without any problem.
Definition: errorpage.h:334
err_type errorReservePageId(const char *page_name, const SBuf &cfgLocation)
allocates a new slot for the error page
Definition: errorpage.cc:654
HttpReplyPointer response_
Definition: errorpage.h:207
HttpReply * BuildHttpReply(void)
Definition: errorpage.cc:1315
#define CBDATA_CLASS(type)
Definition: cbdata.h:289
Definition: SBuf.h:93
AccessLogEntryPointer ale
transaction details (or nil)
Definition: errorpage.h:199
String errLanguage
The error language of the template.
Definition: errorpage.h:335
int page_id
Definition: errorpage.h:171
const char * errorPageName(int pageId)
error ID to string
Definition: errorpage.cc:669
void detailError(const ErrorDetail::Pointer &dCode)
set error type-specific detail code
Definition: errorpage.h:111
@ ERR_NONE
Definition: forward.h:15
StatusCode
Definition: StatusCode.h:20
err_type
Definition: forward.h:14
err_type templateCode
The internal code for this template.
Definition: errorpage.h:337
time_t ttl
Definition: errorpage.h:181
void compileLogformatCode(Build &build)
compile @Squid{code} sequence containing a single logformat code
Definition: errorpage.cc:913
TemplateFile(const char *name, const err_type code)
Definition: errorpage.cc:357
bool silent
Whether to print error messages on cache.log file or not. It is user defined.
Definition: errorpage.h:317
virtual void setDefault()
recover from loadDefault() failure to load or parse() a template
Definition: errorpage.h:324
void loadDefault()
Definition: errorpage.cc:363
wordlist * server_msg
Definition: errorpage.h:189
void errorSend(const Comm::ConnectionPointer &conn, ErrorState *err)
Definition: errorpage.cc:792
ErrorState()=delete
err_type type
Definition: errorpage.h:170
HttpRequestPointer request
Definition: errorpage.h:177
char * request_hdrs
Definition: errorpage.h:196
void noteBuildError_(const char *msg, const char *errorLocation, bool forceBypass)
Definition: errorpage.cc:1478
Definition: MemBuf.h:23
void bypassBuildErrorXXX(const char *const msg, const char *const errorLocation)
Definition: errorpage.h:158
SBuf text("GET http://resource.com/path HTTP/1.1\r\n" "Host: resource.com\r\n" "Cookie: laijkpk3422r j1noin \r\n" "\r\n")
bool tryLoadTemplate(const char *lang)
Definition: errorpage.cc:399
virtual bool parse()
post-process the loaded template
Definition: errorpage.h:321
void validate()
ensures that a future BuildHttpReply() is likely to succeed
Definition: errorpage.cc:1303
Ip::Address src_addr
Definition: errorpage.h:183
state and parameters shared by several ErrorState::compile*() methods
Definition: errorpage.cc:106
char * err_msg
Definition: errorpage.h:197
SBuf compileBody(const char *text, bool allowRecursion)
Definition: errorpage.cc:1436
std::optional< SBuf > dnsError
DNS lookup error message.
Definition: errorpage.h:180
char * err_language
Definition: errorpage.h:172
ErrorDetail::Pointer detail
Definition: errorpage.h:205
int code
Definition: smb-errors.c:145
int xerrno
Definition: errorpage.h:179
virtual ~TemplateFile()
Definition: errorpage.h:284
void compileLegacyCode(Build &build)
compile a single-letter code like D
Definition: errorpage.cc:949
const char * language()
The language used for the template.
Definition: errorpage.h:313
char * redirect_url
Definition: errorpage.h:184
SBuf inputLocation
the source of the error template (for reporting purposes)
Definition: errorpage.h:117
const char * termedBuf() const
Definition: SquidString.h:92
SBuf filename
where the template was loaded from
Definition: errorpage.h:315
char * url
Definition: errorpage.h:178
static ErrorState * NewForwarding(err_type, HttpRequestPointer &, const AccessLogEntryPointer &)
Creates a general request forwarding error with the right http_status.
Definition: errorpage.cc:691
std::ostream & operator<<(std::ostream &, const ErrorState *)
Definition: errorpage.cc:1567
ErrorPage::Build Build
Definition: errorpage.h:120
bool loadFor(const HttpRequest *request)
Definition: errorpage.cc:526
SBuf buildBody()
locates the right error page template for this error and compiles it
Definition: errorpage.cc:1400
SBuf template_
raw template contents
Definition: errorpage.h:333
void * callback_data
Definition: errorpage.h:186
void errorClean(void)
Definition: errorpage.cc:323
SBuf compile(const char *input, bool building_deny_info_url, bool allowRecursion)
Definition: errorpage.cc:1442
struct ErrorState::@54 ftp
void noteBuildError(const char *const msg, const char *const errorLocation)
Definition: errorpage.h:149
bool strHdrAcptLangGetItem(const String &hdr, char *lang, int langLen, size_t &pos)
Definition: errorpage.cc:472
static const SBuf LogformatMagic
marks each embedded logformat entry
Definition: errorpage.h:212
Http::StatusCode httpStatus
Definition: errorpage.h:173
Auth::UserRequest::Pointer auth_user_request
Definition: errorpage.h:175
void errorInitialize(void)
Definition: errorpage.cc:261

 

Introduction

Documentation

Support

Miscellaneous