]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/acl/HttpHeaderData.cc
52dbf162bf27b7cbb205a103c3372f0b0892bcad
2 * Copyright (C) 1996-2016 The Squid Software Foundation and contributors
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.
9 /* DEBUG: section 28 Access Control */
13 #include "acl/Checklist.h"
14 #include "acl/HttpHeaderData.h"
15 #include "acl/RegexData.h"
16 #include "base/RegexPattern.h"
17 #include "ConfigParser.h"
19 #include "HttpHeaderTools.h"
20 #include "sbuf/SBuf.h"
21 #include "sbuf/StringConvert.h"
23 /* Construct an ACLHTTPHeaderData that uses an ACLRegex rule with the value of the
24 * selected header from a given request.
26 * TODO: This can be generalised by making the type of the regex_rule into a
27 * template parameter - so that we can use different rules types in future.
29 ACLHTTPHeaderData::ACLHTTPHeaderData() : hdrId(Http::HdrType::BAD_HDR
), regex_rule(new ACLRegexData
)
32 ACLHTTPHeaderData::~ACLHTTPHeaderData()
38 ACLHTTPHeaderData::match(HttpHeader
* hdr
)
43 debugs(28, 3, "aclHeaderData::match: checking '" << hdrName
<< "'");
46 if (hdrId
!= Http::HdrType::BAD_HDR
) {
49 value
= hdr
->getStrOrList(hdrId
);
51 if (!hdr
->getByNameIfPresent(hdrName
, value
))
55 auto cvalue
= StringToSBuf(value
);
56 return regex_rule
->match(cvalue
.c_str());
60 ACLHTTPHeaderData::dump() const
63 sl
.push_back(SBuf(hdrName
));
64 #if __cplusplus >= 201103L
65 sl
.splice(sl
.end(), regex_rule
->dump());
67 // temp is needed until c++11 move-constructor
68 SBufList temp
= regex_rule
->dump();
69 sl
.splice(sl
.end(), temp
);
75 ACLHTTPHeaderData::parse()
77 char* t
= ConfigParser::strtokFile();
80 hdrId
= Http::HeaderLookupTable
.lookup(hdrName
).id
;
85 ACLHTTPHeaderData::empty() const
87 return (hdrId
== Http::HdrType::BAD_HDR
&& hdrName
.isEmpty()) || regex_rule
->empty();
90 ACLData
<HttpHeader
*> *
91 ACLHTTPHeaderData::clone() const
93 /* Header's don't clone yet. */
94 ACLHTTPHeaderData
* result
= new ACLHTTPHeaderData
;
95 result
->regex_rule
= regex_rule
->clone();
96 result
->hdrId
= hdrId
;
97 result
->hdrName
= hdrName
;