Ultrakompakter HTTP Server
ulrich
2024-02-19 63bcdeba5812d7347e2e85302fcf052618e74fcd
Handler unterscheidet, ob eine Action die Antwort gibt oder nicht
3 files modified
65 ■■■■ changed files
src/de/uhilger/neon/Action.java 1 ●●●● patch | view | raw | blame | history
src/de/uhilger/neon/Handler.java 39 ●●●● patch | view | raw | blame | history
src/de/uhilger/neon/HttpHelper.java 25 ●●●●● 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
@@ -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;
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) {