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" );
}
}
|