/* neon - Embeddable HTTP Server based on jdk.httpserver Copyright (C) 2024 Ulrich Hilger This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package de.uhilger.neon; import com.sun.net.httpserver.HttpExchange; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Helfer fuer HTTP-Methoden * * @author Ulrich Hilger * @version 1, 01.06.2021 */ public class HttpHelper { /* HTTP Methoden */ public static final String HTTP_GET = "GET"; public static final String HTTP_POST = "POST"; public static final String HTTP_PUT = "PUT"; public static final String HTTP_DELETE = "DELETE"; public static final String STR_AMP = "&"; public static final String STR_EQUAL = "="; //public static final String CONTENT_TYPE = "Content-Type"; public static final String CT_JSON = "application/json; charset=UTF-8"; public static final String CT_TEXT_HTML = "text/html"; /** * Den Namen der gewünschten Datei aus der HTTP-Anfrage ermitteln * * @param e das Objekt mit Methoden zur Untersuchung der Anfrage sowie zum * Anfertigen und Senden der Antwort * @return Name der gewünschten Datei */ public String getFileName(HttpExchange e) { String ctxPath = e.getHttpContext().getPath(); String uriPath = e.getRequestURI().getPath(); return uriPath.substring(ctxPath.length()); } public String bodyLesen(HttpExchange exchange) throws IOException { StringBuilder sb = new StringBuilder(); InputStream is = exchange.getRequestBody(); BufferedReader in = new BufferedReader(new InputStreamReader(is)); String line = in.readLine(); while (line != null) { sb.append(line); line = in.readLine(); } return sb.toString(); } /*public String getAttrStr(Map attributes, String key, String defaultValue) { Object value = attributes.get(key); if(value instanceof String) { return value.toString(); } else { return defaultValue; } } */ public Map getQueryMap(HttpExchange exchange) { if(exchange.getRequestMethod().equalsIgnoreCase("GET")) { return getQueryMap(exchange.getRequestURI().getQuery()); } else { try { return getQueryMap(bodyLesen(exchange)); } catch (IOException ex) { return new HashMap<>(); } } } public Map getQueryMap(String query) { Map map = new HashMap<>(); if(query instanceof String) { String[] params = query.split(STR_AMP); for (String param : params) { String name = param.split(STR_EQUAL)[0]; String value = param.split(STR_EQUAL)[1]; map.put(name, value); } } else { // map bleibt leer } return map; } /*public String getRouteString(HttpExchange exchange) { return exchange.getRequestURI().getPath() .substring(exchange.getHttpContext().getPath().length()); }*/ public String getRouteString(HttpExchange exchange) { return getFileName(exchange); } public List getRouteList(String routeString) { return Arrays.asList(routeString.split("/")); } /* public File tryWelcomeFiles(HttpExchange e, String fName) { boolean notFound = true; File file = null; String fileBase = e.getHttpContext().getAttributes().get(FileHandler.ATTR_FILE_BASE).toString(); Object welcomeFiles = e.getHttpContext().getAttributes().get(FileHandler.ATTR_WELCOME_FILES); if(welcomeFiles instanceof String) { String[] fileNames = welcomeFiles.toString().split(FileHandler.STR_COMMA); int i = -1; while(notFound && ++i < fileNames.length) { file = new File(fileBase, fName + fileNames[i]); if(file.exists()) { notFound = false; } } } if(notFound) { file = new File(fileBase, fName + FileHandler.WELCOME_FILE); } return file; } */ }