From 63bcdeba5812d7347e2e85302fcf052618e74fcd Mon Sep 17 00:00:00 2001
From: ulrich
Date: Mon, 19 Feb 2024 13:29:08 +0000
Subject: [PATCH] Handler unterscheidet, ob eine Action die Antwort gibt oder nicht
---
src/de/uhilger/neon/Handler.java | 39 +++++++++++++++----
src/de/uhilger/neon/Action.java | 1
src/de/uhilger/neon/HttpHelper.java | 25 +++++++-----
3 files changed, 46 insertions(+), 19 deletions(-)
diff --git a/src/de/uhilger/neon/Action.java b/src/de/uhilger/neon/Action.java
index 23c5d8c..a95c2a5 100644
--- a/src/de/uhilger/neon/Action.java
+++ b/src/de/uhilger/neon/Action.java
@@ -44,4 +44,5 @@
Type type() default Type.GET;
String[] handler();
String route();
+ boolean handlesResponse();
}
diff --git a/src/de/uhilger/neon/Handler.java b/src/de/uhilger/neon/Handler.java
index 05230c4..44c3b0d 100644
--- a/src/de/uhilger/neon/Handler.java
+++ b/src/de/uhilger/neon/Handler.java
@@ -105,11 +105,11 @@
*/
@Override
public void handle(HttpExchange exchange) throws IOException {
- HttpHelper hh = new HttpHelper();
+ HttpHelper hh = new HttpHelper();
String route = hh.getRouteString(exchange);
Type requestMethod = Type.valueOf(exchange.getRequestMethod());
- Map queryParams = hh.getQueryMap(exchange);
- Object o;
+ //Map queryParams = hh.getQueryMap(exchange);
+ //Object o;
/*
Es wird erst geprueft, ob zu einer bestimmten Route
@@ -117,7 +117,9 @@
Route existiert, wird geprueft, ob ein Actor
mit der Route '/' vorhanden ist.
*/
- o = dispatcher.get(requestMethod).get(route);
+ Object md = dispatcher.get(requestMethod);
+ if(md instanceof Map) {
+ Object o = ((Map) md).get(route);
if (!(o instanceof String)) {
o = dispatcher.get(requestMethod).get("/");
}
@@ -131,11 +133,13 @@
Action action = method.getAnnotation(Action.class);
if (action != null) {
if (action.route().equals("/") || action.route().equals(route)) {
- Object[] actionArgs = getActionArgs(exchange, method, queryParams);
+ Object[] actionArgs = getActionArgs(exchange, method/*, queryParams*/);
Object actorObj = actorClass.getDeclaredConstructor().newInstance();
addDataProvider(exchange, actorObj);
Object antwort = method.invoke(actorObj, actionArgs);
- respond(exchange, antwort);
+ if(!action.handlesResponse()) {
+ respond(exchange, antwort);
+ }
}
}
}
@@ -143,13 +147,30 @@
// Klasse nicht gefunden. Muss das geloggt oder sonstwie behandel werden?
}
}
+ }
}
- private Object[] getActionArgs(HttpExchange exchange, Method method, Map queryParams) {
- Object[] actionArgs = new Object[method.getParameterCount()];
- int k = 0;
+ private Object[] getActionArgs(HttpExchange exchange, Method method/*, Map queryParams*/) {
+ int count = method.getParameterCount();
Parameter[] methodParams = method.getParameters();
+ Object[] actionArgs = new Object[count];
+ Map queryParams = new HashMap();
+ /*
+ Lesen des Body der Anfrage geht nur einmal.
+
+ bodyLesen soll nur in getQueryMap gerufen werden, wenn
+ die Liste der Parameter mehr als einen Parameter umfasst
+ oder wenn es nur ein Parameter ist, der nicht
+ der HttpExchange ist.
+
+ Anderenfalls sollte erst der Actor den Body aus dem
+ HttpExchange lesen und nicht hier schon der Handler.
+ */
+ if(count > 1 || !methodParams[0].getType().equals(HttpExchange.class)) {
+ queryParams = new HttpHelper().getQueryMap(exchange);
+ }
+ int k = 0;
for (Parameter methodParam : methodParams) {
if (methodParam.getType().equals(HttpExchange.class)) {
actionArgs[k] = exchange;
diff --git a/src/de/uhilger/neon/HttpHelper.java b/src/de/uhilger/neon/HttpHelper.java
index 05dcba8..bedb90e 100644
--- a/src/de/uhilger/neon/HttpHelper.java
+++ b/src/de/uhilger/neon/HttpHelper.java
@@ -97,17 +97,22 @@
public Map<String, String> getQueryMap(String query) {
Map<String, String> 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
+ 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;
}
- return map;
}
/*public String getRouteString(HttpExchange exchange) {
--
Gitblit v1.9.3