public:
bool start_anchor;
boost::regex re;
- boost::smatch what;
std::string recipe;
std::map<int, std::string> group_index;
std::string sub_vars(
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());
}
}
}
{
if (*content_len == 0)
return;
+ if (!content_type) {
+ yaz_log(YLOG_LOG, "rewrite_body: null content_type, can not rewrite");
+ return;
+ }
std::list<Content>::const_iterator cit = content_list.begin();
for (; cit != content_list.end(); cit++)
{
&& 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);
while (1)
{
std::list<Replace>::iterator bit = replace_list.end();
+ boost::smatch bwhat;
+ bool match_one = false;
{
- std::string::const_iterator best_pos = txt.end();
std::list<Replace>::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<int, std::string>::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;
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<std::string,RulePtr>::const_iterator it =
- rules.find(values[3]);
- if (it == rules.end())
+
+ std::vector<std::string> 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<std::string,RulePtr>::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<std::string,RulePtr>::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<Replace>::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")
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);
}