X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Ffilter_http_rewrite.cpp;h=8557a01d81faff766198289d8b2d759ddb539b4f;hb=19a8cbdf62b7307503fd4213a5b9626ec0d88f1c;hp=9ef4de2c6b6ae2ab84ce0d55d20ba3710da0350b;hpb=a52a1c2251427a79ec9d0635b0bf9888eb1601e9;p=metaproxy-moved-to-github.git diff --git a/src/filter_http_rewrite.cpp b/src/filter_http_rewrite.cpp index 9ef4de2..8557a01 100644 --- a/src/filter_http_rewrite.cpp +++ b/src/filter_http_rewrite.cpp @@ -229,6 +229,12 @@ void yf::HttpRewrite::Phase::rewrite_headers(mp::odr & o, if (!it->header.empty() && regex_match(header->name, it->header)) { +#ifdef OLDHEADERMATCH + // Matches and replaces the whole header line. + // This is good if you want to play with the header name too, + // but useless for patterns that want to anchor to the beginning + // or end of the header value, as we want to do with host-relative + // links. This code should probably be removed. std::string sheader(header->name); sheader += ": "; sheader += header->value; @@ -246,6 +252,15 @@ void yf::HttpRewrite::Phase::rewrite_headers(mp::odr & o, header->value = odr_strdup( o, sheader.substr(pos + 2, std::string::npos).c_str()); } +#else + // Match and replace only the header value + std::string hval(header->value); + if (it->exec(vars, hval, true)) + { + header->value = odr_strdup(o, hval.c_str()); + } + +#endif } } } @@ -724,17 +739,36 @@ void yf::HttpRewrite::Content::configure( ("Empty rule in '" + values[3] + "' in http_rewrite filter"); } - size_t i; - for (i = 0; i < rulenames.size(); i++) + else if (rulenames.size() == 1) { std::map::const_iterator it = - rules.find(rulenames[i]); + rules.find(rulenames[0]); if (it == rules.end()) throw mp::filter::FilterException - ("Reference to non-existing rule '" + rulenames[i] + + ("Reference to non-existing rule '" + rulenames[0] + "' in http_rewrite filter"); - if (i == 0) - w.rule = it->second; + w.rule = it->second; + + } + else + { + RulePtr rule(new Rule); + size_t i; + for (i = 0; i < rulenames.size(); i++) + { + std::map::const_iterator it = + rules.find(rulenames[i]); + if (it == rules.end()) + throw mp::filter::FilterException + ("Reference to non-existing rule '" + rulenames[i] + + "' in http_rewrite filter"); + RulePtr subRule = it->second; + std::list::iterator rit = + subRule->replace_list.begin(); + for (; rit != subRule->replace_list.end(); rit++) + rule->replace_list.push_back(*rit); + } + w.rule = rule; } w.reqline = values[4] == "1"; w.type = values[5];