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_HTTPHEADER_H
10#define SQUID_HTTPHEADER_H
11
13#include "base/LookupTable.h"
15/* because we pass a spec by value */
16#include "HttpHeaderMask.h"
18#include "sbuf/forward.h"
19#include "SquidString.h"
20
21#include <vector>
22
23/* class forward declarations */
24class HttpHdrCc;
26class HttpHdrRange;
27class HttpHdrSc;
28class Packable;
29
31typedef enum {
33#if USE_HTCP
35#endif
38#if USE_OPENSSL
40#endif
41 hoEnd
43
45typedef ssize_t HttpHeaderPos;
46
47/* use this and only this to initialize HttpHeaderPos */
48#define HttpHeaderInitPos (-1)
49
51{
53
54public:
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
71class ETag;
72class TimeOrTag;
73
75{
76
77public:
78 explicit HttpHeader(const http_hdr_owner_type owner);
79 HttpHeader(const HttpHeader &other);
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;
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;
166
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;
180protected:
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
192private:
197 bool teUnsupported_ = false;
198};
199
200int httpHeaderParseQuotedString(const char *start, const int len, String *val);
201
202namespace Http {
203
218SBuf SlowlyParseQuotedString(const char *description, const char *start, size_t length);
219
220}
221
223SBuf httpHeaderQuoteString(const char *raw);
224
225void httpHeaderCalcMask(HttpHeaderMask * mask, Http::HdrType http_hdr_type_enums[], size_t count);
226
227void httpHeaderInitModule(void);
228
229#endif /* SQUID_HTTPHEADER_H */
230
char HttpHeaderMask[12]
SBuf httpHeaderQuoteString(const char *raw)
quotes string using RFC 7230 quoted-string rules
http_hdr_owner_type
Definition: HttpHeader.h:31
@ hoRequest
Definition: HttpHeader.h:36
@ hoNone
Definition: HttpHeader.h:32
@ hoReply
Definition: HttpHeader.h:37
@ hoHtcpReply
Definition: HttpHeader.h:34
@ hoEnd
Definition: HttpHeader.h:41
@ hoErrorDetail
Definition: HttpHeader.h:39
void httpHeaderCalcMask(HttpHeaderMask *mask, Http::HdrType http_hdr_type_enums[], size_t count)
ssize_t HttpHeaderPos
Definition: HttpHeader.h:45
int httpHeaderParseQuotedString(const char *start, const int len, String *val)
void httpHeaderInitModule(void)
Definition: HttpHeader.cc:121
Definition: ETag.h:18
void packInto(Packable *p) const
Definition: HttpHeader.cc:1513
static HttpHeaderEntry * parse(const char *field_start, const char *field_end, const http_hdr_owner_type msgType)
Definition: HttpHeader.cc:1393
int getInt() const
Definition: HttpHeader.cc:1523
HttpHeaderEntry * clone() const
Definition: HttpHeader.cc:1507
MEMPROXY_CLASS(HttpHeaderEntry)
size_t length() const
expected number of bytes written by packInto(), including ": " and CRLF
Definition: HttpHeader.h:64
int64_t getInt64() const
Definition: HttpHeader.cc:1535
HttpHeaderEntry(Http::HdrType id, const SBuf &name, const char *value)
Definition: HttpHeader.cc:1361
Http::HdrType id
Definition: HttpHeader.h:66
SBuf getByNameListMember(const char *name, const char *member, const char separator) const
Definition: HttpHeader.cc:918
void removeHopByHopEntries()
Definition: HttpHeader.cc:1711
void putStr(Http::HdrType id, const char *str)
Definition: HttpHeader.cc:996
TimeOrTag getTimeOrTag(Http::HdrType id) const
Definition: HttpHeader.cc:1331
HttpHdrCc * getCc() const
Definition: HttpHeader.cc:1195
bool getByIdIfPresent(Http::HdrType id, String *result) const
Definition: HttpHeader.cc:872
int hasByNameListMember(const char *name, const char *member, const char separator) const
Definition: HttpHeader.cc:1687
bool chunked() const
Definition: HttpHeader.h:169
void delAt(HttpHeaderPos pos, int &headers_deleted)
Definition: HttpHeader.cc:695
bool unsupportedTe() const
whether message used an unsupported and/or invalid Transfer-Encoding
Definition: HttpHeader.h:172
HttpHeader(const http_hdr_owner_type owner)
Definition: HttpHeader.cc:148
int parse(const char *header_start, size_t len, Http::ContentLengthInterpreter &interpreter)
Definition: HttpHeader.cc:350
SBuf getListMember(Http::HdrType id, const char *member, const char separator) const
Definition: HttpHeader.cc:929
void putCc(const HttpHdrCc &cc)
Definition: HttpHeader.cc:1012
String getStrOrList(Http::HdrType id) const
Definition: HttpHeader.cc:823
ETag getETag(Http::HdrType id) const
Definition: HttpHeader.cc:1318
void putInt(Http::HdrType id, int number)
Definition: HttpHeader.cc:969
void compact()
Definition: HttpHeader.cc:712
http_hdr_owner_type owner
Definition: HttpHeader.h:177
int delById(Http::HdrType id)
Definition: HttpHeader.cc:667
String getList(Http::HdrType id) const
Definition: HttpHeader.cc:789
bool conflictingContentLength_
Definition: HttpHeader.h:194
void putContRange(const HttpHdrContRange *cr)
Definition: HttpHeader.cc:1027
void refreshMask()
Definition: HttpHeader.cc:723
void update(const HttpHeader *fresh)
Definition: HttpHeader.cc:268
SBuf getAuthToken(Http::HdrType id, const char *auth_scheme) const
Definition: HttpHeader.cc:1276
HttpHeaderEntry * getEntry(HttpHeaderPos *pos) const
Definition: HttpHeader.cc:584
static bool Isolate(const char **parse_start, size_t l, const char **blk_start, const char **blk_end)
Definition: HttpHeader.cc:302
const char * getStr(Http::HdrType id) const
Definition: HttpHeader.cc:1164
int delByName(const char *name)
Definition: HttpHeader.h:106
std::vector< HttpHeaderEntry *, PoolingAllocator< HttpHeaderEntry * > > entries
Definition: HttpHeader.h:175
HttpHeader & operator=(const HttpHeader &other)
Definition: HttpHeader.cc:171
void putSc(HttpHdrSc *sc)
Definition: HttpHeader.cc:1059
bool teUnsupported_
Definition: HttpHeader.h:197
bool needUpdate(const HttpHeader *fresh) const
Definition: HttpHeader.cc:245
void putRange(const HttpHdrRange *range)
Definition: HttpHeader.cc:1043
void addEntry(HttpHeaderEntry *e)
Definition: HttpHeader.cc:737
HttpHdrContRange * getContRange() const
Definition: HttpHeader.cc:1262
void putInt64(Http::HdrType id, int64_t number)
Definition: HttpHeader.cc:978
void removeConnectionHeaderEntries()
Definition: HttpHeader.cc:1728
String getByName(const SBuf &name) const
Definition: HttpHeader.cc:849
time_t getTime(Http::HdrType id) const
Definition: HttpHeader.cc:1147
HttpHdrRange * getRange() const
Definition: HttpHeader.cc:1221
void addVia(const AnyP::ProtocolVersion &ver, const HttpHeader *from=nullptr)
Definition: HttpHeader.cc:946
int has(Http::HdrType id) const
Definition: HttpHeader.cc:938
int64_t getInt64(Http::HdrType id) const
Definition: HttpHeader.cc:1134
String getById(Http::HdrType id) const
Definition: HttpHeader.cc:858
bool conflictingContentLength() const
Definition: HttpHeader.h:113
void clean()
Definition: HttpHeader.cc:186
bool hasNamed(const SBuf &s, String *value=nullptr) const
Definition: HttpHeader.cc:866
int getInt(Http::HdrType id) const
Definition: HttpHeader.cc:1121
HttpHeaderEntry * findEntry(Http::HdrType id) const
Definition: HttpHeader.cc:603
void putAuth(const char *auth_scheme, const char *realm)
Definition: HttpHeader.cc:1005
const char * getLastStr(Http::HdrType id) const
Definition: HttpHeader.cc:1180
void putExt(const char *name, const char *value)
Definition: HttpHeader.cc:1076
HttpHeaderMask mask
Definition: HttpHeader.h:176
void putTime(Http::HdrType id, time_t htime)
Definition: HttpHeader.cc:987
void updateOrAddStr(Http::HdrType, const SBuf &)
Definition: HttpHeader.cc:1084
HttpHdrSc * getSc() const
Definition: HttpHeader.cc:1240
void packInto(Packable *p, bool mask_sensitive_info=false) const
Definition: HttpHeader.cc:540
HttpHeaderEntry * findLastEntry(Http::HdrType id) const
Definition: HttpHeader.cc:628
void append(const HttpHeader *src)
Definition: HttpHeader.cc:232
bool skipUpdateHeader(const Http::HdrType id) const
Definition: HttpHeader.cc:259
int hasListMember(Http::HdrType id, const char *member, const char separator) const
Definition: HttpHeader.cc:1663
int delByName(const SBuf &name)
Definition: HttpHeader.cc:648
Definition: SBuf.h:94
size_type length() const
Returns the number of bytes stored in SBuf.
Definition: SBuf.h:415
size_type size() const
Definition: SquidString.h:73
Definition: forward.h:18
SBuf SlowlyParseQuotedString(const char *description, const char *start, size_t length)
@ TRANSFER_ENCODING
static int sc[16]
Definition: smbdes.c:121
number
Definition: testStatHist.cc:32

 

Introduction

Documentation

Support

Miscellaneous

Web Site Translations

Mirrors