HttpHeader.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 #ifndef SQUID_SRC_HTTPHEADER_H
10 #define SQUID_SRC_HTTPHEADER_H
11 
12 #include "anyp/ProtocolVersion.h"
13 #include "base/LookupTable.h"
14 #include "http/RegisteredHeaders.h"
15 /* because we pass a spec by value */
16 #include "HttpHeaderMask.h"
17 #include "mem/PoolingAllocator.h"
18 #include "sbuf/forward.h"
19 #include "SquidString.h"
20 
21 #include <vector>
22 
23 /* class forward declarations */
24 class HttpHdrCc;
25 class HttpHdrContRange;
26 class HttpHdrRange;
27 class HttpHdrSc;
28 class Packable;
29 
31 typedef enum {
32  hoNone =0,
33 #if USE_HTCP
35 #endif
38 #if USE_OPENSSL
40 #endif
43 
45 typedef ssize_t HttpHeaderPos;
46 
47 /* use this and only this to initialize HttpHeaderPos */
48 #define HttpHeaderInitPos (-1)
49 
51 {
53 
54 public:
55  HttpHeaderEntry(Http::HdrType id, const SBuf &name, const char *value);
57  static HttpHeaderEntry *parse(const char *field_start, const char *field_end, const http_hdr_owner_type msgType);
58  HttpHeaderEntry *clone() const;
59  void packInto(Packable *p) const;
60  int getInt() const;
61  int64_t getInt64() const;
62 
64  size_t length() const { return name.length() + 2 + value.size() + 2; }
65 
69 };
70 
71 class ETag;
72 class TimeOrTag;
73 
75 {
76 
77 public:
78  explicit HttpHeader(const http_hdr_owner_type owner);
79  HttpHeader(const HttpHeader &other);
80  ~HttpHeader();
81 
82  HttpHeader &operator =(const HttpHeader &other);
83 
84  /* Interface functions */
85  void clean();
86  void append(const HttpHeader * src);
89  void update(const HttpHeader *fresh);
91  bool needUpdate(const HttpHeader *fresh) const;
92  void compact();
93  int parse(const char *header_start, size_t len, Http::ContentLengthInterpreter &interpreter);
98  int parse(const char *buf, size_t buf_len, bool atEnd, size_t &hdr_sz, Http::ContentLengthInterpreter &interpreter);
99  void packInto(Packable * p, bool mask_sensitive_info=false) const;
100  HttpHeaderEntry *getEntry(HttpHeaderPos * pos) const;
104  int delByName(const SBuf &name);
106  int delByName(const char *name) { return delByName(SBuf(name)); }
107  int delById(Http::HdrType id);
108  void delAt(HttpHeaderPos pos, int &headers_deleted);
109  void refreshMask();
110  void addEntry(HttpHeaderEntry * e);
111  String getList(Http::HdrType id) const;
112  bool getList(Http::HdrType id, String *s) const;
115  String getByName(const SBuf &name) const;
116  String getByName(const char *name) const;
117  String getById(Http::HdrType id) const;
120  bool getByIdIfPresent(Http::HdrType id, String *result) const;
123  bool hasNamed(const SBuf &s, String *value = nullptr) const;
125  bool hasNamed(const char *name, unsigned int namelen, String *value = nullptr) const;
128  SBuf getByNameListMember(const char *name, const char *member, const char separator) const;
131  SBuf getListMember(Http::HdrType id, const char *member, const char separator) const;
132  int has(Http::HdrType id) const;
135  void addVia(const AnyP::ProtocolVersion &ver, const HttpHeader *from = nullptr);
136  void putInt(Http::HdrType id, int number);
137  void putInt64(Http::HdrType id, int64_t number);
138  void putTime(Http::HdrType id, time_t htime);
139  void putStr(Http::HdrType id, const char *str);
140  void putAuth(const char *auth_scheme, const char *realm);
141  void putCc(const HttpHdrCc &cc);
142  void putContRange(const HttpHdrContRange * cr);
143  void putRange(const HttpHdrRange * range);
144  void putSc(HttpHdrSc *sc);
145  void putExt(const char *name, const char *value);
146 
149  void updateOrAddStr(Http::HdrType, const SBuf &);
150 
151  int getInt(Http::HdrType id) const;
152  int64_t getInt64(Http::HdrType id) const;
153  time_t getTime(Http::HdrType id) const;
154  const char *getStr(Http::HdrType id) const;
155  const char *getLastStr(Http::HdrType id) const;
156  HttpHdrCc *getCc() const;
157  HttpHdrRange *getRange() const;
158  HttpHdrSc *getSc() const;
160  SBuf getAuthToken(Http::HdrType id, const char *auth_scheme) const;
161  ETag getETag(Http::HdrType id) const;
163  int hasListMember(Http::HdrType id, const char *member, const char separator) const;
164  int hasByNameListMember(const char *name, const char *member, const char separator) const;
165  void removeHopByHopEntries();
166 
169  bool chunked() const { return has(Http::HdrType::TRANSFER_ENCODING); }
170 
172  bool unsupportedTe() const { return teUnsupported_; }
173 
174  /* protected, do not use these, use interface functions instead */
175  std::vector<HttpHeaderEntry*, PoolingAllocator<HttpHeaderEntry*> > entries;
178  int len;
180 protected:
189  static bool Isolate(const char **parse_start, size_t l, const char **blk_start, const char **blk_end);
190  bool skipUpdateHeader(const Http::HdrType id) const;
191 
192 private:
195  bool teUnsupported_ = false;
198 };
199 
200 int httpHeaderParseQuotedString(const char *start, const int len, String *val);
201 
202 namespace Http {
203 
218 SBuf SlowlyParseQuotedString(const char *description, const char *start, size_t length);
219 
220 }
221 
223 SBuf httpHeaderQuoteString(const char *raw);
224 
225 void httpHeaderCalcMask(HttpHeaderMask * mask, Http::HdrType http_hdr_type_enums[], size_t count);
226 
227 void httpHeaderInitModule(void);
228 
229 #endif /* SQUID_SRC_HTTPHEADER_H */
230 
void append(const HttpHeader *src)
Definition: HttpHeader.cc:231
void refreshMask()
Definition: HttpHeader.cc:722
@ hoReply
Definition: HttpHeader.h:37
static HttpHeaderEntry * parse(const char *field_start, const char *field_end, const http_hdr_owner_type msgType)
Definition: HttpHeader.cc:1392
HttpHdrRange * getRange() const
Definition: HttpHeader.cc:1220
bool conflictingContentLength() const
Definition: HttpHeader.h:113
int delByName(const SBuf &name)
Definition: HttpHeader.cc:647
bool unsupportedTe() const
whether message used an unsupported and/or invalid Transfer-Encoding
Definition: HttpHeader.h:172
Definition: ETag.h:17
http_hdr_owner_type owner
Definition: HttpHeader.h:177
const char * getStr(Http::HdrType id) const
Definition: HttpHeader.cc:1163
void removeHopByHopEntries()
Definition: HttpHeader.cc:1710
bool teUnsupported_
Definition: HttpHeader.h:197
int hasListMember(Http::HdrType id, const char *member, const char separator) const
Definition: HttpHeader.cc:1662
void packInto(Packable *p) const
Definition: HttpHeader.cc:1512
HttpHeader & operator=(const HttpHeader &other)
Definition: HttpHeader.cc:170
ssize_t HttpHeaderPos
Definition: HttpHeader.h:45
HttpHeaderMask mask
Definition: HttpHeader.h:176
String getById(Http::HdrType id) const
Definition: HttpHeader.cc:857
HttpHeaderEntry * findLastEntry(Http::HdrType id) const
Definition: HttpHeader.cc:627
void addVia(const AnyP::ProtocolVersion &ver, const HttpHeader *from=nullptr)
Definition: HttpHeader.cc:945
bool conflictingContentLength_
Definition: HttpHeader.h:194
size_t length() const
expected number of bytes written by packInto(), including ": " and CRLF
Definition: HttpHeader.h:64
int parse(const char *header_start, size_t len, Http::ContentLengthInterpreter &interpreter)
Definition: HttpHeader.cc:349
Definition: SBuf.h:93
String getList(Http::HdrType id) const
Definition: HttpHeader.cc:788
bool needUpdate(const HttpHeader *fresh) const
Definition: HttpHeader.cc:244
void updateOrAddStr(Http::HdrType, const SBuf &)
Definition: HttpHeader.cc:1083
void putCc(const HttpHdrCc &cc)
Definition: HttpHeader.cc:1011
static bool Isolate(const char **parse_start, size_t l, const char **blk_start, const char **blk_end)
Definition: HttpHeader.cc:301
Definition: forward.h:17
String getStrOrList(Http::HdrType id) const
Definition: HttpHeader.cc:822
int hasByNameListMember(const char *name, const char *member, const char separator) const
Definition: HttpHeader.cc:1686
number
Definition: testStatHist.cc:32
bool chunked() const
Definition: HttpHeader.h:169
bool skipUpdateHeader(const Http::HdrType id) const
Definition: HttpHeader.cc:258
@ hoNone
Definition: HttpHeader.h:32
TimeOrTag getTimeOrTag(Http::HdrType id) const
Definition: HttpHeader.cc:1330
void putContRange(const HttpHdrContRange *cr)
Definition: HttpHeader.cc:1026
int64_t getInt64() const
Definition: HttpHeader.cc:1534
const char * getLastStr(Http::HdrType id) const
Definition: HttpHeader.cc:1179
void httpHeaderCalcMask(HttpHeaderMask *mask, Http::HdrType http_hdr_type_enums[], size_t count)
int httpHeaderParseQuotedString(const char *start, const int len, String *val)
char HttpHeaderMask[12]
void putAuth(const char *auth_scheme, const char *realm)
Definition: HttpHeader.cc:1004
std::vector< HttpHeaderEntry *, PoolingAllocator< HttpHeaderEntry * > > entries
Definition: HttpHeader.h:175
MEMPROXY_CLASS(HttpHeaderEntry)
HttpHdrSc * getSc() const
Definition: HttpHeader.cc:1239
int delById(Http::HdrType id)
Definition: HttpHeader.cc:666
Http::HdrType id
Definition: HttpHeader.h:66
void putExt(const char *name, const char *value)
Definition: HttpHeader.cc:1075
int64_t getInt64(Http::HdrType id) const
Definition: HttpHeader.cc:1133
void addEntry(HttpHeaderEntry *e)
Definition: HttpHeader.cc:736
time_t getTime(Http::HdrType id) const
Definition: HttpHeader.cc:1146
SBuf getAuthToken(Http::HdrType id, const char *auth_scheme) const
Definition: HttpHeader.cc:1275
void putTime(Http::HdrType id, time_t htime)
Definition: HttpHeader.cc:986
bool hasNamed(const SBuf &s, String *value=nullptr) const
Definition: HttpHeader.cc:865
SBuf SlowlyParseQuotedString(const char *description, const char *start, size_t length)
SBuf httpHeaderQuoteString(const char *raw)
quotes string using RFC 7230 quoted-string rules
int getInt(Http::HdrType id) const
Definition: HttpHeader.cc:1120
@ hoEnd
Definition: HttpHeader.h:41
@ TRANSFER_ENCODING
void packInto(Packable *p, bool mask_sensitive_info=false) const
Definition: HttpHeader.cc:539
static int sc[16]
Definition: smbdes.c:121
size_type length() const
Returns the number of bytes stored in SBuf.
Definition: SBuf.h:419
@ hoErrorDetail
Definition: HttpHeader.h:39
void removeConnectionHeaderEntries()
Definition: HttpHeader.cc:1727
ETag getETag(Http::HdrType id) const
Definition: HttpHeader.cc:1317
void httpHeaderInitModule(void)
Definition: HttpHeader.cc:121
@ hoHtcpReply
Definition: HttpHeader.h:34
String getByName(const SBuf &name) const
Definition: HttpHeader.cc:848
void putInt(Http::HdrType id, int number)
Definition: HttpHeader.cc:968
HttpHeaderEntry * findEntry(Http::HdrType id) const
Definition: HttpHeader.cc:602
SBuf getByNameListMember(const char *name, const char *member, const char separator) const
Definition: HttpHeader.cc:917
int has(Http::HdrType id) const
Definition: HttpHeader.cc:937
bool getByIdIfPresent(Http::HdrType id, String *result) const
Definition: HttpHeader.cc:871
void putStr(Http::HdrType id, const char *str)
Definition: HttpHeader.cc:995
size_type size() const
Definition: SquidString.h:73
HttpHeader(const http_hdr_owner_type owner)
Definition: HttpHeader.cc:147
int getInt() const
Definition: HttpHeader.cc:1522
HttpHeaderEntry(Http::HdrType id, const SBuf &name, const char *value)
Definition: HttpHeader.cc:1360
SBuf getListMember(Http::HdrType id, const char *member, const char separator) const
Definition: HttpHeader.cc:928
void compact()
Definition: HttpHeader.cc:711
void update(const HttpHeader *fresh)
Definition: HttpHeader.cc:267
void putSc(HttpHdrSc *sc)
Definition: HttpHeader.cc:1058
void delAt(HttpHeaderPos pos, int &headers_deleted)
Definition: HttpHeader.cc:694
int delByName(const char *name)
Definition: HttpHeader.h:106
HttpHeaderEntry * getEntry(HttpHeaderPos *pos) const
Definition: HttpHeader.cc:583
HttpHdrContRange * getContRange() const
Definition: HttpHeader.cc:1261
@ hoRequest
Definition: HttpHeader.h:36
void putRange(const HttpHdrRange *range)
Definition: HttpHeader.cc:1042
void clean()
Definition: HttpHeader.cc:185
HttpHdrCc * getCc() const
Definition: HttpHeader.cc:1194
void putInt64(Http::HdrType id, int64_t number)
Definition: HttpHeader.cc:977
HttpHeaderEntry * clone() const
Definition: HttpHeader.cc:1506
http_hdr_owner_type
Definition: HttpHeader.h:31

 

Introduction

Documentation

Support

Miscellaneous