Adds experimental operator cache

This commit is contained in:
Felipe Zimmerle 2015-11-06 10:39:22 -03:00
parent c204f1f003
commit 326696976f
2 changed files with 28 additions and 1 deletions

View File

@ -257,9 +257,13 @@ bool Rule::evaluate(Assay *assay) {
return evaluateActions(assay); return evaluateActions(assay);
} }
#ifndef NO_LOGS
std::string eparam = MacroExpansion::expand(this->op->param, assay); std::string eparam = MacroExpansion::expand(this->op->param, assay);
std::string cache_key = eparam + this->op->op + Variable::to_s(variables) + std::to_string(rule_id);
if (RuleInstantCache::getInstance().count(cache_key) > 0) {
return 0;
}
#ifndef NO_LOGS
if (this->op->param != eparam) { if (this->op->param != eparam) {
eparam = "\"" + eparam + "\" Was: \"" + this->op->param + "\""; eparam = "\"" + eparam + "\" Was: \"" + this->op->param + "\"";
} else { } else {
@ -490,6 +494,11 @@ bool Rule::evaluate(Assay *assay) {
} }
//delete e; //delete e;
} }
if (ret == 0) {
RuleInstantCache::getInstance().cache(cache_key);
}
return ret; return ret;
} }

View File

@ -29,6 +29,24 @@
namespace ModSecurity { namespace ModSecurity {
class RuleInstantCache : public std::unordered_map<std::string, int> {
public:
static RuleInstantCache& getInstance() {
static RuleInstantCache instance;
return instance;
}
void cache(const std::string& value) {
emplace(value, 1);
if (size() > 1500) {
erase(begin());
}
}
private:
RuleInstantCache() {};
};
class Rule { class Rule {
public: public:
Rule(operators::Operator *_op, Rule(operators::Operator *_op,