/ src / main / java / ru / zoommax / Server.java
Server.java
  1  package ru.zoommax;
  2  
  3  import com.sun.net.httpserver.Headers;
  4  import com.sun.net.httpserver.HttpExchange;
  5  import com.sun.net.httpserver.HttpHandler;
  6  import com.sun.net.httpserver.HttpServer;
  7  import org.slf4j.Marker;
  8  import org.slf4j.MarkerFactory;
  9  
 10  import static ru.zoommax.SimpleServer.logger;
 11  
 12  import java.io.IOException;
 13  import java.io.OutputStream;
 14  import java.io.UnsupportedEncodingException;
 15  import java.net.InetSocketAddress;
 16  import java.net.URLDecoder;
 17  import java.util.HashMap;
 18  import java.util.concurrent.ExecutorService;
 19  import java.util.concurrent.Executors;
 20  import java.util.concurrent.TimeUnit;
 21  
 22  /**
 23   * Class for creating http server in second thread,
 24   * adding and removing endpoints, getting request headers and params, getting client ip,
 25   * decoding url, sending response.
 26   * @see Server#endPoint(String, HttpHandler)
 27   * @see Server#remEndPoint(String)
 28   * @see Server#requestHeaders(HttpExchange)
 29   * @see Server#requestParams(String)
 30   * @see Server#getIp(HttpExchange)
 31   * @see Server#decode(String)
 32   * @see Server#run()
 33   * @see Server#Server(int)
 34   * @author ZooMMaX
 35   * @version 1.3
 36   * @since 13.10.23
 37   */
 38  @Deprecated
 39  public class Server implements Runnable{
 40  
 41      /**
 42       * HttpServer object
 43       * @see HttpServer
 44       */
 45      private static HttpServer server;
 46  
 47      /**
 48       * Port number on which the server will be running
 49       */
 50      private int port;
 51  
 52      /**
 53       * Server initialization.<br>For start server use {@link #run()}<br>
 54       * @param port port number on which the server will be running
 55       */
 56      public Server(int port){
 57          this.port = port;
 58      }
 59      public Server(){}
 60  
 61      @Override
 62      public void run() {
 63          try {
 64              server = HttpServer.create(new InetSocketAddress(port), 0);
 65  
 66              server.createContext("/alife", exchange -> {
 67                  logger.info("request to /alife");
 68                  String request = Server.decode(exchange.getRequestURI().getRawQuery());
 69                  logger.info("request: "+request);
 70                  String respText = "life";
 71                  exchange.sendResponseHeaders(200, respText.getBytes().length);
 72                  OutputStream output = exchange.getResponseBody();
 73                  output.write(respText.getBytes());
 74                  output.flush();
 75                  exchange.close();
 76              });
 77  
 78              ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
 79              server.setExecutor(executor); // creates a default executor
 80              server.start();
 81              executor.awaitTermination(Integer.MAX_VALUE, TimeUnit.DAYS);
 82          } catch (IOException e) {
 83              logger.error("IOException", e);
 84          } catch (InterruptedException e) {
 85              logger.error("InterruptedException", e);
 86          }
 87      }
 88  
 89      /**
 90       * Add endpoint to server
 91       * @param endpoint {@link String} endpoint url. Example: "api/v1/test" <b>without root slash</b>
 92       * @param handler {@link HttpHandler} for endpoint. You can use {@link GetHandler} or {@link PostHandler} interfaces.
 93       */
 94      public static void endPoint(String endpoint, HttpHandler handler){
 95          server.createContext(endpoint, handler);
 96          logger.info("add "+endpoint);
 97      }
 98  
 99      /**
100       * Remove endpoint from server
101       * @param endpoint {@link String} endpoint url. Example: "api/v1/test" <b>without root slash</b>
102       */
103      public static void remEndPoint(String endpoint){
104          server.removeContext(endpoint);
105          logger.info("remove "+endpoint);
106      }
107  
108      /**
109       * Decode url. Used in {@link GetHandler} and {@link PostHandler} interfaces.
110       * @param encoded {@link String} encoded url
111       * @return {@link String} decoded url
112       */
113      public static String decode(final String encoded) {
114          try {
115              return encoded == null ? null : URLDecoder.decode(encoded, "UTF-8");
116          } catch (final UnsupportedEncodingException e) {
117              logger.error("UTF-8 is a required encoding", e);
118              return "";
119          }
120      }
121  
122      /**
123       * Get request headers. Used in {@link GetHandler} and {@link PostHandler} interfaces.
124       * @param httpExchange {@link HttpExchange} object
125       * @return {@link HashMap} with headers
126       */
127      public static HashMap<String, String> requestHeaders(HttpExchange httpExchange){
128          Headers exchangeHeaders = httpExchange.getRequestHeaders();
129          HashMap<String, String> headers = new HashMap<>();
130          for(String key: exchangeHeaders.keySet()) {
131              key = key.toLowerCase();
132              headers.put(key, exchangeHeaders.getFirst(key));
133          }
134          return headers;
135      }
136  
137      /**
138       * Get request params. Used in {@link GetHandler} and {@link PostHandler} interfaces.
139       * @param paramsStr {@link String} params string. Example: "param1=value1{@literal &}param2=value2"
140       * @return {@link HashMap} with params
141       */
142      public static HashMap<String, String> requestParams(String paramsStr){
143          HashMap<String, String> params = new HashMap<>();
144          for(String param: paramsStr.split("&")){
145              String[] pair = param.split("=");
146              params.put(pair[0], pair[1]);
147          }
148          return params;
149      }
150  
151      /**
152       * Get client ip. Used in {@link GetHandler} and {@link PostHandler} interfaces.
153       * @param httpExchange {@link HttpExchange} object
154       * @return {@link String} client ip
155       */
156      public static String getIp(HttpExchange httpExchange){
157          HashMap<String,String> headers = requestHeaders(httpExchange);
158          if(headers.containsKey("x-forwarded-for"))
159              return headers.get("x-forwarded-for");
160          else {
161              return httpExchange.getRemoteAddress().getAddress().getHostAddress();
162          }
163      }
164  }