App zur Steuerung des mpv Mediaplayers auf einem Raspberry Pi über HTTP
undisclosed
2023-01-08 929228226e08e352769810f729f0e9644a781bec
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
package de.uhilger.calypso.neu.http;
 
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
 
/**
 * Die Klasse HttpApi verwendet die von der Klasse HttpExchange 
 * gelieferten Elemente einer HTTP-Anfrage und leitet sie an 
 * die abstrakte Methode process, wo Subklassen das jeweilige 
 * Kommando aus der HTTP-Anfrage ausfuehren können.
 * 
 * @author Ulrich Hilger
 */
public abstract class HttpApi implements HttpHandler {
 
  public static final String AMP = "&";
  public static final String SLASH = "/";
 
  @Override
  public void handle(HttpExchange exchange) throws IOException {
    String path = exchange.getRequestURI().getPath();
    String[] elems = path.split(SLASH);
    Map params = getQueryMap(exchange);
    String antwort = process(elems, params, exchange);
    antwortSenden(exchange, params, path, antwort);
  }
  
  /**
   * Eine HTTP-Anfrage ausführen
   * 
   * @param elems die Elemente des URI-Pfads
   * @param parameter die Parameter des Query-Teils der URI
   * @return die Antwort, die gesendet werden soll
   */
  protected abstract String process(String[] elems, Map parameter, HttpExchange exchange);
 
  /*
    Den Query-Teil einer URL in die Parameter zerlegen
  
    Die Zerlegung erfolgt mit String.split nach 
    & und dann nach =
  */
  protected Map getQueryMap(HttpExchange t) {
    HashMap map = new HashMap();
    String query = t.getRequestURI().getQuery();
    if(query != null && query.length() > 0) {
      String qParts[] = query.split("&");
      for(String qPart : qParts) {
        Logger logger = Logger.getLogger(de.uhilger.calypso.neu.http.HttpApi.class.getName());
        logger.log(Level.FINER, "qPart: {0}", qPart);
        String pParts[] = qPart.split("=");
        map.put(pParts[0], pParts[1]);
        logger.log(Level.FINER, "pParts[0]: {0} pParts[1]: {1}", new Object[]{pParts[0], pParts[1]});
      }
    }
    return map;
  }
  
  protected void antwortSenden(HttpExchange exchange, Map params, String cmd, String antwort) throws IOException {
    String httpResponseStr = getResponseString(params, cmd, antwort);
    sendResponse(exchange, httpResponseStr);      
  }
  
  protected String getResponseString(Map map, String cmd, String antwort) {
    Set keys = map.keySet();
    StringBuilder buf = new StringBuilder();
    buf.append(cmd);
    buf.append(System.lineSeparator());
    keys.forEach((Object key) -> {
      buf.append("key: ");
      buf.append(key);
      buf.append(System.lineSeparator());
      buf.append("value: "); 
      buf.append(map.get(key));
      buf.append(System.lineSeparator());
      //logger.log(Level.FINE, "key {0} value {1}", new Object[]{key, map.get(key)});
    });
    buf.append(antwort);
    return buf.toString();
  }    
 
  protected void sendResponse(HttpExchange t, String response) throws IOException {
    t.sendResponseHeaders(200, response.length());
    OutputStream os = t.getResponseBody();
    os.write(response.getBytes());
    os.close();    
  }
  
  
}