X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Ffilter_http_client.cpp;h=e3d611675460d35b53866e4a90c9813b84a253c3;hb=6692b8d5ffb2da3cd727a66c479d91a0218dba4e;hp=7703a97a9d52e752287483d0259b7e6d72d68a87;hpb=15b0ee3b555ce9fdb416e78836209841efc6e596;p=metaproxy-moved-to-github.git diff --git a/src/filter_http_client.cpp b/src/filter_http_client.cpp index 7703a97..e3d6116 100644 --- a/src/filter_http_client.cpp +++ b/src/filter_http_client.cpp @@ -1,5 +1,5 @@ /* This file is part of Metaproxy. - Copyright (C) 2005-2013 Index Data + Copyright (C) Index Data Metaproxy is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -50,10 +50,21 @@ namespace metaproxy_1 { void proxy(mp::Package &package); std::string proxy_host; std::string default_host; + int max_redirects; + bool x_forwarded_for; + bool bind_host; + Rep(); }; } } +yf::HTTPClient::Rep::Rep() +{ + max_redirects = 0; + x_forwarded_for = false; + bind_host = false; +} + yf::HTTPClient::HTTPClient() : m_p(new Rep) { } @@ -71,11 +82,33 @@ void yf::HTTPClient::Rep::proxy(mp::Package &package) Z_GDU *res_gdu = 0; mp::odr o; yaz_url_t yaz_url = yaz_url_create(); - std::string uri; + const char *http_proxy = + z_HTTP_header_remove(&hreq->headers, "X-Metaproxy-Proxy"); + + if (!http_proxy) + http_proxy = proxy_host.c_str(); + + if (*http_proxy) + yaz_url_set_proxy(yaz_url, http_proxy); - if (proxy_host.length()) - yaz_url_set_proxy(yaz_url, proxy_host.c_str()); + yaz_url_set_max_redirects(yaz_url, max_redirects); + if (x_forwarded_for) + { + std::string peer_name2 = package.origin().get_address(); + const char *peer_name1 = + z_HTTP_header_lookup(hreq->headers, "X-Forwarded-For"); + std::string pcomb; + if (peer_name1) + { + pcomb.append(peer_name1); + pcomb.append(", "); + } + pcomb.append(peer_name2); + z_HTTP_header_set(o, &hreq->headers, "X-Forwarded-For", + pcomb.c_str()); + } + std::string uri; if (hreq->path[0] == '/') { if (default_host.length()) @@ -83,20 +116,38 @@ void yf::HTTPClient::Rep::proxy(mp::Package &package) } else uri = hreq->path; - Z_HTTP_Response *http_response = 0; - if (uri.length()) - http_response = - yaz_url_exec(yaz_url, uri.c_str(), hreq->method, - hreq->headers, hreq->content_buf, - hreq->content_len); - if (http_response) + + if (bind_host) { - res_gdu = o.create_HTTP_Response(package.session(), hreq, 200); - res_gdu->u.HTTP_Response = http_response; + std::string host = package.origin().get_bind_address(); + uri.append(" "); + uri.append(host); + } + if (!uri.length()) + { + res_gdu = o.create_HTTP_Response_details( + package.session(), + hreq, 404, + "http_client: no target URI specified"); } else { - res_gdu = o.create_HTTP_Response(package.session(), hreq, 404); + Z_HTTP_Response * http_response = + yaz_url_exec(yaz_url, uri.c_str(), hreq->method, + hreq->headers, hreq->content_buf, + hreq->content_len); + if (http_response) + { + res_gdu = o.create_HTTP_Response(package.session(), hreq, 200); + z_HTTP_header_remove(&http_response->headers, "Transfer-Encoding"); + res_gdu->u.HTTP_Response = http_response; + } + else + { + res_gdu = o.create_HTTP_Response_details( + package.session(), + hreq, 502, yaz_url_get_error(yaz_url)); + } } package.response() = res_gdu; yaz_url_destroy(yaz_url); @@ -125,6 +176,10 @@ void mp::filter::HTTPClient::configure(const xmlNode * ptr, bool test_only, { m_p->proxy_host = mp::xml::get_text(ptr); } + else if (!strcmp((const char *) ptr->name, "max-redirects")) + { + m_p->max_redirects = mp::xml::get_int(ptr, 0); + } else if (!strcmp((const char *) ptr->name, "default-host")) { m_p->default_host = mp::xml::get_text(ptr); @@ -135,6 +190,14 @@ void mp::filter::HTTPClient::configure(const xmlNode * ptr, bool test_only, " in http_client filter"); } } + else if (!strcmp((const char *) ptr->name, "x-forwarded-for")) + { + m_p->x_forwarded_for = mp::xml::get_bool(ptr, 0); + } + else if (!strcmp((const char *) ptr->name, "bind_host")) + { + m_p->bind_host = mp::xml::get_bool(ptr, 0); + } else { throw mp::filter::FilterException