X-Git-Url: http://lists.indexdata.com/cgi-bin?a=blobdiff_plain;f=src%2Ffilter_http_file.cpp;h=997b6279d4b6f19ff46a96323269e3cb82db0c73;hb=92ec44dd3ce8bc1a655e0985b30d5d20d144c22a;hp=64efa7291958bf7bd1d1dcaeeb368eab799db329;hpb=abb6c0e006a3701899adcfaaedba3be405df3248;p=metaproxy-moved-to-github.git diff --git a/src/filter_http_file.cpp b/src/filter_http_file.cpp index 64efa72..997b627 100644 --- a/src/filter_http_file.cpp +++ b/src/filter_http_file.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 @@ -48,6 +48,7 @@ namespace metaproxy_1 { std::string m_url_path_prefix; std::string m_file_root; bool m_raw; + bool m_passthru; Area(); }; class HttpFile::Mime { @@ -70,13 +71,13 @@ namespace metaproxy_1 { void fetch_file(mp::Session &session, Z_HTTP_Request *req, std::string &fname, mp::Package &package, - bool raw); + bool raw, bool passthru); std::string get_mime_type(std::string &fname); }; } } -yf::HttpFile::Area::Area() : m_raw(false) +yf::HttpFile::Area::Area() : m_raw(false), m_passthru(false) { } @@ -134,10 +135,39 @@ std::string yf::HttpFile::Rep::get_mime_type(std::string &fname) void yf::HttpFile::Rep::fetch_file(mp::Session &session, Z_HTTP_Request *req, std::string &fname, mp::Package &package, - bool raw) + bool raw, bool passthru) { mp::odr o(ODR_ENCODE); + if (strcmp(req->method, "GET")) + { + if (passthru) + { + package.move(); + } + else + { + Z_GDU *gdu = o.create_HTTP_Response(session, req, 405); + package.response() = gdu; + } + return; + } + + struct stat st; + if (stat(fname.c_str(), &st) == -1 || (st.st_mode & S_IFMT) != S_IFREG) + { + if (passthru) + { + package.move(); + } + else + { + Z_GDU *gdu = o.create_HTTP_Response(session, req, 404); + package.response() = gdu; + } + return; + } + FILE *f = fopen(fname.c_str(), "rb"); if (!f) { @@ -231,7 +261,8 @@ void yf::HttpFile::Rep::fetch_uri(mp::Session &session, { std::string fname = it->m_file_root + path.substr(l); package.log("http_file", YLOG_LOG, "%s", fname.c_str()); - fetch_file(session, req, fname, package, it->m_raw); + fetch_file(session, req, fname, package, it->m_raw, + it->m_passthru); return; } } @@ -291,6 +322,8 @@ void mp::filter::HttpFile::configure(const xmlNode * ptr, bool test_only, a.m_url_path_prefix = mp::xml::get_text(a_node); else if (mp::xml::is_element_mp(a_node, "raw")) a.m_raw = mp::xml::get_bool(a_node, false); + else if (mp::xml::is_element_mp(a_node, "passthru")) + a.m_passthru = mp::xml::get_bool(a_node, false); else throw mp::filter::FilterException ("Bad element "