X-Git-Url: http://sru.miketaylor.org.uk/?a=blobdiff_plain;ds=sidebyside;f=src%2Ffilter_http_rewrite.cpp;h=8557a01d81faff766198289d8b2d759ddb539b4f;hb=19a8cbdf62b7307503fd4213a5b9626ec0d88f1c;hp=cb005e9f67fca0b6dbca616c79bd5e17b9c4f438;hpb=e72710fc07c005bf835c3ed9bcdbc1068e118116;p=metaproxy-moved-to-github.git diff --git a/src/filter_http_rewrite.cpp b/src/filter_http_rewrite.cpp index cb005e9..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 } } } @@ -715,13 +730,46 @@ void yf::HttpRewrite::Content::configure( w.attr.assign(values[1], boost::regex_constants::icase); if (values[2].length() > 0) w.tag.assign(values[2], boost::regex_constants::icase); - std::map::const_iterator it = - rules.find(values[3]); - if (it == rules.end()) + + std::vector rulenames; + boost::split(rulenames, values[3], boost::is_any_of(",")); + if (rulenames.size() == 0) + { throw mp::filter::FilterException - ("Reference to non-existing rule '" + values[3] + + ("Empty rule in '" + values[3] + "' in http_rewrite filter"); - w.rule = it->second; + } + else if (rulenames.size() == 1) + { + std::map::const_iterator it = + rules.find(rulenames[0]); + if (it == rules.end()) + throw mp::filter::FilterException + ("Reference to non-existing rule '" + rulenames[0] + + "' in http_rewrite filter"); + 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]; if (w.type.empty() || w.type == "quoted-literal")