/*
|
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 <https://www.gnu.org/licenses/>.
|
*/
|
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 fixFileName(uriPath.substring(ctxPath.length()));
|
}
|
|
public String fixFileName(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<String, String> 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<String, String> getQueryMap(String query) {
|
Map<String, String> 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<String> getRouteList(String routeString) {
|
return Arrays.asList(routeString.split("/"));
|
}
|
}
|