package org.openslx.dnbd3.status; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.net.URLConnection; import java.util.ArrayList; import java.util.List; import org.openslx.dnbd3.status.poller.ServerPoller; import fi.iki.elonen.NanoHTTPD; public class WebServer extends NanoHTTPD { private final StatisticsGenerator imageGenerator; public WebServer( int port, String... servers ) { super( port ); List pollers = new ArrayList<>(); for ( String server : servers ) { String[] parts = server.split( ":" ); if (parts.length > 2) { System.out.println( "Ignoring invalid line " + server ); } else if (parts.length == 2) { try { pollers.add( new ServerPoller( parts[0], Integer.parseInt( parts[1] ) ) ); } catch (NumberFormatException e) { System.out.println( "Ignoring invalid port from " + server ); } } else { pollers.add( new ServerPoller( server, 5003 ) ); } } imageGenerator = new StatisticsGenerator( pollers ); } @Override public Response serve( IHTTPSession session ) { String uri = session.getUri(); // Special/dynamic if ( uri.equals( "/image.png" ) ) return serveImage(); if ( uri.equals( "/data.json" ) ) return serveJson(false); if ( uri.equals( "/data2.json" ) ) return serveJson(true); // Static files if ( uri.equals( "/" ) ) uri = "/index.html"; File f = new File( "./static/" + uri.replace( "/", "" ) ); if ( f.isFile() ) { InputStream is = null; try { is = new FileInputStream( f ); /* // TODO: Shit doesn't work return new NanoHTTPD.Response( NanoHTTPD.Response.Status.OK, URLConnection.guessContentTypeFromName( f.getName() ), is ); */ ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[ 10000 ]; for ( ;; ) { int ret = is.read( buffer ); if ( ret <= 0 ) break; baos.write( buffer, 0, ret ); } return new NanoHTTPD.Response( NanoHTTPD.Response.Status.OK, URLConnection.guessContentTypeFromName( f.getName() ), baos.toString( "UTF-8" ) ); } catch ( Exception e ) { return new NanoHTTPD.Response( NanoHTTPD.Response.Status.INTERNAL_ERROR, "text/plain", "Internal Server Error" ); } finally { safeClose( is ); } } return new NanoHTTPD.Response( NanoHTTPD.Response.Status.NOT_FOUND, "text/plain", "Nicht gefunden!" ); } private NanoHTTPD.Response serveImage() { InputStream is = null; byte[] imgData = imageGenerator.getImagePng(); if ( imgData != null ) is = new ByteArrayInputStream( imgData ); if ( is == null ) { return new NanoHTTPD.Response( NanoHTTPD.Response.Status.INTERNAL_ERROR, "text/plain", "Internal Server Error" ); } else { return new NanoHTTPD.Response( NanoHTTPD.Response.Status.OK, "image/png", is ); } } private NanoHTTPD.Response serveJson(boolean newFormat) { String data = imageGenerator.getJson(newFormat); if ( data == null ) { return new NanoHTTPD.Response( NanoHTTPD.Response.Status.INTERNAL_ERROR, "text/plain", "Internal Server Error" ); } else { NanoHTTPD.Response response = new NanoHTTPD.Response( NanoHTTPD.Response.Status.OK, "application/json", data ); response.addHeader( "Access-Control-Allow-Origin", "*" ); return response; } } }