package com.alecgorge.minecraft.jsonapi; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.SocketException; import java.util.Properties; import com.alecgorge.minecraft.jsonapi.streams.StreamingResponse; import com.codebutler.android_websockets.WebSocketServer; public class JSONTunneledWebSocket extends WebSocketServer { boolean continueSending = true; public JSONTunneledWebSocket(InputStream input, OutputStream output) { super(input, output); } @Override public void onConnect() { JSONAPI.dbug("websocket connected"); } @Override public void onMessage(String message) { JSONAPI.dbug("got websocket message: "+message); String[] split = message.split("\\?", 2); JSONServer jsonServer = JSONAPI.instance.jsonServer; NanoHTTPD.Response r = null; if(split.length < 2) { r = jsonServer.new Response( NanoHTTPD.HTTP_NOTFOUND, NanoHTTPD.MIME_JSON, jsonServer.returnAPIError("", "Incorrect. Socket requests are in the format PAGE?ARGUMENTS. For example, /api/subscribe?source=....").toJSONString()); } else { Properties header = new Properties(); NanoHTTPD.decodeParms(split[1], header); Properties p = new Properties(); r = jsonServer.serve(split[0], "GET", p, header); } if(r.data instanceof StreamingResponse) { final StreamingResponse s = (StreamingResponse)r.data; (new Thread(new Runnable() { @Override public void run() { String line = ""; JSONAPI.dbug("starting streaming response"); while(continueSending && (line = s.nextLine()) != null) { try { send(line.trim()); } catch (SocketException e) { break; } catch (EOFException e) { break; } catch (Exception e) { e.printStackTrace(); break; } } try { JSONAPI.dbug("closing streaming response"); s.close(); } catch (IOException e) { e.printStackTrace(); } } })).start(); } else { BufferedReader data; if(r.data != null) data = new BufferedReader(new InputStreamReader(r.data)); else data = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(r.bytes))); try { String line = ""; while(continueSending && (line = data.readLine()) != null) { send(line); } } catch (Exception e) { e.printStackTrace(); } } } @Override public void onMessage(byte[] data) { } @Override public void onDisconnect(int code, String reason) { // TODO Auto-generated method stub JSONAPI.dbug("websocket disconnected: " + code + ", " + reason); continueSending = false; } @Override public void onError(Exception error) { error.printStackTrace(); } }