diff --git a/src/de/tudbut/tryumph/example/FileServer.java b/src/de/tudbut/tryumph/example/FileServer.java
index 9b9d1ee..640d2c5 100644
--- a/src/de/tudbut/tryumph/example/FileServer.java
+++ b/src/de/tudbut/tryumph/example/FileServer.java
@@ -1,5 +1,6 @@
package de.tudbut.tryumph.example;
+import java.io.File;
import java.net.Socket;
import org.w3c.dom.Document;
@@ -58,28 +59,28 @@ public class FileServer implements IRequestCatcher, RequestHandler.Listener {
private String fileContent(Request request, String s) {
String r;
- if(!s.endsWith(".html") && !s.endsWith(".htm")) {
- r = request.context.file(s);
+ if(new File(s + "/index.html").exists())
+ s += "/index.html";
+ if(!s.endsWith(".html") && !s.endsWith(".htm") && !(new File(s).isDirectory())) {
+ r = request.context.file(s, data.getBoolean("autoindex") ? request.realPath : null);
r = "
" + r.replace("<", "<").replace(">", ">") + "
";
}
else
- r = request.context.fileUTF(s);
+ r = request.context.fileUTF(s, data.getBoolean("autoindex") ? request.realPath : null);
return r;
}
@GET
- @Path(".*/")
- public void onIndex(Request request, Callback res, Callback rej) {
- res.call(new Response(request, fileContent(request, data.getString("dir") + request.realPath.replace("..", "") + "/index.html"), 200, "OK"));
- }
-
- @GET
- @Path("/.+")
+ @Path("/.*")
public void onFile(Request request, Callback res, Callback rej) {
if(request.realPath.equals("/style.css")) {
res.call(new Response(request, request.context.file("style.css"), 200, "OK", "text/css"));
return;
}
+ if(request.realPath.matches("/.$|/./|/..$|/../")) {
+ res.call(new Response(request, "" + request.realPath + " is an illegal path
", 400, "Bad request"));
+ return;
+ }
res.call(new Response(request, fileContent(request, data.getString("dir") + request.realPath.replace("..", "")), 200, "OK"));
}
diff --git a/src/de/tudbut/tryumph/server/BrowserContext.java b/src/de/tudbut/tryumph/server/BrowserContext.java
index 09838d7..9789729 100644
--- a/src/de/tudbut/tryumph/server/BrowserContext.java
+++ b/src/de/tudbut/tryumph/server/BrowserContext.java
@@ -3,6 +3,7 @@ package de.tudbut.tryumph.server;
import static de.tudbut.async.Async.*;
import java.io.ByteArrayOutputStream;
+import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -124,20 +125,36 @@ public class BrowserContext {
private static final HashMap cache = new HashMap<>();
public String file(String file) {
+ return file(file, null);
+ }
+ public String fileUTF(String file) {
+ return fileUTF(file, null);
+ }
+ public String file(String file, String path) {
if(cache.containsKey(file))
return cache.get(file);
StringBuilder builder = new StringBuilder();
try {
InputStream stream = requestCatcher.getClass().getClassLoader().getResourceAsStream(file);
- if(stream == null)
+ if(stream == null) {
+ if(new File(file).isDirectory() && path != null) {
+ File[] files = new File(file).listFiles();
+ builder.append("");
+ return builder.toString();
+ }
stream = new FileInputStream(file);
+ int i = 0;
+ while((i = stream.read()) != -1) {
+ builder.append((char) i);
+ }
- int i = 0;
- while((i = stream.read()) != -1) {
- builder.append((char) i);
+ stream.close();
}
- stream.close();
if(!TryConfig.nocache)
cache.put(file, builder.toString());
} catch (IOException e) {
@@ -146,24 +163,35 @@ public class BrowserContext {
}
return builder.toString();
}
- public String fileUTF(String file) {
+ public String fileUTF(String file, String path) {
if(cache.containsKey(file))
return cache.get(file);
String st = null;
try {
InputStream stream = requestCatcher.getClass().getClassLoader().getResourceAsStream(file);
- if(stream == null)
+ if(stream == null) {
+ if(new File(file).isDirectory() && path != null) {
+ File[] files = new File(file).listFiles();
+ StringBuilder builder = new StringBuilder();
+ builder.append("");
+ return builder.toString();
+ }
stream = new FileInputStream(file);
- ByteArrayOutputStream s = new ByteArrayOutputStream();
+ ByteArrayOutputStream s = new ByteArrayOutputStream();
- int i = 0;
- while((i = stream.read()) != -1) {
- s.write(i);
+ int i = 0;
+ while((i = stream.read()) != -1) {
+ s.write(i);
+ }
+
+ stream.close();
+ s.close();
+ st = new String(s.toByteArray());
}
-
- stream.close();
- s.close();
- st = new String(s.toByteArray());
if(!TryConfig.nocache)
cache.put(file, st);
} catch (IOException e) {