X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Ffilter_http_rewrite.cpp;h=5cab5decba138d6983ca8decc6422fe830abc3d0;hb=88cbd90028404f012d6b1673d35941883806c788;hp=58243bfb2aae694cad56f1a7bf84c6ced463da96;hpb=c271eb1db3286cd6c309f2cde33dc90d7c3c4dfe;p=metaproxy-moved-to-github.git diff --git a/src/filter_http_rewrite.cpp b/src/filter_http_rewrite.cpp index 58243bf..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,38 +228,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; - - if (it->exec(vars, sheader, 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()); - } -#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 } } } @@ -525,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;