package com.patch.html_to_png_server.http; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.channels.Channels; import java.nio.channels.FileChannel; import java.nio.channels.WritableByteChannel; import com.patch.html_to_png_server.renderers.AbstractRenderer; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; public class HtmlToPngHttpHandler implements HttpHandler { Class<? extends AbstractRenderer> renderClass; public HtmlToPngHttpHandler(Class<? extends AbstractRenderer> renderClass) { this.renderClass = renderClass; } public void handle(HttpExchange httpExchange) throws IOException { try { System.out.printf( "Begin request from %s\n", httpExchange.getRemoteAddress()); doHandle(httpExchange); System.out.printf( "End request from %s\n", httpExchange.getRemoteAddress()); } catch (IOException e) { e.printStackTrace(); throw(e); } } private void doHandle(HttpExchange httpExchange) throws IOException { AbstractRenderer renderer; try { renderer = renderClass.newInstance(); } catch (InstantiationException e) { throw new IOException(e); } catch (IllegalAccessException e) { throw new IOException(e); } InputStream is = httpExchange.getRequestBody(); renderer.setHtml(is); renderer.generatePngFile(); File pngFile = renderer.getPngFile(); FileChannel pngChannel = new FileInputStream(pngFile).getChannel(); httpExchange.getResponseHeaders().set("Content-Type", "image/png"); httpExchange.sendResponseHeaders(200, pngChannel.size()); WritableByteChannel bodyChannel = Channels.newChannel(httpExchange.getResponseBody()); pngChannel.transferTo(0, pngChannel.size(), bodyChannel); pngChannel.close(); renderer.cleanUp(); httpExchange.close(); } }