Mercurial Hosting > luan
annotate src/goodjava/webserver/handlers/FileHandler.java @ 2020:163f88f7ee00
for nabble
| author | Franklin Schmidt <fschmidt@gmail.com> | 
|---|---|
| date | Sun, 05 Oct 2025 20:43:42 -0600 | 
| parents | bba3e529e346 | 
| children | 
| rev | line source | 
|---|---|
| 1402 
27efb1fcbcb5
move luan.lib to goodjava
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1347diff
changeset | 1 package goodjava.webserver.handlers; | 
| 1139 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 2 | 
| 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 3 import java.io.File; | 
| 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 4 import java.io.FileInputStream; | 
| 1140 
bf03d687eaff
webserver - add dir handling
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1139diff
changeset | 5 import java.io.IOException; | 
| 
bf03d687eaff
webserver - add dir handling
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1139diff
changeset | 6 import java.text.DateFormat; | 
| 
bf03d687eaff
webserver - add dir handling
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1139diff
changeset | 7 import java.text.SimpleDateFormat; | 
| 1604 
8a7519dee55c
FileHandler handles if-modified-since
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 8 import java.text.ParseException; | 
| 1140 
bf03d687eaff
webserver - add dir handling
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1139diff
changeset | 9 import java.util.Date; | 
| 1604 
8a7519dee55c
FileHandler handles if-modified-since
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 10 import java.util.TimeZone; | 
| 1402 
27efb1fcbcb5
move luan.lib to goodjava
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1347diff
changeset | 11 import goodjava.webserver.Handler; | 
| 
27efb1fcbcb5
move luan.lib to goodjava
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1347diff
changeset | 12 import goodjava.webserver.Request; | 
| 
27efb1fcbcb5
move luan.lib to goodjava
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1347diff
changeset | 13 import goodjava.webserver.Response; | 
| 1604 
8a7519dee55c
FileHandler handles if-modified-since
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 14 import goodjava.webserver.Status; | 
| 1139 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 15 | 
| 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 16 | 
| 1167 | 17 public class FileHandler implements Handler { | 
| 18 final File dir; | |
| 1139 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 19 | 
| 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 20 public FileHandler() { | 
| 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 21 this("."); | 
| 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 22 } | 
| 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 23 | 
| 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 24 public FileHandler(String pathname) { | 
| 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 25 this(new File(pathname)); | 
| 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 26 } | 
| 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 27 | 
| 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 28 public FileHandler(File dir) { | 
| 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 29 if( !dir.isDirectory() ) | 
| 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 30 throw new RuntimeException("must be a directory"); | 
| 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 31 this.dir = dir; | 
| 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 32 } | 
| 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 33 | 
| 1168 | 34 File file(Request request) { | 
| 35 return new File(dir,request.path); | |
| 36 } | |
| 37 | |
| 1139 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 38 public Response handle(Request request) { | 
| 1140 
bf03d687eaff
webserver - add dir handling
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1139diff
changeset | 39 try { | 
| 1168 | 40 File file = file(request); | 
| 41 if( file.isFile() ) { | |
| 42 Response response = new Response(); | |
| 1604 
8a7519dee55c
FileHandler handles if-modified-since
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 43 | 
| 
8a7519dee55c
FileHandler handles if-modified-since
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 44 DateFormat fmt = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z"); | 
| 
8a7519dee55c
FileHandler handles if-modified-since
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 45 fmt.setTimeZone(TimeZone.getTimeZone("GMT")); | 
| 
8a7519dee55c
FileHandler handles if-modified-since
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 46 String lastModified = fmt.format(new Date(file.lastModified())); | 
| 1607 | 47 String ifMod = (String)request.headers.get("If-Modified-Since"); | 
| 1604 
8a7519dee55c
FileHandler handles if-modified-since
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 48 if( ifMod != null ) { | 
| 
8a7519dee55c
FileHandler handles if-modified-since
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 49 try { | 
| 
8a7519dee55c
FileHandler handles if-modified-since
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 50 Date ifModDate = fmt.parse(ifMod); | 
| 
8a7519dee55c
FileHandler handles if-modified-since
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 51 if( ifModDate != null && ifModDate.getTime() >= fmt.parse(lastModified).getTime() ) { | 
| 
8a7519dee55c
FileHandler handles if-modified-since
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 52 response.status = Status.NOT_MODIFIED; | 
| 
8a7519dee55c
FileHandler handles if-modified-since
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 53 return response; | 
| 
8a7519dee55c
FileHandler handles if-modified-since
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 54 } | 
| 
8a7519dee55c
FileHandler handles if-modified-since
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 55 | 
| 
8a7519dee55c
FileHandler handles if-modified-since
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 56 } catch(ParseException e) {} | 
| 
8a7519dee55c
FileHandler handles if-modified-since
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 57 } | 
| 1607 | 58 response.headers.put("Last-Modified",lastModified); | 
| 2008 | 59 response.headers.put("Content-Length",Long.toString(file.length())); | 
| 60 response.body = new FileInputStream(file); | |
| 1168 | 61 return response; | 
| 62 } | |
| 63 return null; | |
| 1140 
bf03d687eaff
webserver - add dir handling
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1139diff
changeset | 64 } catch(IOException e) { | 
| 
bf03d687eaff
webserver - add dir handling
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1139diff
changeset | 65 throw new RuntimeException(e); | 
| 1139 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 66 } | 
| 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 67 } | 
| 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 68 } | 
