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);
        }
Beispiel #3
0
        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;
        }