summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/openslx/imagemaster/thrift/server/HttpListener.java
blob: f1309898428cd816a28340fddf66ea10303218e6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package org.openslx.imagemaster.thrift.server;

import java.io.IOException;

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.MasterServer;
import org.openslx.util.Util;

import fi.iki.elonen.NanoHTTPD;

public class HttpListener extends NanoHTTPD
{

	private static final Logger LOGGER = LogManager.getLogger( HttpListener.class );

	private final MasterServer.Processor<MasterServerHandler> processor = new MasterServer.Processor<MasterServerHandler>(
			new MasterServerHandler() );

	public HttpListener( String hostname, int port ) throws IOException
	{
		super( hostname, port, 64, 16 );
		this.maxRequestSize = 1_000_000;
	}

	@Override
	public Response serve( IHTTPSession session )
	{
		Method method = session.getMethod();
		if ( Method.OPTIONS.equals( method ) ) {
			Response response = new Response( Response.Status.NO_CONTENT, "application/json", "" );
			addCorsHeaders( response );
			return response;
		}
		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 = new byte[ outbuffer.length() ];
			outbuffer.readAll( buffer, 0, buffer.length );

			Response response = new Response( Response.Status.OK, "application/json", buffer );
			addCorsHeaders( response );
			return response;
		} 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" );
	}

}