From d0bb217f9fd72ff981c1e96aac9d7d87006d7736 Mon Sep 17 00:00:00 2001 From: ulrich Date: Fri, 26 Mar 2021 17:32:26 +0000 Subject: [PATCH] Kommentare und Dokumentation ergaenzt --- src/de/uhilger/minsrv/App.java | 83 +++++++++++--------- src/de/uhilger/minsrv/handler/FileHandler.java | 73 +++++++++++------ src/de/uhilger/minsrv/handler/StopServerHandler.java | 3 src/de/uhilger/minsrv/Server.java | 24 +++++- README.md | 24 ++++++ 5 files changed, 137 insertions(+), 70 deletions(-) diff --git a/README.md b/README.md new file mode 100644 index 0000000..51bf032 --- /dev/null +++ b/README.md @@ -0,0 +1,24 @@ + +# Mini-Server + +Ein minimalistischer HTTP-Server auf der Basis der Java-Package [`com.sun.net.httpserver`](https://docs.oracle.com/en/java/javase/11/docs/api/jdk.httpserver/com/sun/net/httpserver/package-summary.html). + +## Nutzungsvoraussetzungen + +Zur Ausführung des Mini-Server wird eine Java-Ablaufumgebung (Java Runtime Environment, JRE) benötigt. Auf der Kommandozeile kann mit dem folgenden Kommando ermittelt werden ob das JRE vorhanden ist. + +``` +java -version +``` + +Andernfalls kann es beispielsweise von folgenden Webseiten geladen werden: + +. [Azul](https://www.azul.com/downloads/zulu-community/) oder +. [AdoptOpenJDK](https://adoptopenjdk.net/) + + +## Nutzung + +Hier noch beschreiben + + diff --git a/src/de/uhilger/minsrv/App.java b/src/de/uhilger/minsrv/App.java index f7ccbcf..c49f385 100644 --- a/src/de/uhilger/minsrv/App.java +++ b/src/de/uhilger/minsrv/App.java @@ -14,8 +14,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. -*/ - + */ package de.uhilger.minsrv; import java.io.IOException; @@ -25,76 +24,84 @@ /** * Die Hauptklasse des mini-server - * + * * @author Ulrich Hilger * @version 0.1, 25.03.2021 */ public class App { private static final Logger logger = Logger.getLogger(App.class.getName()); - + public static final String IP_PORT = "port"; public static final String IP_WWW_DATA = "www-data"; public static final String IP_CTX = "ctx"; - - private static HashMap initParams; - + + private static HashMap initParams; + /** * Start-Methode dieser Anwendung - * - * Folgende Kommandozeilenparameter werden verarbeitet - * ctx - Kontext des Servers - * www-data - lokales Datenverzeichnis - * port - Port - * - * Beispiel: - * java -jar mini-server.jar ctx="srv" www-data="/home/fred/www" port=9090 - * - * Startet den Server auf http://localhost:9090/srv - * und liefert Inhalte aus dem Verzeichnis /home/fred/www aus. - * - * Ein Aufruf von http://localhost:9090/srv/pfad/zum/inhalt/index.html - * liefert also die Datei 'index.html' aus dem Ordner - * /home/fred/www/pfad/zum/inhalt aus. - * + * + * Folgende Kommandozeilenparameter werden verarbeitet ctx - Kontext des + * Servers www-data - lokales Datenverzeichnis port - Port + * + * Beispiel: java -jar mini-server.jar ctx="srv" www-data="/home/fred/www" + * port=9090 + * + * Startet den Server auf http://localhost:9090/srv und liefert Inhalte aus + * dem Verzeichnis /home/fred/www aus. + * + * Ein Aufruf von http://localhost:9090/srv/pfad/zum/inhalt/index.html liefert + * also die Datei 'index.html' aus dem Ordner /home/fred/www/pfad/zum/inhalt + * aus. + * * @param args Kommandozeilenparameter */ public static void main(String[] args) { initParams = new HashMap(); - for(String arg: args) { + for (String arg : args) { String[] argParts = arg.split("="); initParams.put(argParts[0], argParts[1]); } - - Server server = new Server(Integer.parseInt(getInitParameter(IP_PORT))); - try { - server.setContextName(getInitParameter(IP_CTX)); - server.start(); - } catch (IOException ex) { - Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex); + + String portStr = getInitParameter(IP_PORT); + if (portStr != null) { + Server server = new Server(Integer.parseInt(portStr)); + try { + String ctxName = getInitParameter(IP_CTX); + if (ctxName != null) { + server.setContextName(ctxName); + server.start(); + } else { + logger.severe("Der Parameter " + IP_CTX + " muss angegeben werden."); + } + } catch (IOException ex) { + Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex); + } + } else { + logger.severe("Der Parameter " + IP_PORT + " muss angegeben werden."); } } - + /** * Diese Anwendung stoppen */ public static void stop() { System.exit(0); } - + /** * Einen Kommandozeilenparameter ermitteln - * + * * @param pname Names des Parameters - * @return Inhalt des Parameters oder null, wenn der Parameter - * nicht gefunden wurde + * @return Inhalt des Parameters oder null, wenn der Parameter nicht gefunden + * wurde */ public static String getInitParameter(String pname) { String param = null; Object o = initParams.get(pname); - if(o != null) { + if (o != null) { param = o.toString(); } return param; - } + } } diff --git a/src/de/uhilger/minsrv/Server.java b/src/de/uhilger/minsrv/Server.java index 6935d9a..89e425f 100644 --- a/src/de/uhilger/minsrv/Server.java +++ b/src/de/uhilger/minsrv/Server.java @@ -37,10 +37,17 @@ private static final Logger logger = Logger.getLogger(Server.class.getName()); + public static final String STR_SLASH = "/"; + + private int port; - private String ctxName; + private String ctx; + /** + * Ein neues Objekt der Kalsse Server erzeugen + * @param port der Port, über den dieser Server erreichbar sein soll + */ public Server(int port) { this.port = port; } @@ -54,8 +61,17 @@ this.port = port; } + /** + * Den Namen des Kontexts angeben, über den dieser Server + * erreichbar sein soll + * @param ctxName + */ public void setContextName(String ctxName) { - this.ctxName = ctxName; + if(!ctxName.startsWith(STR_SLASH)) { + this.ctx = STR_SLASH + ctxName; + } else { + this.ctx = ctxName; + } } /** @@ -69,8 +85,8 @@ logger.info("Server starting on port " + port); HttpServer server = HttpServer.create(new InetSocketAddress(port), 0); - server.createContext(ctxName + "/av", new FileHandler(App.getInitParameter(App.IP_WWW_DATA))); - server.createContext(ctxName + "/server/stop", new StopServerHandler()); + server.createContext(ctx + "/av", new FileHandler(App.getInitParameter(App.IP_WWW_DATA))); + server.createContext(ctx + "/server/stop", new StopServerHandler()); server.setExecutor(Executors.newFixedThreadPool(20)); server.start(); } diff --git a/src/de/uhilger/minsrv/handler/FileHandler.java b/src/de/uhilger/minsrv/handler/FileHandler.java index d566db4..f1eb4ef 100644 --- a/src/de/uhilger/minsrv/handler/FileHandler.java +++ b/src/de/uhilger/minsrv/handler/FileHandler.java @@ -20,6 +20,7 @@ import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; +import de.uhilger.minsrv.Server; import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -67,7 +68,6 @@ public static final String STR_BLANK = " "; public static final String STR_DASH = "-"; public static final String STR_COMMA = ","; - public static final String STR_SLASH = "/"; public static final String STR_DOT = "."; public static final String STR_NOT_FOUND = " not found."; public static final String LM_PATTERN = "EEE, dd MMM yyyy HH:mm:ss zzz"; @@ -109,7 +109,7 @@ if (headers.containsKey(RANGE_HEADER)) { serveFileParts(e, new File(basePath, fName)); } else { - if (fName.endsWith(STR_SLASH)) { + if (fName.endsWith(Server.STR_SLASH)) { fName += WELCOME_FILE; } serveFile(e, new File(basePath, fName)); @@ -206,29 +206,6 @@ } } - private String contentRangeHdr(Range range, File file) { - StringBuilder sb = new StringBuilder(); - sb.append(STR_BYTES); - sb.append(STR_BLANK); - sb.append(range.getStart()); - sb.append(STR_DASH); - sb.append(range.getEnd()); - sb.append(STR_SLASH); - sb.append(file.length()); - return sb.toString(); - } - - private void setCommonHeaders(Headers resHeaders, File file) throws IOException { - resHeaders.add(ACCEPT_RANGES_HEADER, STR_BYTES); - String mimeType = Files.probeContentType(file.toPath()); - if (mimeType != null) { - resHeaders.add(CONTENT_TYPE, mimeType); - } - SimpleDateFormat sdf = new SimpleDateFormat(LM_PATTERN); - Date date = new Date(file.lastModified()); - resHeaders.add(LAST_MODIFIED_DATE_HEADER, sdf.format(date)); - } - /** * Die Byte-Ranges aus dem Range-Header ermitteln. * @@ -302,6 +279,46 @@ } /** + * Einen Content-Range Header erzeugen + * + * @param range die Range, aus deren Inhalt der Header erzeugt werden soll + * @param file die Datei, die den Inhalt liefert, der vom Header + * bezeichnet wird + * @return der Inhalt des Content-Range Headers + */ + private String contentRangeHdr(Range range, File file) { + StringBuilder sb = new StringBuilder(); + sb.append(STR_BYTES); + sb.append(STR_BLANK); + sb.append(range.getStart()); + sb.append(STR_DASH); + sb.append(range.getEnd()); + sb.append(Server.STR_SLASH); + sb.append(file.length()); + return sb.toString(); + } + + /** + * Die Header erzeugen, die unabhängig davon, ob der ganze + * Inhalt oder nur Teile davon ausgeliefert werden sollen, in der + * Antwort stehen sollen + * + * @param resHeaders das Objekt, in das die Header erzeugt werden + * @param file die Datei, für die die Header gelten + * @throws IOException falls etwas schief geht entsteht dieser Fehler + */ + private void setCommonHeaders(Headers resHeaders, File file) throws IOException { + resHeaders.add(ACCEPT_RANGES_HEADER, STR_BYTES); + String mimeType = Files.probeContentType(file.toPath()); + if (mimeType != null) { + resHeaders.add(CONTENT_TYPE, mimeType); + } + SimpleDateFormat sdf = new SimpleDateFormat(LM_PATTERN); + Date date = new Date(file.lastModified()); + resHeaders.add(LAST_MODIFIED_DATE_HEADER, sdf.format(date)); + } + + /** * Eine nicht gefunden Antwort senden * * @param e das Objekt mit Methoden zur Untersuchung der Anfrage sowie zum @@ -309,7 +326,7 @@ * @param fname Name der Datei, die nicht gefunden wurde * @throws IOException falls etwas schief geht entsteht dieser Fehler */ - public void sendNotFound(HttpExchange e, String fname) throws IOException { + private void sendNotFound(HttpExchange e, String fname) throws IOException { OutputStream os = e.getResponseBody(); String response = fname + STR_NOT_FOUND; byte[] bytes = response.getBytes(StandardCharsets.UTF_8); @@ -320,7 +337,9 @@ } /** - * Eine Range + * Eine Range bezeichnet einen zusammenhängenden Bereich + * aus Bytes, der sich aus den Bytepositionen des Beginns und Endes + * des Bereiches ergibt. */ class Range { diff --git a/src/de/uhilger/minsrv/handler/StopServerHandler.java b/src/de/uhilger/minsrv/handler/StopServerHandler.java index 52f2d94..e1960dd 100644 --- a/src/de/uhilger/minsrv/handler/StopServerHandler.java +++ b/src/de/uhilger/minsrv/handler/StopServerHandler.java @@ -26,7 +26,8 @@ import java.util.logging.Logger; /** - * + * Ein HTTP-Handler zum Stoppen der Anwendung + * * @author Ulrich Hilger */ public class StopServerHandler implements HttpHandler { -- Gitblit v1.9.3