public HTTPResponse GetFile(HTTPRequest request) { if (this.filePath == null) { return(null); } var path = request.path.StartsWith("/") ? request.path.Substring(1): request.path; path = filePath + path; this.logger(LogLevel.Debug, $"Returning static file...{path}"); CacheEntry entry; lock (_files) { if (_files.ContainsKey(request.path)) { entry = _files[request.path]; } else { entry = null; } } if (entry != null) { if (entry.path != null) { var lastMod = File.GetLastWriteTime(path); if (lastMod != entry.lastModified) { entry.Reload(); entry.lastModified = lastMod; } } } else { if (!File.Exists(path)) { logger(LogLevel.Warning, "Nothing found..."); return(null); } entry = new CacheEntry(); entry.lastModified = File.GetLastWriteTime(path); entry.path = path; entry.Reload(); lock (_files) { _files[request.path] = entry; } } if (request.headers.ContainsKey("If-None-Match")) { var hash = request.headers["If-None-Match"]; if (hash.Equals(entry.hash)) { return(HTTPResponse.NotModified(entry.hash, defaultMaxAge)); } } var result = HTTPResponse.FromBytes(entry.bytes); if (entry.isCompressed) { result.headers["Content-Encoding"] = "gzip"; } result.headers["Content-Type"] = entry.contentType; result.headers["Content-Description"] = "File Transfer"; var fileName = Path.GetFileName(request.path); if (entry.isDownload) { result.headers["Content-Disposition"] = "attachment; filename=\"" + fileName + "\""; } result.headers["Content-Transfer-Encoding"] = "binary"; result.headers["Connection"] = "Keep-Alive"; //result.headers["Expires"] = "0"; result.headers["Cache-Control"] = "max-age=" + defaultMaxAge + ", public"; result.headers["Pragma"] = "public"; result.headers["Last-Modified"] = entry.lastModified.ToString("r"); result.headers["ETag"] = entry.hash; return(result); }