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 ++++++++++++++++++++++++++++++--------- 1 files changed, 30 insertions(+), 9 deletions(-) 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; -- Gitblit v1.9.3