2 * Copyright (C) 1996-2014 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 */
12 #include "acl/FilledChecklist.h"
13 #include "acl/HttpStatus.h"
16 #include "HttpReply.h"
20 static void aclParseHTTPStatusList(SplayNode
<acl_httpstatus_data
*> **curlist
);
21 static int aclHTTPStatusCompare(acl_httpstatus_data
* const &a
, acl_httpstatus_data
* const &b
);
22 static int aclMatchHTTPStatus(SplayNode
<acl_httpstatus_data
*> **dataptr
, Http::StatusCode status
);
24 acl_httpstatus_data::acl_httpstatus_data(int x
) : status1(x
), status2(x
) { ; }
26 acl_httpstatus_data::acl_httpstatus_data(int x
, int y
) : status1(x
), status2(y
) { ; }
29 acl_httpstatus_data::toStr() const
32 if (status2
== INT_MAX
)
33 rv
.Printf("%d-", status1
);
34 else if (status1
== status2
)
35 rv
.Printf("%d", status1
);
37 rv
.Printf("%d-%d", status1
, status2
);
41 int acl_httpstatus_data::compare(acl_httpstatus_data
* const& a
, acl_httpstatus_data
* const& b
)
44 ret
= aclHTTPStatusCompare(b
, a
);
47 ret
= aclHTTPStatusCompare(a
, b
);
50 const SBuf sa
= a
->toStr();
51 const SBuf sb
= b
->toStr();
52 debugs(28, DBG_CRITICAL
, "WARNING: '" << sa
<< "' is a subrange of '" << sb
<< "'");
53 debugs(28, DBG_CRITICAL
, "WARNING: because of this '" << sa
<< "' is ignored to keep splay tree searching predictable");
54 debugs(28, DBG_CRITICAL
, "WARNING: You should probably remove '" << sb
<< "' from the ACL named '" << AclMatchedName
<< "'");
61 ACLHTTPStatus::clone() const
63 return new ACLHTTPStatus(*this);
66 ACLHTTPStatus::ACLHTTPStatus (char const *theClass
) : data(NULL
), class_ (theClass
)
69 ACLHTTPStatus::ACLHTTPStatus (ACLHTTPStatus
const & old
) : data(NULL
), class_ (old
.class_
)
71 /* we don't have copy constructors for the data yet */
75 ACLHTTPStatus::~ACLHTTPStatus()
78 data
->destroy(SplayNode
<acl_httpstatus_data
*>::DefaultFree
);
82 ACLHTTPStatus::typeString() const
88 ACLHTTPStatus::empty () const
94 aclParseHTTPStatusData(const char *t
)
101 return new acl_httpstatus_data(status
);
104 return new acl_httpstatus_data(status
, atoi(t
));
106 return new acl_httpstatus_data(status
, INT_MAX
);
110 ACLHTTPStatus::parse()
112 aclParseHTTPStatusList (&data
);
116 aclParseHTTPStatusList(SplayNode
<acl_httpstatus_data
*> **curlist
)
119 SplayNode
<acl_httpstatus_data
*> **Top
= curlist
;
120 acl_httpstatus_data
*q
= NULL
;
122 while ((t
= strtokFile())) {
123 if ((q
= aclParseHTTPStatusData(t
)) == NULL
)
126 *Top
= (*Top
)->insert(q
, acl_httpstatus_data::compare
);
131 ACLHTTPStatus::match(ACLChecklist
*checklist
)
133 return aclMatchHTTPStatus(&data
, Filled(checklist
)->reply
->sline
.status());
137 aclMatchHTTPStatus(SplayNode
<acl_httpstatus_data
*> **dataptr
, const Http::StatusCode status
)
140 acl_httpstatus_data
X(status
);
141 SplayNode
<acl_httpstatus_data
*> **Top
= dataptr
;
142 *Top
= Top
[0]->splay(&X
, aclHTTPStatusCompare
);
144 debugs(28, 3, "aclMatchHTTPStatus: '" << status
<< "' " << (splayLastResult
? "NOT found" : "found"));
145 return (0 == splayLastResult
);
149 aclHTTPStatusCompare(acl_httpstatus_data
* const &a
, acl_httpstatus_data
* const &b
)
151 if (a
->status1
< b
->status1
)
154 if (a
->status1
> b
->status2
)
161 aclDumpHTTPStatusListWalkee(acl_httpstatus_data
* const &node
, void *state
)
163 // state is a SBufList*
164 static_cast<SBufList
*>(state
)->push_back(node
->toStr());
168 ACLHTTPStatus::dump() const
171 data
->walk(aclDumpHTTPStatusListWalkee
, &w
);