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