X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Ffilter_http_rewrite.cpp;h=58243bfb2aae694cad56f1a7bf84c6ced463da96;hb=40b194f21cadfda4f9b034e1a0742c570889b731;hp=69556cac058f8d23ab322ff083d91aaf39c9a081;hpb=c4f5c25488b0ae53e5b856a0c14a4b8c210560fc;p=metaproxy-moved-to-github.git diff --git a/src/filter_http_rewrite.cpp b/src/filter_http_rewrite.cpp index 69556ca..58243bf 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 } } } @@ -260,6 +275,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 +288,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); @@ -715,13 +739,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") @@ -810,8 +867,8 @@ void yf::HttpRewrite::configure_phase(const xmlNode *ptr, Phase &phase) Content c; c.type = values[0]; - // if (!values[1].empty()) - c.content_re = values[1]; + if (!values[1].empty()) + c.content_re.assign(values[1], boost::regex::icase); c.configure(ptr->children, rules); phase.content_list.push_back(c); }