X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Ffilter_http_client.cpp;h=2e6a38f43a0d9b838414274eb6184de75dd468da;hb=c271eb1db3286cd6c309f2cde33dc90d7c3c4dfe;hp=74a1aa8bbed3b527e5d53da4da20afc425e513ab;hpb=19317eb63692c8039849a70e71e7619d71679502;p=metaproxy-moved-to-github.git diff --git a/src/filter_http_client.cpp b/src/filter_http_client.cpp index 74a1aa8..2e6a38f 100644 --- a/src/filter_http_client.cpp +++ b/src/filter_http_client.cpp @@ -50,10 +50,17 @@ namespace metaproxy_1 { void proxy(mp::Package &package); std::string proxy_host; std::string default_host; + int max_redirects; + Rep(); }; } } +yf::HTTPClient::Rep::Rep() +{ + max_redirects = -0; +} + yf::HTTPClient::HTTPClient() : m_p(new Rep) { } @@ -71,11 +78,18 @@ 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); + std::string uri; if (hreq->path[0] == '/') { if (default_host.length()) @@ -92,19 +106,15 @@ void yf::HTTPClient::Rep::proxy(mp::Package &package) if (http_response) { res_gdu = o.create_HTTP_Response(package.session(), hreq, 200); - Z_HTTP_Header **hp = &http_response->headers; - while (*hp) - { - if (!yaz_matchstr((*hp)->name, "Transfer-Encoding")) - *hp = (*hp)->next; - else - hp = &(*hp)->next; - } + z_HTTP_header_remove(&http_response->headers, "Transfer-Encoding"); res_gdu->u.HTTP_Response = http_response; } else { - res_gdu = o.create_HTTP_Response(package.session(), hreq, 404); + 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); @@ -133,6 +143,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);