Ultrakompakter HTTP Server
ulrich
2024-02-19 63bcdeba5812d7347e2e85302fcf052618e74fcd
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;