diff options
Diffstat (limited to 'dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/thrift')
-rw-r--r-- | dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/thrift/BinaryListener.java | 10 | ||||
-rw-r--r-- | dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/thrift/JsonHttpListener.java | 95 |
2 files changed, 101 insertions, 4 deletions
diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/thrift/BinaryListener.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/thrift/BinaryListener.java index 7cb6ef19..d730eace 100644 --- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/thrift/BinaryListener.java +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/thrift/BinaryListener.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.security.NoSuchAlgorithmException; +import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; import javax.net.ssl.SSLContext; @@ -38,10 +39,10 @@ public class BinaryListener implements Runnable { private final TServer server; - public BinaryListener(int port, boolean secure) throws TTransportException, NoSuchAlgorithmException, - IOException { + public BinaryListener(int port, boolean secure, ExecutorService es) + throws TTransportException, NoSuchAlgorithmException, IOException { if (secure) - server = initSecure(port); + server = initSecure(port, es); else server = initNormal(port); } @@ -54,7 +55,7 @@ public class BinaryListener implements Runnable { // TODO: Restart listener; if it fails, quit server so it will be restarted by the OS } - private TServer initSecure(int port) throws NoSuchAlgorithmException, TTransportException, IOException { + private TServer initSecure(int port, ExecutorService es) throws NoSuchAlgorithmException, TTransportException, IOException { SSLContext context = Identity.getSSLContext(); if (context == null) return null; @@ -73,6 +74,7 @@ public class BinaryListener implements Runnable { TThreadPoolServer.Args args = new TThreadPoolServer.Args(serverTransport); args.protocolFactory(protFactory); args.processor(processor); + args.executorService(es); args.minWorkerThreads(MINWORKERTHREADS).maxWorkerThreads(MAXWORKERTHREADS); args.stopTimeoutVal(2).stopTimeoutUnit(TimeUnit.MINUTES); args.transportFactory(new TFastFramedTransport.Factory(MAX_MSG_LEN)); diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/thrift/JsonHttpListener.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/thrift/JsonHttpListener.java new file mode 100644 index 00000000..55c09756 --- /dev/null +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/thrift/JsonHttpListener.java @@ -0,0 +1,95 @@ +package org.openslx.bwlp.sat.thrift; + +import java.io.IOException; +import java.util.Arrays; +import java.util.concurrent.ExecutorService; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.thrift.protocol.TJSONProtocol; +import org.apache.thrift.protocol.TProtocol; +import org.apache.thrift.transport.TMemoryBuffer; +import org.openslx.bwlp.thrift.iface.SatelliteServer; +import org.openslx.util.Util; + +import fi.iki.elonen.NanoHTTPD; + +public class JsonHttpListener extends NanoHTTPD { + + private static final Logger LOGGER = LogManager.getLogger(JsonHttpListener.class); + + private final SatelliteServer.Processor<ServerHandler> processor = new SatelliteServer.Processor<ServerHandler>( + new ServerHandler()); + + public JsonHttpListener(int port, ExecutorService es) throws IOException { + super("127.0.0.1", port, es); + this.maxRequestSize = 1_000_000; + } + + @Override + public Response serve(IHTTPSession session) { + Response res = serveInternal(session); + if (res != null) { + addCorsHeaders(res); + } + return res; + } + + private Response serveInternal(IHTTPSession session) { + Method method = session.getMethod(); + if (Method.OPTIONS.equals(method)) + return new Response(Response.Status.NO_CONTENT, "application/json", ""); + if (!Method.PUT.equals(method) && !Method.POST.equals(method)) + return new Response(Response.Status.BAD_REQUEST, "text/plain; charset=UTF-8", + "Method not supported"); + + try { + //Input + String str = session.getHeaders().get("content-length"); + int len = 0; + if (str != null) { + len = Util.parseInt(str, 0); + } + if (len <= 0) { + len = session.getInputStream().available(); + } + if (len <= 0) + return new Response(Response.Status.BAD_REQUEST, "text/plain; charset=UTF-8", + "No Content-Length provided"); + + byte[] buffer = session.getInputStream().readNBytes(len); + TMemoryBuffer inbuffer = new TMemoryBuffer(buffer.length); + inbuffer.write(buffer); + TProtocol inprotocol = new TJSONProtocol(inbuffer); + + //Output + TMemoryBuffer outbuffer = new TMemoryBuffer(900); + TProtocol outprotocol = new TJSONProtocol(outbuffer); + + processor.process(inprotocol, outprotocol); + + buffer = Arrays.copyOf(outbuffer.getArray(), outbuffer.length()); + + return new Response(Response.Status.OK, "application/json", buffer); + } catch (Throwable t) { + if (!t.getMessage().contains("Remote side has closed")) { + LOGGER.warn("Error handling HTTP thrift", t); + } + return new Response(Response.Status.INTERNAL_ERROR, "text/plain; charset=UTF-8", t.getMessage()); + } + } + + @Override + public void serverStopped() { + System.exit(1); + } + + private static void addCorsHeaders(Response response) { + response.addHeader("Allow", "OPTIONS, GET, HEAD, POST, PUT"); + response.addHeader("Access-Control-Allow-Methods", "*"); + response.addHeader("Access-Control-Allow-Origin", "*"); + response.addHeader("Access-Control-Allow-Headers", "*, Content-Type"); + response.addHeader("Access-Control-Max-Age", "86400"); + } + +} |