+
+ std::list<Content>::const_iterator cit = content_list.begin();
+ for (; cit != content_list.end(); cit++)
+ if (cit->type == "headers")
+ break;
+
+ if (cit == content_list.end())
+ return;
+
+ std::list<Within>::const_iterator it = cit->within_list.begin();
+ for (; it != cit->within_list.end(); it++)
+ if (it->reqline)
+ {
+ yaz_log(YLOG_LOG, "Proxy request URL is %s", path.c_str());
+ if (it->exec(vars, path, true))
+ {
+ yaz_log(YLOG_LOG, "Rewritten request URL is %s", path.c_str());
+ hreq->path = odr_strdup(o, path.c_str());
+ }
+ }
+}
+
+void yf::HttpRewrite::Phase::rewrite_headers(mp::odr & o,
+ Z_HTTP_Header *headers,
+ std::map<std::string, std::string> & vars) const
+{
+ std::list<Content>::const_iterator cit = content_list.begin();
+ for (; cit != content_list.end(); cit++)
+ if (cit->type == "headers")
+ break;
+
+ if (cit == content_list.end())
+ return;
+
+ for (Z_HTTP_Header *header = headers; header; header = header->next)
+ {
+ std::list<Within>::const_iterator it = cit->within_list.begin();
+ for (; it != cit->within_list.end(); it++)
+ {
+ 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
+ }
+ }
+ }
+}
+
+void yf::HttpRewrite::Phase::rewrite_body(
+ mp::odr &o,
+ const char *content_type,
+ char **content_buf,
+ int *content_len,
+ std::map<std::string, std::string> & vars) const
+{
+ 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++)
+ {
+ yaz_log(YLOG_LOG, "rewrite_body: content_type=%s type=%s",
+ content_type, cit->type.c_str());
+ if (cit->type != "headers"
+ && regex_match(content_type, cit->content_re))
+ break;
+ }
+ 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) {
+ 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);
+ *content_buf = odr_strdup(o, content.c_str());
+ *content_len = strlen(*content_buf);
+}
+
+yf::HttpRewrite::Event::Event(const Content *p,
+ std::map<std::string, std::string> & vars
+ ) : m_content(p), m_vars(vars)
+{
+ m_w = wrbuf_alloc();
+}
+
+yf::HttpRewrite::Event::~Event()
+{
+ wrbuf_destroy(m_w);
+}
+
+const char *yf::HttpRewrite::Event::result()
+{
+ return wrbuf_cstr(m_w);