private void startServer(final InetAddress host, final int port) { updateState(State.STARTING); thread = new Thread() { @Override public void run() { runServer(new InetSocketAddress(host, port), new BasicAsyncRequestHandler( new LocalWebServerHttpRequestHandler(LocalWebServer.this))); } }; thread.setDaemon(true); thread.start(); Thread.yield(); long startTime = System.currentTimeMillis(); while (thread.isAlive() && (System.currentTimeMillis() - startTime) < STARTUP_TIMEOUT) { if (reactor != null && reactor.getStatus() == IOReactorStatus.ACTIVE) { updateState(State.STARTED); break; } try { Thread.sleep(10); } catch (InterruptedException e) { updateState(State.UNKNOWN); break; } } }
/** Registers a handler to be called when a message arrives at the given endpoint. */ public void registerHandler(final String endPoint, final Function<CharSource, CharSource> handler) { mapper.register(endPoint, new BasicAsyncRequestHandler(new HttpRequestHandler() { @Override public void handle(final HttpRequest request, final HttpResponse response, final HttpContext context) throws IOException { if (request instanceof HttpEntityEnclosingRequest) { final HttpEntity entity = ((HttpEntityEnclosingRequest) request).getEntity(); if (entity==null) { logger().level(Warn).message("Received empty request from device").log(); response.setStatusCode(HttpStatus.SC_BAD_REQUEST); return; } final String requestJson = URLDecoder.decode(EntityUtils.toString(entity, Charsets.UTF_8), Charsets.UTF_8.name()); final CharSource responseJson = handler.apply(CharSource.wrap(requestJson)); if (responseJson==null || responseJson.isEmpty()) { response.setStatusCode(HttpStatus.SC_BAD_REQUEST); return; } response.setStatusCode(HttpStatus.SC_OK); EntityUtils.updateEntity(response, new StringEntity(URLEncoder.encode(responseJson.read(), Charsets.UTF_8.name()))); } } })); }