summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
e713a91)
New facility for http_file to passthru - even if an area is matched. The
default behavior (passthru=false) is to return 404: Not found. With
passthru=false, next filter is consulted.
std::string m_url_path_prefix;
std::string m_file_root;
bool m_raw;
std::string m_url_path_prefix;
std::string m_file_root;
bool m_raw;
Area();
};
class HttpFile::Mime {
Area();
};
class HttpFile::Mime {
void fetch_file(mp::Session &session,
Z_HTTP_Request *req,
std::string &fname, mp::Package &package,
void fetch_file(mp::Session &session,
Z_HTTP_Request *req,
std::string &fname, mp::Package &package,
+ bool raw, bool passthru);
std::string get_mime_type(std::string &fname);
};
}
}
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)
void yf::HttpFile::Rep::fetch_file(mp::Session &session,
Z_HTTP_Request *req,
std::string &fname, mp::Package &package,
void yf::HttpFile::Rep::fetch_file(mp::Session &session,
Z_HTTP_Request *req,
std::string &fname, mp::Package &package,
+ bool raw, bool passthru)
{
mp::odr o(ODR_ENCODE);
if (strcmp(req->method, "GET"))
{
{
mp::odr o(ODR_ENCODE);
if (strcmp(req->method, "GET"))
{
- Z_GDU *gdu = o.create_HTTP_Response(session, req, 405);
- package.response() = gdu;
+ 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;
+ }
{
std::string fname = it->m_file_root + path.substr(l);
package.log("http_file", YLOG_LOG, "%s", fname.c_str());
{
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);
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);
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 "
else
throw mp::filter::FilterException
("Bad element "
element mp:area {
element mp:documentroot { xsd:string },
element mp:prefix { xsd:string },
element mp:area {
element mp:documentroot { xsd:string },
element mp:prefix { xsd:string },
- element mp:raw { xsd:boolean }?
+ element mp:raw { xsd:boolean }?,
+ element mp:passthru { xsd:boolean }?