Ultrakompakter HTTP Server
ulrich
2024-02-17 e5869064ba4379f0c56fd3d23e0ee13deb4f9757
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/*
  neon - Embeddable HTTP Server based on jdk.httpserver
  Copyright (C) 2024  Ulrich Hilger
 
  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU Affero General Public License as
  published by the Free Software Foundation, either version 3 of the
  License, or (at your option) any later version.
 
  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU Affero General Public License for more details.
 
  You should have received a copy of the GNU Affero General Public License
  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
package de.uhilger.neon;
 
import com.sun.net.httpserver.HttpExchange;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
/**
 * Helfer fuer HTTP-Methoden
 * 
 * @author Ulrich Hilger
 * @version 1, 01.06.2021
 */
public class HttpHelper {
 
  /* HTTP Methoden */
  public static final String HTTP_GET = "GET";
  public static final String HTTP_POST = "POST";
  public static final String HTTP_PUT = "PUT";
  public static final String HTTP_DELETE = "DELETE";
  
  public static final String STR_AMP = "&";
  public static final String STR_EQUAL = "=";
  
  //public static final String CONTENT_TYPE = "Content-Type";
 
  public static final String CT_JSON = "application/json; charset=UTF-8";
  public static final String CT_TEXT_HTML = "text/html";
  
  /**
   * Den Namen der gew&uuml;nschten Datei aus der HTTP-Anfrage ermitteln
   * 
   * @param e das Objekt mit Methoden zur Untersuchung der Anfrage sowie zum
   * Anfertigen und Senden der Antwort
   * @return Name der gew&uuml;nschten Datei
   */
  public String getFileName(HttpExchange e) {
    String ctxPath = e.getHttpContext().getPath();
    String uriPath = e.getRequestURI().getPath();
    return uriPath.substring(ctxPath.length());
  }
  
  public String bodyLesen(HttpExchange exchange) throws IOException {
    StringBuilder sb = new StringBuilder();
    InputStream is = exchange.getRequestBody();
    BufferedReader in = new BufferedReader(new InputStreamReader(is));
    String line = in.readLine();
    while (line != null) {
      sb.append(line);
      line = in.readLine();
    }
    return sb.toString();
  }
  
  /*public String getAttrStr(Map attributes, String key, String defaultValue) {
    Object value = attributes.get(key);
    if(value instanceof String) {
      return value.toString();
    } else {
      return defaultValue;
    }
  } */
  
  public Map<String, String> getQueryMap(HttpExchange exchange) {
   if(exchange.getRequestMethod().equalsIgnoreCase("GET")) {
      return getQueryMap(exchange.getRequestURI().getQuery());
    } else {          
     try {            
       return getQueryMap(bodyLesen(exchange));
     } catch (IOException ex) {
       return new HashMap<>();
     }
    }
  }
  
  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
    }
    return map;  
  }  
  
  /*public String getRouteString(HttpExchange exchange) {
    return exchange.getRequestURI().getPath()
            .substring(exchange.getHttpContext().getPath().length());    
  }*/
  
  public String getRouteString(HttpExchange exchange) {
    return getFileName(exchange);
  }
  
  public List<String> getRouteList(String routeString) {
    return Arrays.asList(routeString.split("/"));    
  }
  
  /*
  public File tryWelcomeFiles(HttpExchange e, String fName) {
    boolean notFound = true;
    File file = null;
    String fileBase = e.getHttpContext().getAttributes().get(FileHandler.ATTR_FILE_BASE).toString();
    Object welcomeFiles = e.getHttpContext().getAttributes().get(FileHandler.ATTR_WELCOME_FILES);
    if(welcomeFiles instanceof String) {
      String[] fileNames = welcomeFiles.toString().split(FileHandler.STR_COMMA);
      int i = -1;
      while(notFound && ++i < fileNames.length) {
        file = new File(fileBase, fName + fileNames[i]);
        if(file.exists()) {
          notFound = false;
        }
      }
    }
    if(notFound) {
      file = new File(fileBase, fName + FileHandler.WELCOME_FILE);
    }
    return file;
  }
  */
  
}