import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.charset.Charset; import java.security.KeyStore; import java.util.logging.Level; import java.util.logging.Logger; import javax.net.ssl.*; static class MyHTTPD extends NanoHTTPD { *(int port) { super(port); } O onServe, onEndServe; volatile long requests; sclass Serving { S uri; SS header, parms, files; } L currentlyServing = synchroList(); public Response serve(S uri, Method method, SS header, SS parms, SS files) { ++requests; Serving serving = nu(Serving.class, +uri, +header, +parms, +files); currentlyServing.add(serving); pcallF(onServe, serving); try { S remoteAddr = header.get("remote-addr"); print(formatDateAndTime() + " Serving URI: " + quote(uri) + " to: " + remoteAddr); /*if (nempty(remoteAddr) && isTrue(callOpt(mc(), "isBlockedIP", remoteAddr))) { print("BLOCKED IP."); ret serve404(); }*/ try { Response response = cast callOpt(getMainClass(), "serve", uri, method, header, parms, files); if (response != null) ret response; O html = callHtmlMethod2(getMainClass(), uri, parms); if (html != null) ret html instanceof S ? serveHTML((S) html) : (NanoHTTPD.Response) html; ret serve404(); } catch (Throwable e) { printStackTrace(e); ret serveHTML("ERROR."); } } finally { pcallF(onEndServe, serving); currentlyServing.remove(Serving); } } } static MyHTTPD serveHttp_server; static int serveHttp_port = 8888; static new TreeSet serveHttp_peers; static int serveHttp(int port) ctex { serveHttp_port = port; serveHttp_server = new MyHTTPD(port); serveHttp_server.start(); ret serveHttp_port(); } // serve on random port, return port number used static int serveHttp() { serveHttp(0); ret serveHttp_port(); } static int serveHttp_port() { ret serveHttp_server == null ? 0 : serveHttp_server.getListeningPort(); } static void cleanMeUp_serveHttp() { if (serveHttp_server != null) { serveHttp_server.stop(); serveHttp_server = null; } }