App zur Steuerung des mpv Mediaplayers auf einem Raspberry Pi über HTTP
undisclosed
2023-01-08 929228226e08e352769810f729f0e9644a781bec
commit | author | age
929228 1 package de.uhilger.calypso.neu.http;
U 2
3 import com.sun.net.httpserver.HttpExchange;
4 import com.sun.net.httpserver.HttpHandler;
5 import java.io.IOException;
6 import java.io.OutputStream;
7 import java.util.HashMap;
8 import java.util.Map;
9 import java.util.Set;
10 import java.util.logging.Level;
11 import java.util.logging.Logger;
12
13 /**
14  * Die Klasse HttpApi verwendet die von der Klasse HttpExchange 
15  * gelieferten Elemente einer HTTP-Anfrage und leitet sie an 
16  * die abstrakte Methode process, wo Subklassen das jeweilige 
17  * Kommando aus der HTTP-Anfrage ausfuehren können.
18  * 
19  * @author Ulrich Hilger
20  */
21 public abstract class HttpApi implements HttpHandler {
22
23   public static final String AMP = "&";
24   public static final String SLASH = "/";
25
26   @Override
27   public void handle(HttpExchange exchange) throws IOException {
28     String path = exchange.getRequestURI().getPath();
29     String[] elems = path.split(SLASH);
30     Map params = getQueryMap(exchange);
31     String antwort = process(elems, params, exchange);
32     antwortSenden(exchange, params, path, antwort);
33   }
34   
35   /**
36    * Eine HTTP-Anfrage ausführen
37    * 
38    * @param elems die Elemente des URI-Pfads
39    * @param parameter die Parameter des Query-Teils der URI
40    * @return die Antwort, die gesendet werden soll
41    */
42   protected abstract String process(String[] elems, Map parameter, HttpExchange exchange);
43
44   /*
45     Den Query-Teil einer URL in die Parameter zerlegen
46   
47     Die Zerlegung erfolgt mit String.split nach 
48     & und dann nach =
49   */
50   protected Map getQueryMap(HttpExchange t) {
51     HashMap map = new HashMap();
52     String query = t.getRequestURI().getQuery();
53     if(query != null && query.length() > 0) {
54       String qParts[] = query.split("&");
55       for(String qPart : qParts) {
56         Logger logger = Logger.getLogger(de.uhilger.calypso.neu.http.HttpApi.class.getName());
57         logger.log(Level.FINER, "qPart: {0}", qPart);
58         String pParts[] = qPart.split("=");
59         map.put(pParts[0], pParts[1]);
60         logger.log(Level.FINER, "pParts[0]: {0} pParts[1]: {1}", new Object[]{pParts[0], pParts[1]});
61       }
62     }
63     return map;
64   }
65   
66   protected void antwortSenden(HttpExchange exchange, Map params, String cmd, String antwort) throws IOException {
67     String httpResponseStr = getResponseString(params, cmd, antwort);
68     sendResponse(exchange, httpResponseStr);      
69   }
70   
71   protected String getResponseString(Map map, String cmd, String antwort) {
72     Set keys = map.keySet();
73     StringBuilder buf = new StringBuilder();
74     buf.append(cmd);
75     buf.append(System.lineSeparator());
76     keys.forEach((Object key) -> {
77       buf.append("key: ");
78       buf.append(key);
79       buf.append(System.lineSeparator());
80       buf.append("value: "); 
81       buf.append(map.get(key));
82       buf.append(System.lineSeparator());
83       //logger.log(Level.FINE, "key {0} value {1}", new Object[]{key, map.get(key)});
84     });
85     buf.append(antwort);
86     return buf.toString();
87   }    
88
89   protected void sendResponse(HttpExchange t, String response) throws IOException {
90     t.sendResponseHeaders(200, response.length());
91     OutputStream os = t.getResponseBody();
92     os.write(response.getBytes());
93     os.close();    
94   }
95   
96   
97 }