]> git.ipfire.org Git - thirdparty/squid.git/blob - src/acl/HttpHeaderData.cc
Boilerplate: update copyright blurbs on src/
[thirdparty/squid.git] / src / acl / HttpHeaderData.cc
1 /*
2 * Copyright (C) 1996-2014 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 28 Access Control */
10
11 #include "squid.h"
12 #include "acl/Acl.h"
13 #include "acl/Checklist.h"
14 #include "acl/HttpHeaderData.h"
15 #include "acl/RegexData.h"
16 #include "cache_cf.h"
17 #include "ConfigParser.h"
18 #include "Debug.h"
19 #include "HttpHeaderTools.h"
20 #include "SBuf.h"
21
22 /* Construct an ACLHTTPHeaderData that uses an ACLRegex rule with the value of the
23 * selected header from a given request.
24 *
25 * TODO: This can be generalised by making the type of the regex_rule into a
26 * template parameter - so that we can use different rules types in future.
27 */
28 ACLHTTPHeaderData::ACLHTTPHeaderData() : hdrId(HDR_BAD_HDR), regex_rule(new ACLRegexData)
29 {}
30
31 ACLHTTPHeaderData::~ACLHTTPHeaderData()
32 {
33 delete regex_rule;
34 }
35
36 bool
37 ACLHTTPHeaderData::match(HttpHeader* hdr)
38 {
39 if (hdr == NULL)
40 return false;
41
42 debugs(28, 3, "aclHeaderData::match: checking '" << hdrName << "'");
43
44 String value;
45 if (hdrId != HDR_BAD_HDR) {
46 if (!hdr->has(hdrId))
47 return false;
48 value = hdr->getStrOrList(hdrId);
49 } else {
50 if (!hdr->getByNameIfPresent(hdrName.termedBuf(), value))
51 return false;
52 }
53
54 SBuf cvalue(value);
55 return regex_rule->match(cvalue.c_str());
56 }
57
58 SBufList
59 ACLHTTPHeaderData::dump() const
60 {
61 SBufList sl;
62 sl.push_back(SBuf(hdrName));
63 // temp is needed until c++11 move-constructor
64 SBufList temp = regex_rule->dump();
65 sl.splice(sl.end(), temp);
66 return sl;
67 }
68
69 void
70 ACLHTTPHeaderData::parse()
71 {
72 char* t = strtokFile();
73 assert (t != NULL);
74 hdrName = t;
75 hdrId = httpHeaderIdByNameDef(hdrName.rawBuf(), hdrName.size());
76 regex_rule->parse();
77 }
78
79 bool
80 ACLHTTPHeaderData::empty() const
81 {
82 return (hdrId == HDR_BAD_HDR && hdrName.size()==0) || regex_rule->empty();
83 }
84
85 ACLData<HttpHeader*> *
86 ACLHTTPHeaderData::clone() const
87 {
88 /* Header's don't clone yet. */
89 ACLHTTPHeaderData * result = new ACLHTTPHeaderData;
90 result->regex_rule = regex_rule->clone();
91 result->hdrId = hdrId;
92 result->hdrName = hdrName;
93 return result;
94 }