Mercurial Hosting > luan
annotate src/goodjava/webserver/handlers/DirHandler.java @ 2019:cbc5a66217d7
windows fix
| author | Franklin Schmidt <fschmidt@gmail.com> | 
|---|---|
| date | Fri, 03 Oct 2025 18:28:21 -0600 | 
| parents | 28cd9b3abdb3 | 
| children | 
| rev | line source | 
|---|---|
| 
1402
 
27efb1fcbcb5
move luan.lib to goodjava
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1347 
diff
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: 
1139 
diff
changeset
 | 
5 import java.io.Writer; | 
| 
 
bf03d687eaff
webserver - add dir handling
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1139 
diff
changeset
 | 
6 import java.io.OutputStreamWriter; | 
| 
 
bf03d687eaff
webserver - add dir handling
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1139 
diff
changeset
 | 
7 import java.io.IOException; | 
| 
 
bf03d687eaff
webserver - add dir handling
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1139 
diff
changeset
 | 
8 import java.text.DateFormat; | 
| 
 
bf03d687eaff
webserver - add dir handling
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1139 
diff
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: 
1139 
diff
changeset
 | 
12 import java.util.Date; | 
| 
1848
 
6f3f1768fdde
html encode dir names
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1617 
diff
changeset
 | 
13 import goodjava.html.Html; | 
| 
1402
 
27efb1fcbcb5
move luan.lib to goodjava
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1347 
diff
changeset
 | 
14 import goodjava.webserver.Handler; | 
| 
 
27efb1fcbcb5
move luan.lib to goodjava
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1347 
diff
changeset
 | 
15 import goodjava.webserver.Request; | 
| 
 
27efb1fcbcb5
move luan.lib to goodjava
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1347 
diff
changeset
 | 
16 import goodjava.webserver.Response; | 
| 
 
27efb1fcbcb5
move luan.lib to goodjava
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1347 
diff
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: 
1402 
diff
changeset
 | 
29 boolean f1IsDir = f1.isDirectory(); | 
| 
 
55d7b60c074d
add DirHandler to WebHandler
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1402 
diff
changeset
 | 
30 boolean f2IsDir = f2.isDirectory(); | 
| 
 
55d7b60c074d
add DirHandler to WebHandler
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1402 
diff
changeset
 | 
31 if( f1IsDir && !f2IsDir ) | 
| 
 
55d7b60c074d
add DirHandler to WebHandler
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1402 
diff
changeset
 | 
32 return -1; | 
| 
 
55d7b60c074d
add DirHandler to WebHandler
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1402 
diff
changeset
 | 
33 if( !f1IsDir && f2IsDir ) | 
| 
 
55d7b60c074d
add DirHandler to WebHandler
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1402 
diff
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: 
1402 
diff
changeset
 | 
42 String path = request.path; | 
| 
 
55d7b60c074d
add DirHandler to WebHandler
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1402 
diff
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: 
1402 
diff
changeset
 | 
49 writer.write( "\t<head>\n" ); | 
| 
 
55d7b60c074d
add DirHandler to WebHandler
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1402 
diff
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: 
1402 
diff
changeset
 | 
52 writer.write( "\t\t<style>\n" ); | 
| 
 
55d7b60c074d
add DirHandler to WebHandler
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1402 
diff
changeset
 | 
53 writer.write( "\t\t\ttd {padding: 2px 8px}\n" ); | 
| 
 
55d7b60c074d
add DirHandler to WebHandler
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1402 
diff
changeset
 | 
54 writer.write( "\t\t\ta {text-decoration: none}\n" ); | 
| 
 
55d7b60c074d
add DirHandler to WebHandler
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1402 
diff
changeset
 | 
55 writer.write( "\t\t\ta:hover {text-decoration: underline}\n" ); | 
| 
 
55d7b60c074d
add DirHandler to WebHandler
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1402 
diff
changeset
 | 
56 writer.write( "\t\t</style>\n" ); | 
| 
 
55d7b60c074d
add DirHandler to WebHandler
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1402 
diff
changeset
 | 
57 writer.write( "\t</head>\n" ); | 
| 
 
55d7b60c074d
add DirHandler to WebHandler
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1402 
diff
changeset
 | 
58 writer.write( "\t<body>\n" ); | 
| 
 
55d7b60c074d
add DirHandler to WebHandler
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1402 
diff
changeset
 | 
59 writer.write( "\t\t<h1>Directory: "+path+"</h1>\n" ); | 
| 
 
55d7b60c074d
add DirHandler to WebHandler
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1402 
diff
changeset
 | 
60 writer.write( "\t\t<table border=0>\n" ); | 
| 
 
55d7b60c074d
add DirHandler to WebHandler
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1402 
diff
changeset
 | 
61 if( !path.equals("/") ) { | 
| 
 
55d7b60c074d
add DirHandler to WebHandler
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1402 
diff
changeset
 | 
62 writer.write( "\t\t\t<tr>\n" ); | 
| 
 
55d7b60c074d
add DirHandler to WebHandler
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1402 
diff
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: 
1402 
diff
changeset
 | 
64 writer.write( "\t\t\t</tr>\n" ); | 
| 
 
55d7b60c074d
add DirHandler to WebHandler
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1402 
diff
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: 
1617 
diff
changeset
 | 
70 name = Html.encode(name); | 
| 
1602
 
55d7b60c074d
add DirHandler to WebHandler
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1402 
diff
changeset
 | 
71 boolean isDir = child.isDirectory(); | 
| 
 
55d7b60c074d
add DirHandler to WebHandler
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1402 
diff
changeset
 | 
72 if( isDir ) | 
| 1168 | 73 name += '/'; | 
| 
1602
 
55d7b60c074d
add DirHandler to WebHandler
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1402 
diff
changeset
 | 
74 writer.write( "\t\t\t<tr>\n" ); | 
| 
1848
 
6f3f1768fdde
html encode dir names
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1617 
diff
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: 
1402 
diff
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: 
1402 
diff
changeset
 | 
77 if( !isDir ) | 
| 
 
55d7b60c074d
add DirHandler to WebHandler
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1402 
diff
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: 
1402 
diff
changeset
 | 
79 writer.write( "\t\t\t</tr>\n" ); | 
| 1168 | 80 } | 
| 
1602
 
55d7b60c074d
add DirHandler to WebHandler
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1402 
diff
changeset
 | 
81 writer.write( "\t\t</table>\n" ); | 
| 
 
55d7b60c074d
add DirHandler to WebHandler
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1402 
diff
changeset
 | 
82 writer.write( "\t</body>\n" ); | 
| 
 
55d7b60c074d
add DirHandler to WebHandler
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1402 
diff
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 } | 
