+namespace metaproxy_1 {
+ namespace filter {
+ class HttpRewrite::Replace {
+ public:
+ bool start_anchor;
+ boost::regex re;
+ std::string recipe;
+ std::map<int, std::string> group_index;
+ std::string sub_vars(
+ const std::map<std::string, std::string> & vars) const;
+ void parse_groups(std::string pattern);
+ };
+
+ class HttpRewrite::Rule {
+ public:
+ std::list<Replace> replace_list;
+ bool test_patterns(
+ std::map<std::string, std::string> &vars,
+ std::string &txt, bool anchor,
+ std::list<boost::regex> &skip_list);
+ };
+ class HttpRewrite::Within {
+ public:
+ boost::regex header;
+ boost::regex attr;
+ boost::regex tag;
+ std::string type;
+ bool reqline;
+ RulePtr rule;
+ bool exec(std::map<std::string, std::string> &vars,
+ std::string &txt, bool anchor,
+ std::list<boost::regex> &skip_list) const;
+ };
+
+ class HttpRewrite::Content {
+ public:
+ std::string type;
+ boost::regex content_re;
+ std::list<Within> within_list;
+ void configure(const xmlNode *ptr,
+ std::map<std::string, RulePtr > &rules);
+ void quoted_literal(std::string &content,
+ std::map<std::string, std::string> &vars,
+ std::list<boost::regex> & skip_list) const;
+ void parse(int verbose, std::string &content,
+ std::map<std::string, std::string> & vars,
+ std::list<boost::regex> & skip_list ) const;
+ };
+ class HttpRewrite::Phase {
+ public:
+ Phase();
+ int m_verbose;
+ std::list<Content> content_list;
+ void read_skip_headers(Z_HTTP_Request *hreq,
+ std::list<boost::regex> &skip_list);
+ void rewrite_reqline(mp::odr & o, Z_HTTP_Request *hreq,
+ std::map<std::string, std::string> & vars) const;
+ void rewrite_headers(mp::odr & o, Z_HTTP_Header *headers,
+ std::map<std::string, std::string> & vars) const;
+ void rewrite_body(mp::odr & o,
+ const char *content_type,
+ char **content_buf, int *content_len,
+ std::map<std::string, std::string> & vars,
+ std::list<boost::regex> & skip_list ) const;
+ };
+ class HttpRewrite::Event : public HTMLParserEvent {
+ void openTagStart(const char *tag, int tag_len);
+ void anyTagEnd(const char *tag, int tag_len, int close_it);
+ void attribute(const char *tag, int tag_len,
+ const char *attr, int attr_len,
+ const char *value, int val_len,
+ const char *sep);
+ void closeTag(const char *tag, int tag_len);
+ void text(const char *value, int len);
+ const Content *m_content;
+ WRBUF m_w;
+ std::stack<std::list<Within>::const_iterator> s_within;
+ std::map<std::string, std::string> &m_vars;
+ std::list<boost::regex> & m_skips;
+ public:
+ Event(const Content *p,
+ std::map<std::string, std::string> &vars,
+ std::list<boost::regex> & skip_list );
+ ~Event();
+ const char *result();
+ };
+ }
+}
+
+yf::HttpRewrite::HttpRewrite() :
+ req_phase(new Phase), res_phase(new Phase)