/*
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
* @throws IllegalArgumentException wenn der Dateiname ungueltige Zeichen
* enthaelt, z.B. ../
*/
public String getFileName(HttpExchange e) throws IllegalArgumentException {
String ctxPath = e.getHttpContext().getPath();
String uriPath = e.getRequestURI().getPath();
return inspectFileName(uriPath.substring(ctxPath.length()));
}
public String inspectFileName(String fileName) throws IllegalArgumentException {
if (fileName == null
|| fileName.contains("..")) {
//|| fileName.contains("/")
//|| fileName.contains("\\")) {
throw new IllegalArgumentException("Invalid file name");
}
return fileName;
}
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 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<>();
try {
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
}
} catch(Exception ex) {
} finally {
return map;
}
}
public String getRouteString(HttpExchange exchange) {
return getFileName(exchange);
}
public List getRouteList(String routeString) {
return Arrays.asList(routeString.split("/"));
}
}