public CachedFile(FileResponse.Buffered response, HttpResponse gzippedResponse) { Response = response; LastModified = response.LastModified; ContentType = response.ContentType; GZippedResponse = gzippedResponse; }
public HttpResponse Handle(IHttpRequest req) { var requestedFilename = HttpUtility.UrlDecode(req.Path.Substring(reqPathFilenameStartIndex)); var absFilename = Path.GetFullPath(Path.Combine(directory, requestedFilename)); if (!absFilename.StartsWith(directory)) { return(Forbidden); } var fileInfo = new FileInfo(absFilename); if (!fileInfo.Exists) // cached but deleted { return(NotFound); } DateTime ifModifiedSince; CachedFile cachedFile; HttpResponse response; if (req.TryGetIfLastModifiedSince(out ifModifiedSince) && fileInfo.LastWriteTimeUtc <= ifModifiedSince) { // Remote client (browser) has a valid cached copy (we may not have it in cache yet though eg. server restarted) response = new HttpResponse(HttpStatusCode.NotModified, MimeMapping.GetMimeMapping(fileInfo.Name)); } else if (cache.TryGetValue(absFilename, out cachedFile) && fileInfo.LastWriteTimeUtc <= cachedFile.LastModified) { // Dictionary cached copy is still valid response = req.IsAcceptGZip() ? cachedFile.GZippedResponse : cachedFile.Response; } else { // Load fresh from disk if (fileInfo.Length <= maxFileLengthToCache) { var fileResponse = new FileResponse.Buffered(fileInfo); var gzippedFileResponse = gzipFunc(fileResponse); cache[absFilename] = new CachedFile(fileResponse, gzippedFileResponse); response = req.IsAcceptGZip() ? gzippedFileResponse : fileResponse; } else { response = new FileResponse.Stream(fileInfo); } } return(response); }
public HttpResponse Handle(IHttpRequest req) { var requestedFilename = HttpUtility.UrlDecode(req.Path.Substring(reqPathFilenameStartIndex)); var absFilename = Path.GetFullPath(Path.Combine(directory, requestedFilename)); if (!absFilename.StartsWith(directory)) { return Forbidden; } var fileInfo = new FileInfo(absFilename); if (!fileInfo.Exists) // cached but deleted { return NotFound; } DateTime ifModifiedSince; CachedFile cachedFile; HttpResponse response; if (req.TryGetIfLastModifiedSince(out ifModifiedSince) && fileInfo.LastWriteTimeUtc <= ifModifiedSince) { // Remote client (browser) has a valid cached copy (we may not have it in cache yet though eg. server restarted) response = new HttpResponse(HttpStatusCode.NotModified, MimeMapping.GetMimeMapping(fileInfo.Name)); } else if (cache.TryGetValue(absFilename, out cachedFile) && fileInfo.LastWriteTimeUtc <= cachedFile.LastModified) { // Dictionary cached copy is still valid response = req.IsAcceptGZip() ? cachedFile.GZippedResponse : cachedFile.Response; } else { // Load fresh from disk if (fileInfo.Length <= maxFileLengthToCache) { var fileResponse = new FileResponse.Buffered(fileInfo); var gzippedFileResponse = gzipFunc(fileResponse); cache[absFilename] = new CachedFile(fileResponse, gzippedFileResponse); response = req.IsAcceptGZip() ? gzippedFileResponse : fileResponse; } else { response = new FileResponse.Stream(fileInfo); } } return response; }