package cz.cuni.mff.d3s.been.swrepository.httpserver; import java.net.InetAddress; import java.net.InetSocketAddress; import org.apache.http.impl.DefaultConnectionReuseStrategy; import org.apache.http.impl.DefaultHttpResponseFactory; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpParams; import org.apache.http.protocol.BasicHttpProcessor; import org.apache.http.protocol.HttpProcessor; import org.apache.http.protocol.HttpRequestHandlerRegistry; import org.apache.http.protocol.HttpService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * A simple put/get http server used for file storage/retrieval * * @author darklight * */ public class HttpServer { private static final Logger log = LoggerFactory.getLogger(HttpServer.class); private final InetSocketAddress sockAddr; private final HttpRequestHandlerRegistry handlerResolver; private final HttpParams params; private HttpListener listenerThread; /** * Create an HTTP server on a host/port * * @param sockAddr * Socket on which the server listens */ public HttpServer(InetSocketAddress sockAddr) { this.sockAddr = sockAddr; this.handlerResolver = new HttpRequestHandlerRegistry(); this.params = new BasicHttpParams(); } /** * Get the port registered by this server. * * @return The port no */ public int getPort() { return sockAddr.getPort(); } /** * Get the host registered by this server. * * @return The registered {@link InetAddress} */ public InetAddress getHost() { return sockAddr.getAddress(); } /** * Run the server (start listening and handling requests) * * @throws HttpServerException On HTTP transport failure */ public void start() throws HttpServerException { HttpProcessor httpProc = new BasicHttpProcessor(); HttpService httpService = new HttpService(httpProc, new DefaultConnectionReuseStrategy(), new DefaultHttpResponseFactory(), handlerResolver, params); log.debug(String.format( "Running listener thread on socket %s with params %s", sockAddr.toString(), params.toString())); listenerThread = new HttpListener(httpService, sockAddr, params); listenerThread.bind(); listenerThread.start(); } /** * Stop the server (stop listeners).. */ public void stop() { listenerThread.interrupt(); } /** * Get the request handler resolver. * * @return The resolver */ public HttpRequestHandlerRegistry getResolver() { return handlerResolver; } }