package com.espertech.esperio.http; import com.espertech.esperio.http.core.EsperHttpServiceClassicRunnable; import org.apache.http.impl.DefaultConnectionReuseStrategy; import org.apache.http.impl.DefaultHttpResponseFactory; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.CoreConnectionPNames; import org.apache.http.params.CoreProtocolPNames; import org.apache.http.params.HttpParams; import org.apache.http.protocol.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.net.ServerSocket; public class SupportHTTPServer { private static Logger log = LoggerFactory.getLogger(SupportHTTPServer.class); private final int port; private ServerSocket serversocket; private HttpParams parameters; private HttpService httpService; private EsperHttpServiceClassicRunnable runnable; private Thread socketThread; public SupportHTTPServer(int port) { this.port = port; } public void start() throws Exception { if (serversocket != null) { throw new RuntimeException("Server socket already initialized"); } this.serversocket = new ServerSocket(port); this.parameters = new BasicHttpParams(); this.parameters .setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 5000) .setIntParameter(CoreConnectionPNames.SOCKET_BUFFER_SIZE, 8 * 1024) .setBooleanParameter(CoreConnectionPNames.STALE_CONNECTION_CHECK, false) .setBooleanParameter(CoreConnectionPNames.TCP_NODELAY, true) .setParameter(CoreProtocolPNames.ORIGIN_SERVER, "HttpComponents/1.1"); // Set up the HTTP protocol processor BasicHttpProcessor httpproc = new BasicHttpProcessor(); httpproc.addInterceptor(new ResponseDate()); httpproc.addInterceptor(new ResponseServer()); httpproc.addInterceptor(new ResponseContent()); httpproc.addInterceptor(new ResponseConnControl()); // Set up request handlers HttpRequestHandlerRegistry registery = new HttpRequestHandlerRegistry(); registery.register("*", new SupportHTTPServerReqestHandler()); // Set up the HTTP service this.httpService = new HttpService( httpproc, new DefaultConnectionReuseStrategy(), new DefaultHttpResponseFactory()); this.httpService.setParams(this.parameters); this.httpService.setHandlerResolver(registery); runnable = new EsperHttpServiceClassicRunnable("regressionTestService", serversocket, parameters, httpService); socketThread = new Thread(runnable); socketThread.setDaemon(true); socketThread.start(); } public void stop() { log.info("Closing existing workers"); runnable.destroy(); log.info("Closing server socket for port " + port); try { serversocket.close(); } catch (IOException e) { log.debug("Error closing server socket: " + e.getMessage(), e); } log.info("Stopping socket thread"); socketThread.interrupt(); try { socketThread.join(10000); } catch (InterruptedException e) { log.debug("Interrupted", e); } } }