X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Ffilter_http_rewrite.cpp;h=5cab5decba138d6983ca8decc6422fe830abc3d0;hb=13447dbaee9e465d4da72b8914810e8ee4f632c6;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..5cab5de 100644 --- a/src/filter_http_rewrite.cpp +++ b/src/filter_http_rewrite.cpp @@ -42,7 +42,6 @@ namespace metaproxy_1 { public: bool start_anchor; boost::regex re; - boost::smatch what; std::string recipe; std::map group_index; std::string sub_vars( @@ -229,22 +228,11 @@ void yf::HttpRewrite::Phase::rewrite_headers(mp::odr & o, if (!it->header.empty() && regex_match(header->name, it->header)) { - std::string sheader(header->name); - sheader += ": "; - sheader += header->value; - - if (it->exec(vars, sheader, true)) + // Match and replace only the header value + std::string hval(header->value); + if (it->exec(vars, hval, true)) { - size_t pos = sheader.find(": "); - if (pos == std::string::npos) - { - yaz_log(YLOG_LOG, "Header malformed during rewrite, ignoring"); - continue; - } - header->name = odr_strdup( - o, sheader.substr(0, pos).c_str()); - header->value = odr_strdup( - o, sheader.substr(pos + 2, std::string::npos).c_str()); + header->value = odr_strdup(o, hval.c_str()); } } } @@ -260,6 +248,10 @@ void yf::HttpRewrite::Phase::rewrite_body( { if (*content_len == 0) return; + if (!content_type) { + yaz_log(YLOG_LOG, "rewrite_body: null content_type, can not rewrite"); + return; + } std::list::const_iterator cit = content_list.begin(); for (; cit != content_list.end(); cit++) { @@ -269,13 +261,18 @@ void yf::HttpRewrite::Phase::rewrite_body( && regex_match(content_type, cit->content_re)) break; } - if (cit == content_list.end()) + if (cit == content_list.end()) { + yaz_log(YLOG_LOG,"rewrite_body: No content rule matched %s, not rewriting", + content_type ); return; + } int i; for (i = 0; i < *content_len; i++) - if ((*content_buf)[i] == 0) + if ((*content_buf)[i] == 0) { + yaz_log(YLOG_LOG,"rewrite_body: Looks like binary stuff, not rewriting"); return; // binary content. skip + } std::string content(*content_buf, *content_len); cit->parse(m_verbose, content, vars); @@ -501,46 +498,49 @@ bool yf::HttpRewrite::Rule::test_patterns( while (1) { std::list::iterator bit = replace_list.end(); + boost::smatch bwhat; + bool match_one = false; { - std::string::const_iterator best_pos = txt.end(); std::list::iterator it = replace_list.begin(); for (; it != replace_list.end(); it++) { if (it->start_anchor && !first) continue; - if (regex_search(start, end, it->what, it->re)) + boost::smatch what; + if (regex_search(start, end, what, it->re)) { - if (it->what[0].first < best_pos) + if (!match_one || what[0].first < bwhat[0].first) { - best_pos = it->what[0].first; + bwhat = what; bit = it; } + match_one = true; } } - if (bit == replace_list.end()) + if (!match_one) break; } first = false; replaces = true; size_t i; - for (i = 1; i < bit->what.size(); ++i) + for (i = 1; i < bwhat.size(); ++i) { //check if the group is named std::map::const_iterator git = bit->group_index.find(i); if (git != bit->group_index.end()) { //it is - vars[git->second] = bit->what[i]; + vars[git->second] = bwhat[i]; } } //prepare replacement string std::string rvalue = bit->sub_vars(vars); yaz_log(YLOG_LOG, "! Rewritten '%s' to '%s'", - bit->what.str(0).c_str(), rvalue.c_str()); - out.append(start, bit->what[0].first); + bwhat.str(0).c_str(), rvalue.c_str()); + out.append(start, bwhat[0].first); out.append(rvalue); - start = bit->what[0].second; //move search forward + start = bwhat[0].second; //move search forward } out.append(start, end); txt = out; @@ -724,17 +724,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];