diff --git a/src/nhttpd/yhttpd_core/yhook.cpp b/src/nhttpd/yhttpd_core/yhook.cpp index 3b789864f..b4aa79e0a 100644 --- a/src/nhttpd/yhttpd_core/yhook.cpp +++ b/src/nhttpd/yhttpd_core/yhook.cpp @@ -301,7 +301,7 @@ std::string CyhookHandler::BuildHeader(bool cache) { strftime(timeStr, sizeof(timeStr), RFC1123FMT, gmtime(&mod_time)); result += string_printf("Last-Modified: %s\r\n", timeStr); - if (status == HANDLED_SENDFILE) { + if (status == HANDLED_SENDFILE && !cached) { result += string_printf("Accept-Ranges: bytes\r\n"); result += string_printf("Content-Length: %lld\r\n", RangeEnd - RangeStart + 1); if (httpStatus == HTTP_PARTIAL_CONTENT) diff --git a/src/nhttpd/yhttpd_core/yhook.h b/src/nhttpd/yhttpd_core/yhook.h index a01fa6f4e..a9c23fe3c 100644 --- a/src/nhttpd/yhttpd_core/yhook.h +++ b/src/nhttpd/yhttpd_core/yhook.h @@ -124,27 +124,28 @@ protected: static THookList HookList; public: // Output - std::string yresult; // content for response output - THandleStatus status; // status of Hook handling + std::string yresult; // content for response output + THandleStatus status; // status of Hook handling HttpResponseType httpStatus; // http-status code for response std::string ResponseMimeType; // mime-type for response - std::string NewURL; // new URL for Redirection - off_t ContentLength; // Length of Response Body - off_t RangeStart; // Start of range, used for sendfile only - off_t RangeEnd; // End of range, used for sendfile only - time_t LastModified; // Last Modified Time of Item to send / -1 dynamic content - std::string Sendfile; // Path & Name (local os style) of file to send + std::string NewURL; // new URL for Redirection + off_t ContentLength; // Length of Response Body + off_t RangeStart; // Start of range, used for sendfile only + off_t RangeEnd; // End of range, used for sendfile only + time_t LastModified; // Last Modified Time of Item to send / -1 dynamic content + std::string Sendfile; // Path & Name (local os style) of file to send bool keep_alive; + bool cached; // cached by mod_cache // Input - CStringList ParamList; // local copy of ParamList (Request) - CStringList UrlData; // local copy of UrlData (Request) - CStringList HeaderList; // local copy of HeaderList (Request) - CStringList WebserverConfigList;// Reference (writable) to ConfigList + CStringList ParamList; // local copy of ParamList (Request) + CStringList UrlData; // local copy of UrlData (Request) + CStringList HeaderList; // local copy of HeaderList (Request) + CStringList WebserverConfigList; // Reference (writable) to ConfigList CStringList HookVarList; // Variables in Hook-Handling passing to other Hooks - THttp_Method Method; // HTTP Method (requested) + THttp_Method Method; // HTTP Method (requested) // constructor & deconstructor - CyhookHandler(){ContentLength = 0; RangeStart = 0; RangeEnd = -1; keep_alive = 0; _outIndent = 0;status = HANDLED_NONE;Method = M_UNKNOWN;httpStatus = HTTP_NIL;outType = plain;}; + CyhookHandler(){ContentLength = 0; RangeStart = 0; RangeEnd = -1; cached = false; keep_alive = 0; _outIndent = 0;status = HANDLED_NONE;Method = M_UNKNOWN;httpStatus = HTTP_NIL;outType = plain;}; virtual ~CyhookHandler(){}; // hook slot handler diff --git a/src/nhttpd/yhttpd_core/yresponse.cpp b/src/nhttpd/yhttpd_core/yresponse.cpp index 0e7852b16..aeb4701ba 100644 --- a/src/nhttpd/yhttpd_core/yresponse.cpp +++ b/src/nhttpd/yhttpd_core/yresponse.cpp @@ -135,7 +135,7 @@ bool CWebserverResponse::SendResponse() { // Send static file if (Connection->HookHandler.status == HANDLED_SENDFILE && !Connection->RequestCanceled) { - bool cache = true; + bool cache = !Connection->HookHandler.cached; // if(Connection->HookHandler.UrlData["path"] == "/tmp/")//TODO: un-cachable dirs // cache = false; Write(Connection->HookHandler.BuildHeader(cache)); diff --git a/src/nhttpd/yhttpd_mods/mod_cache.cpp b/src/nhttpd/yhttpd_mods/mod_cache.cpp index b39c907c5..2f410998a 100644 --- a/src/nhttpd/yhttpd_mods/mod_cache.cpp +++ b/src/nhttpd/yhttpd_mods/mod_cache.cpp @@ -32,6 +32,8 @@ THandleStatus CmodCache::Hook_PrepareResponse(CyhookHandler *hh) { std::string url = hh->UrlData["fullurl"]; if (CacheList.find(url) != CacheList.end()) // is in Cache. Rewrite URL or not modified { + hh->cached = true; + pthread_mutex_lock(&mutex); // yeah, its mine // Check if modified @@ -82,6 +84,7 @@ THandleStatus CmodCache::Hook_SendResponse(CyhookHandler *hh) { { AddToCache(hh, url, hh->yresult, hh->HookVarList["CacheMimeType"], category); // create cache file and add to cache list + hh->cached = true; hh->ContentLength = (hh->yresult).length(); hh->RangeEnd = (hh->yresult).length()-1; hh->SendFile(CacheList[url].filename); // Send as file