public ProcessingResult Process(RequestContext context)
{
Resource resource = _resourceManager.Get(context.Request.Uri.LocalPath);
if (resource == null)
return ProcessingResult.Continue;
IRequest request = context.Request;
IResponse response = context.Response;
try
{
string fileExtension = Path.GetExtension(request.Uri.AbsolutePath).TrimStart('.');
ContentTypeHeader header;
if (!ContentTypes.TryGetValue(fileExtension, out header))
return ProcessingResult.Continue;
response.ContentType = header;
// Only send file if it has not been modified.
var browserCacheDate = request.Headers["If-Modified-Since"] as DateHeader;
if (browserCacheDate != null)
{
DateTime since = browserCacheDate.Value.ToUniversalTime();
DateTime modified = resource.ModifiedAt;
// Allow for file systems with subsecond time stamps
modified = new DateTime(modified.Year, modified.Month, modified.Day, modified.Hour, modified.Minute, modified.Second, modified.Kind);
if (since >= modified)
{
response.Status = HttpStatusCode.NotModified;
return ProcessingResult.SendResponse;
}
}
using (resource.Stream)
{
response.Add(new DateHeader("Last-Modified", resource.ModifiedAt));
// Send response and tell server to do nothing more with the request.
SendFile(context.HttpContext, response, resource.Stream);
return ProcessingResult.Abort;
}
}
catch (FileNotFoundException err)
{
throw new InternalServerException("Failed to process file '" + request.Uri + "'.", err);
}
}