X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Ffilter_http_file.cpp;h=500cdc1c73673ecf44378513897ea0b96149d00d;hb=7e75c6abaa325fd42359128e8e91572beb17628b;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..500cdc1 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 @@ -21,6 +21,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include #include #include "filter_http_file.hpp" +#include #include #include @@ -48,6 +49,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 +72,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 +136,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 +262,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 +323,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 "