From 835e566151007785a3c6e85508161c5d6d40964e Mon Sep 17 00:00:00 2001 From: FrozenCow Date: Sun, 13 Feb 2011 02:56:00 +0100 Subject: [PATCH] Some improvements to HttpServer. --- .../java/org/dynmap/web/HttpServerConnection.java | 11 ++++++++++- .../java/org/dynmap/web/handlers/FileHandler.java | 6 ++++-- .../org/dynmap/web/handlers/FilesystemHandler.java | 10 ++++++++-- .../java/org/dynmap/web/handlers/JarFileHandler.java | 5 ++++- 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/dynmap/web/HttpServerConnection.java b/src/main/java/org/dynmap/web/HttpServerConnection.java index 5fefc144..1ffec3ee 100644 --- a/src/main/java/org/dynmap/web/HttpServerConnection.java +++ b/src/main/java/org/dynmap/web/HttpServerConnection.java @@ -13,6 +13,8 @@ import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.dynmap.debug.Debug; + public class HttpServerConnection extends Thread { protected static final Logger log = Logger.getLogger("Minecraft"); @@ -121,7 +123,14 @@ public class HttpServerConnection extends Thread { if (response.fields.get("Content-Length") == null) { response.fields.put("Content-Length", "0"); - /* OutputStream out = */response.getBody(); + OutputStream out = response.getBody(); + + // The HttpHandler has already send the headers and written to the body without setting the Content-Length. + if (out == null) { + Debug.debug("Response was not cleanly handled by '" + handler + "' for path '" + request.path + "'"); + socket.close(); + return; + } } String connection = response.fields.get("Connection"); diff --git a/src/main/java/org/dynmap/web/handlers/FileHandler.java b/src/main/java/org/dynmap/web/handlers/FileHandler.java index cd4ce2ba..17f05afa 100644 --- a/src/main/java/org/dynmap/web/handlers/FileHandler.java +++ b/src/main/java/org/dynmap/web/handlers/FileHandler.java @@ -30,7 +30,7 @@ public abstract class FileHandler implements HttpHandler { return "application/octet-steam"; } - protected abstract InputStream getFileInput(String path); + protected abstract InputStream getFileInput(String path, HttpRequest request, HttpResponse response); protected String getExtension(String path) { int dotindex = path.lastIndexOf('.'); @@ -60,10 +60,12 @@ public abstract class FileHandler implements HttpHandler { InputStream fileInput = null; try { path = formatPath(path); - fileInput = getFileInput(path); + fileInput = getFileInput(path, request, response); if (fileInput == null) { response.statusCode = 404; response.statusMessage = "Not found"; + response.fields.put("Content-Length", "0"); + response.getBody(); return; } diff --git a/src/main/java/org/dynmap/web/handlers/FilesystemHandler.java b/src/main/java/org/dynmap/web/handlers/FilesystemHandler.java index b6794098..96d8858b 100644 --- a/src/main/java/org/dynmap/web/handlers/FilesystemHandler.java +++ b/src/main/java/org/dynmap/web/handlers/FilesystemHandler.java @@ -5,6 +5,9 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; +import org.dynmap.web.HttpRequest; +import org.dynmap.web.HttpResponse; + public class FilesystemHandler extends FileHandler { private File root; @@ -14,14 +17,17 @@ public class FilesystemHandler extends FileHandler { this.root = root; } @Override - protected InputStream getFileInput(String path) { + protected InputStream getFileInput(String path, HttpRequest request, HttpResponse response) { File file = new File(root, path); if (file.getAbsolutePath().startsWith(root.getAbsolutePath()) && file.isFile()) { + FileInputStream result; try { - return new FileInputStream(file); + result = new FileInputStream(file); } catch (FileNotFoundException e) { return null; } + response.fields.put("Content-Length", Long.toString(file.length())); + return result; } return null; } diff --git a/src/main/java/org/dynmap/web/handlers/JarFileHandler.java b/src/main/java/org/dynmap/web/handlers/JarFileHandler.java index 3d1b21d9..abcb8e56 100644 --- a/src/main/java/org/dynmap/web/handlers/JarFileHandler.java +++ b/src/main/java/org/dynmap/web/handlers/JarFileHandler.java @@ -2,6 +2,9 @@ package org.dynmap.web.handlers; import java.io.InputStream; +import org.dynmap.web.HttpRequest; +import org.dynmap.web.HttpResponse; + public class JarFileHandler extends FileHandler { private String root; @@ -10,7 +13,7 @@ public class JarFileHandler extends FileHandler { this.root = root; } @Override - protected InputStream getFileInput(String path) { + protected InputStream getFileInput(String path, HttpRequest request, HttpResponse response) { return this.getClass().getResourceAsStream(root + "/" + path); } } \ No newline at end of file