X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Ffilter_http_rewrite.cpp;h=a918f44ae9c6cd07fb192e3230ae65559ea2c037;hb=ed7601f8a0bf2f19ee13aba601f8fcdda99d8256;hp=d417f46cead1f552277b757294e2315554dac812;hpb=0cc98fc161f86765524e7d53ac0fb6a2196cf9af;p=metaproxy-moved-to-github.git diff --git a/src/filter_http_rewrite.cpp b/src/filter_http_rewrite.cpp index d417f46..a918f44 100644 --- a/src/filter_http_rewrite.cpp +++ b/src/filter_http_rewrite.cpp @@ -40,6 +40,7 @@ namespace metaproxy_1 { namespace filter { class HttpRewrite::Replace { public: + bool start_anchor; boost::regex re; boost::smatch what; std::string recipe; @@ -54,7 +55,7 @@ namespace metaproxy_1 { std::list replace_list; const std::string test_patterns( std::map & vars, - const std::string & txt); + const std::string & txt, bool anchor); }; class HttpRewrite::Within { public: @@ -172,7 +173,7 @@ void yf::HttpRewrite::Phase::rewrite_reqline (mp::odr & o, { RulePtr rule = it->rule; yaz_log(YLOG_LOG, "Proxy request URL is %s", path.c_str()); - std::string npath = rule->test_patterns(vars, path); + std::string npath = rule->test_patterns(vars, path, true); if (!npath.empty()) { yaz_log(YLOG_LOG, "Rewritten request URL is %s", npath.c_str()); @@ -198,7 +199,7 @@ void yf::HttpRewrite::Phase::rewrite_headers(mp::odr & o, sheader += header->value; RulePtr rule = it->rule; - std::string out = rule->test_patterns(vars, sheader); + std::string out = rule->test_patterns(vars, sheader, true); if (!out.empty()) { size_t pos = out.find(": "); @@ -345,7 +346,7 @@ void yf::HttpRewrite::Event::attribute(const char *tag, int tag_len, if (subst) { std::string input(value, val_len); - output = it->rule->test_patterns(m_vars, input); + output = it->rule->test_patterns(m_vars, input, true); } if (output.empty()) wrbuf_write(m_w, value, val_len); @@ -377,7 +378,7 @@ void yf::HttpRewrite::Event::text(const char *value, int len) if (it != m_phase->within_list.end()) { std::string input(value, len); - output = it->rule->test_patterns(m_vars, input); + output = it->rule->test_patterns(m_vars, input, false); } if (output.empty()) wrbuf_write(m_w, value, len); @@ -387,8 +388,9 @@ void yf::HttpRewrite::Event::text(const char *value, int len) const std::string yf::HttpRewrite::Rule::test_patterns( std::map & vars, - const std::string & txt) + const std::string & txt, bool anchor) { + bool first = anchor; std::string out; std::string::const_iterator start, end; start = txt.begin(); @@ -401,6 +403,8 @@ const std::string yf::HttpRewrite::Rule::test_patterns( 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)) { if (it->what[0].first < best_pos) @@ -413,7 +417,7 @@ const std::string yf::HttpRewrite::Rule::test_patterns( if (bit == replace_list.end()) break; } - + first = false; size_t i; for (i = 1; i < bit->what.size(); ++i) { @@ -445,6 +449,7 @@ void yf::HttpRewrite::Replace::parse_groups(std::string pattern) bool esc = false; const std::string &str = pattern; std::string res; + start_anchor = str[0] == '^'; yaz_log(YLOG_LOG, "Parsing groups from '%s'", str.c_str()); for (size_t i = 0; i < str.size(); ++i) {