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