-typedef std::pair<std::string, std::string> string_pair;
-typedef std::vector<string_pair> spair_vec;
-typedef spair_vec::iterator spv_iter;
-
-class FilterHeaderRewrite: public mp::filter::Base {
-public:
- void process(mp::Package & package) const
- {
- Z_GDU *gdu = package.request().get();
- //map of request/response vars
- std::map<std::string, std::string> vars;
- //we have an http req
- if (gdu && gdu->which == Z_GDU_HTTP_Request)
- {
- Z_HTTP_Request *hreq = gdu->u.HTTP_Request;
- mp::odr o;
- std::cout << ">> Request headers" << std::endl;
- rewrite_reqline(o, hreq, vars);
- rewrite_headers(o, hreq->headers, vars);
- rewrite_body(o, &hreq->content_buf, &hreq->content_len, vars);
- package.request() = gdu;
- }
- package.move();
- gdu = package.response().get();
- if (gdu && gdu->which == Z_GDU_HTTP_Response)
- {
- Z_HTTP_Response *hres = gdu->u.HTTP_Response;
- std::cout << "Response " << hres->code;
- std::cout << "<< Respose headers" << std::endl;
- mp::odr o;
- rewrite_headers(o, hres->headers, vars);
- rewrite_body(o, &hres->content_buf, &hres->content_len, vars);
- package.response() = gdu;
- }
- }
-
- void rewrite_reqline (mp::odr & o, Z_HTTP_Request *hreq,
- std::map<std::string, std::string> & vars) const
- {
- //rewrite the request line
- std::string path;
- if (strstr(hreq->path, "http://") == hreq->path)
- {
- std::cout << "Path in the method line is absolute, "
- "possibly a proxy request\n";
- path += hreq->path;
- }
- else
- {
- //TODO what about proto
- path += z_HTTP_header_lookup(hreq->headers, "Host");
- path += hreq->path;
- }
- std::cout << "Proxy request URL is " << path << std::endl;
- std::string npath =
- test_patterns(vars, path, req_uri_pats, req_groups_bynum);
- std::cout << "Resp request URL is " << npath << std::endl;
- if (!npath.empty())
- hreq->path = odr_strdup(o, npath.c_str());
- }
-
- void rewrite_headers (mp::odr & o, Z_HTTP_Header *headers,
- std::map<std::string, std::string> & vars) const