Ultrakompakter HTTP Server
ulrich
2024-02-19 63bcdeba5812d7347e2e85302fcf052618e74fcd
Handler unterscheidet, ob eine Action die Antwort gibt oder nicht
3 files modified
41 ■■■■ changed files
src/de/uhilger/neon/Action.java 1 ●●●● patch | view | raw | blame | history
src/de/uhilger/neon/Handler.java 35 ●●●● patch | view | raw | blame | history
src/de/uhilger/neon/HttpHelper.java 5 ●●●●● patch | view | raw | blame | history
src/de/uhilger/neon/Action.java
@@ -44,4 +44,5 @@
    Type type() default Type.GET;  
  String[] handler();
  String route();
  boolean handlesResponse();
}
src/de/uhilger/neon/Handler.java
@@ -108,8 +108,8 @@
    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);
              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;
src/de/uhilger/neon/HttpHelper.java
@@ -97,6 +97,7 @@
  
  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) {  
@@ -107,8 +108,12 @@
    } else {
      // map bleibt leer
    }
    } catch(Exception ex) {
    } finally {
    return map;  
  }  
  }
  
  /*public String getRouteString(HttpExchange exchange) {
    return exchange.getRequestURI().getPath()