2003-08-19 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[mono.git] / mcs / class / System.Web / System.Web / StaticFileHandler.cs
1 //
2 // System.Web.StaticFileHandler
3 //
4 // Authors:
5 //      Gonzalo Paniagua Javier (gonzalo@ximian.com)
6 //
7 // (C) 2002 Ximian, Inc (http://www.ximian.com)
8 //
9
10 using System;
11 using System.IO;
12
13 namespace System.Web
14 {
15         class StaticFileHandler : IHttpHandler
16         {
17                 public void ProcessRequest (HttpContext context)
18                 {
19                         HttpRequest request = context.Request;
20                         HttpResponse response = context.Response;
21                         string fileName = request.PhysicalPath;
22                         FileInfo fi = new FileInfo (fileName);
23                         if (!fi.Exists)
24                                 throw new HttpException (404, "File '" + fileName + "' does not exist");
25
26                         if ((fi.Attributes & FileAttributes.Directory) != 0) {
27                                 response.Redirect (request.Path + '/');
28                                 return;
29                         }
30
31                         string strHeader = request.Headers ["If-Modified-Since"];
32                         try {
33                                 if (strHeader != null) {
34                                         DateTime dtIfModifiedSince = DateTime.ParseExact (strHeader, "r", null);
35                                         DateTime ftime = fi.LastWriteTime.ToUniversalTime ();
36                                         if (ftime <= dtIfModifiedSince) {
37                                                 response.StatusCode = 304;
38                                                 return;
39                                         }
40                                 }
41                         } catch { } 
42
43                         try {
44                                 DateTime lastWT = fi.LastWriteTime.ToUniversalTime ();
45                                 response.AddHeader ("Last-Modified", lastWT.ToString ("r"));
46
47                                 response.WriteFile (fileName);
48                                 response.ContentType = MimeTypes.GetMimeType (fileName);
49                         } catch (Exception e) {
50                                 throw new HttpException (401, "Forbidden");
51                         }
52                 }
53
54                 public bool IsReusable
55                 {
56                         get {
57                                 return true;
58                         }
59                 }
60         }
61 }
62