Mercurial Hosting > luan
annotate src/goodjava/webserver/handlers/DirHandler.java @ 2015:61b0cc7db09c fixssl
Manually specify letsencrypt server due to acme default server change (to zerossl)
| author | Violet7 | 
|---|---|
| date | Sat, 27 Sep 2025 13:37:11 -0700 | 
| parents | 28cd9b3abdb3 | 
| 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.Writer; | 
| 
bf03d687eaff
webserver - add dir handling
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1139diff
changeset | 6 import java.io.OutputStreamWriter; | 
| 
bf03d687eaff
webserver - add dir handling
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1139diff
changeset | 7 import java.io.IOException; | 
| 
bf03d687eaff
webserver - add dir handling
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1139diff
changeset | 8 import java.text.DateFormat; | 
| 
bf03d687eaff
webserver - add dir handling
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1139diff
changeset | 9 import java.text.SimpleDateFormat; | 
| 1273 | 10 import java.util.Arrays; | 
| 11 import java.util.Comparator; | |
| 1140 
bf03d687eaff
webserver - add dir handling
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1139diff
changeset | 12 import java.util.Date; | 
| 1848 
6f3f1768fdde
html encode dir names
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1617diff
changeset | 13 import goodjava.html.Html; | 
| 1402 
27efb1fcbcb5
move luan.lib to goodjava
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1347diff
changeset | 14 import goodjava.webserver.Handler; | 
| 
27efb1fcbcb5
move luan.lib to goodjava
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1347diff
changeset | 15 import goodjava.webserver.Request; | 
| 
27efb1fcbcb5
move luan.lib to goodjava
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1347diff
changeset | 16 import goodjava.webserver.Response; | 
| 
27efb1fcbcb5
move luan.lib to goodjava
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1347diff
changeset | 17 import goodjava.webserver.ResponseOutputStream; | 
| 1139 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 18 | 
| 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 19 | 
| 1168 | 20 public final class DirHandler implements Handler { | 
| 21 private final FileHandler fileHandler; | |
| 1139 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 22 | 
| 1168 | 23 public DirHandler(FileHandler fileHandler) { | 
| 24 this.fileHandler = fileHandler; | |
| 1139 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 25 } | 
| 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 26 | 
| 1273 | 27 private static final Comparator<File> sorter = new Comparator<File>() { | 
| 28 public int compare(File f1, File f2) { | |
| 1602 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 29 boolean f1IsDir = f1.isDirectory(); | 
| 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 30 boolean f2IsDir = f2.isDirectory(); | 
| 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 31 if( f1IsDir && !f2IsDir ) | 
| 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 32 return -1; | 
| 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 33 if( !f1IsDir && f2IsDir ) | 
| 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 34 return 1; | 
| 1273 | 35 return f1.getName().compareTo(f2.getName()); | 
| 36 } | |
| 37 }; | |
| 38 | |
| 1168 | 39 public Response handle(Request request) { | 
| 40 try { | |
| 41 File file = fileHandler.file(request); | |
| 1602 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 42 String path = request.path; | 
| 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 43 if( path.endsWith("/") && file.isDirectory() ) { | 
| 1168 | 44 DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss zzz"); | 
| 45 Response response = new Response(); | |
| 1607 | 46 response.headers.put( "Content-Type", "text/html; charset=utf-8" ); | 
| 1168 | 47 Writer writer = new OutputStreamWriter( new ResponseOutputStream(response) ); | 
| 1931 | 48 writer.write( "<!doctype html>\n<html lang=\"en\">\n" ); | 
| 1602 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 49 writer.write( "\t<head>\n" ); | 
| 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 50 writer.write( "\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n" ); | 
| 1617 | 51 writer.write( "\t\t<meta name=\"robots\" content=\"noindex,nofollow\">\n" ); | 
| 1602 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 52 writer.write( "\t\t<style>\n" ); | 
| 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 53 writer.write( "\t\t\ttd {padding: 2px 8px}\n" ); | 
| 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 54 writer.write( "\t\t\ta {text-decoration: none}\n" ); | 
| 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 55 writer.write( "\t\t\ta:hover {text-decoration: underline}\n" ); | 
| 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 56 writer.write( "\t\t</style>\n" ); | 
| 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 57 writer.write( "\t</head>\n" ); | 
| 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 58 writer.write( "\t<body>\n" ); | 
| 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 59 writer.write( "\t\t<h1>Directory: "+path+"</h1>\n" ); | 
| 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 60 writer.write( "\t\t<table border=0>\n" ); | 
| 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 61 if( !path.equals("/") ) { | 
| 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 62 writer.write( "\t\t\t<tr>\n" ); | 
| 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 63 writer.write( "\t\t\t\t<td><a href='..'>../</a></td>\n" ); | 
| 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 64 writer.write( "\t\t\t</tr>\n" ); | 
| 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 65 } | 
| 1273 | 66 File[] a = file.listFiles(); | 
| 67 Arrays.sort(a,sorter); | |
| 68 for( File child : a ) { | |
| 1168 | 69 String name = child.getName(); | 
| 1848 
6f3f1768fdde
html encode dir names
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1617diff
changeset | 70 name = Html.encode(name); | 
| 1602 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 71 boolean isDir = child.isDirectory(); | 
| 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 72 if( isDir ) | 
| 1168 | 73 name += '/'; | 
| 1602 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 74 writer.write( "\t\t\t<tr>\n" ); | 
| 1848 
6f3f1768fdde
html encode dir names
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1617diff
changeset | 75 writer.write( "\t\t\t\t<td><a href=\""+name+"\">"+name+"</a></td>\n" ); | 
| 1602 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 76 writer.write( "\t\t\t\t<td>"+fmt.format(new Date(child.lastModified()))+"</td>\n" ); | 
| 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 77 if( !isDir ) | 
| 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 78 writer.write( "\t\t\t\t<td align=right>"+child.length()+" bytes</td>\n" ); | 
| 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 79 writer.write( "\t\t\t</tr>\n" ); | 
| 1168 | 80 } | 
| 1602 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 81 writer.write( "\t\t</table>\n" ); | 
| 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 82 writer.write( "\t</body>\n" ); | 
| 
55d7b60c074d
add DirHandler to WebHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: 
1402diff
changeset | 83 writer.write( "</html>\n" ); | 
| 1168 | 84 writer.close(); | 
| 85 return response; | |
| 1139 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 86 } | 
| 1168 | 87 return null; | 
| 88 } catch(IOException e) { | |
| 89 throw new RuntimeException(e); | |
| 1139 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 90 } | 
| 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 91 } | 
| 
8126370ea8c0
webserver - add FileHandler
 Franklin Schmidt <fschmidt@gmail.com> parents: diff
changeset | 92 } | 
