You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2014/05/26 12:13:46 UTC
svn commit: r1597550 - in /httpcomponents/httpcore/trunk/httpcore/src:
main/java/org/apache/http/impl/bootstrap/Server.java
main/java/org/apache/http/impl/bootstrap/ServerBootstrap.java
test/java/org/apache/http/testserver/HttpServer.java
Author: olegk
Date: Mon May 26 10:13:46 2014
New Revision: 1597550
URL: http://svn.apache.org/r1597550
Log:
Use new embedded server for integration tests
Modified:
httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/bootstrap/Server.java
httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/bootstrap/ServerBootstrap.java
httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/testserver/HttpServer.java
Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/bootstrap/Server.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/bootstrap/Server.java?rev=1597550&r1=1597549&r2=1597550&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/bootstrap/Server.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/bootstrap/Server.java Mon May 26 10:13:46 2014
@@ -62,6 +62,7 @@ public class Server {
private final ExecutorService workerExecutorService;
private final AtomicReference<Status> status;
+ private volatile ServerSocket serverSocket;
private volatile RequestListener requestListener;
Server(
@@ -87,17 +88,35 @@ public class Server {
this.status = new AtomicReference<Status>(Status.READY);
}
+ public InetAddress getInetAddress() {
+ final ServerSocket localSocket = this.serverSocket;
+ if (localSocket != null) {
+ return localSocket.getInetAddress();
+ } else {
+ return null;
+ }
+ }
+
+ public int getLocalPort() {
+ final ServerSocket localSocket = this.serverSocket;
+ if (localSocket != null) {
+ return localSocket.getLocalPort();
+ } else {
+ return -1;
+ }
+ }
+
public void start() throws IOException {
if (this.status.compareAndSet(Status.READY, Status.ACTIVE)) {
- final ServerSocket serverSocket = this.serverSocketFactory.createServerSocket(
+ this.serverSocket = this.serverSocketFactory.createServerSocket(
this.port, this.socketConfig.getBacklogSize(), this.ifAddress);
- serverSocket.setReuseAddress(this.socketConfig.isSoReuseAddress());
+ this.serverSocket.setReuseAddress(this.socketConfig.isSoReuseAddress());
if (this.socketConfig.getRcvBufSize() > 0) {
- serverSocket.setReceiveBufferSize(this.socketConfig.getRcvBufSize());
+ this.serverSocket.setReceiveBufferSize(this.socketConfig.getRcvBufSize());
}
this.requestListener = new RequestListener(
this.socketConfig,
- serverSocket,
+ this.serverSocket,
this.httpService,
this.connectionFactory,
this.exceptionLogger,
Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/bootstrap/ServerBootstrap.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/bootstrap/ServerBootstrap.java?rev=1597550&r1=1597549&r2=1597550&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/bootstrap/ServerBootstrap.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/bootstrap/ServerBootstrap.java Mon May 26 10:13:46 2014
@@ -376,7 +376,7 @@ public class ServerBootstrap {
}
return new Server(
- this.listenerPort > 0 ? this.listenerPort : 8080,
+ this.listenerPort > 0 ? this.listenerPort : 0,
this.localAddress,
this.socketConfig != null ? this.socketConfig : SocketConfig.DEFAULT,
serverSocketFactory,
Modified: httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/testserver/HttpServer.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/testserver/HttpServer.java?rev=1597550&r1=1597549&r2=1597550&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/testserver/HttpServer.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/testserver/HttpServer.java Mon May 26 10:13:46 2014
@@ -28,59 +28,35 @@
package org.apache.http.testserver;
import java.io.IOException;
-import java.io.InterruptedIOException;
import java.net.InetAddress;
-import java.net.ServerSocket;
import java.net.Socket;
+import java.net.SocketException;
+import java.util.concurrent.TimeUnit;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.apache.http.ConnectionClosedException;
-import org.apache.http.ConnectionReuseStrategy;
-import org.apache.http.HttpException;
-import org.apache.http.HttpResponseFactory;
-import org.apache.http.HttpResponseInterceptor;
-import org.apache.http.HttpServerConnection;
-import org.apache.http.impl.DefaultConnectionReuseStrategy;
-import org.apache.http.impl.DefaultHttpResponseFactory;
-import org.apache.http.protocol.BasicHttpContext;
-import org.apache.http.protocol.HttpContext;
+import org.apache.http.ExceptionLogger;
+import org.apache.http.HttpConnectionFactory;
+import org.apache.http.config.SocketConfig;
+import org.apache.http.impl.bootstrap.Server;
+import org.apache.http.impl.bootstrap.ServerBootstrap;
import org.apache.http.protocol.HttpExpectationVerifier;
-import org.apache.http.protocol.HttpProcessor;
import org.apache.http.protocol.HttpRequestHandler;
-import org.apache.http.protocol.HttpService;
-import org.apache.http.protocol.ImmutableHttpProcessor;
-import org.apache.http.protocol.ResponseConnControl;
-import org.apache.http.protocol.ResponseContent;
-import org.apache.http.protocol.ResponseDate;
-import org.apache.http.protocol.ResponseServer;
import org.apache.http.protocol.UriHttpRequestHandlerMapper;
import org.apache.http.util.Asserts;
public class HttpServer {
- private final HttpProcessor httpproc;
- private final ConnectionReuseStrategy connStrategy;
- private final HttpResponseFactory responseFactory;
private final UriHttpRequestHandlerMapper reqistry;
- private final ServerSocket serversocket;
-
private volatile HttpExpectationVerifier expectationVerifier;
- private volatile Thread listener;
- private volatile boolean shutdown;
private volatile int timeout;
+ private volatile Server server;
+
public HttpServer() throws IOException {
super();
- this.httpproc = new ImmutableHttpProcessor(
- new HttpResponseInterceptor[] {
- new ResponseDate(),
- new ResponseServer("TEST-SERVER/1.1"),
- new ResponseContent(),
- new ResponseConnControl()
- });
- this.connStrategy = DefaultConnectionReuseStrategy.INSTANCE;
- this.responseFactory = DefaultHttpResponseFactory.INSTANCE;
this.reqistry = new UriHttpRequestHandlerMapper();
- this.serversocket = new ServerSocket(0);
}
public int getTimeout() {
@@ -101,101 +77,71 @@ public class HttpServer {
this.expectationVerifier = expectationVerifier;
}
- private HttpServerConnection acceptConnection() throws IOException {
- final Socket socket = this.serversocket.accept();
- final LoggingBHttpServerConnection conn = new LoggingBHttpServerConnection(8 * 1024);
- conn.bind(socket);
- conn.setSocketTimeout(this.timeout);
- return conn;
- }
-
public int getPort() {
- return this.serversocket.getLocalPort();
+ final Server local = this.server;
+ if (local != null) {
+ return this.server.getLocalPort();
+ } else {
+ throw new IllegalStateException("Server not running");
+ }
}
public InetAddress getInetAddress() {
- return this.serversocket.getInetAddress();
+ final Server local = this.server;
+ if (local != null) {
+ return local.getInetAddress();
+ } else {
+ throw new IllegalStateException("Server not running");
+ }
}
- public void start() {
- Asserts.check(this.listener == null, "Listener already running");
- this.listener = new Thread(new Runnable() {
-
- @Override
- public void run() {
- while (!shutdown && !Thread.interrupted()) {
- try {
- // Set up HTTP connection
- final HttpServerConnection conn = acceptConnection();
- // Set up the HTTP service
- final HttpService httpService = new HttpService(
- httpproc,
- connStrategy,
- responseFactory,
- reqistry,
- expectationVerifier);
- // Start worker thread
- final Thread t = new WorkerThread(httpService, conn);
- t.setDaemon(true);
- t.start();
- } catch (final InterruptedIOException ex) {
- break;
- } catch (final IOException e) {
- break;
- }
- }
- }
-
- });
- this.listener.start();
+ public void start() throws IOException {
+ Asserts.check(this.server == null, "Server already running");
+ this.server = ServerBootstrap.bootstrap()
+ .setSocketConfig(SocketConfig.custom()
+ .setSoTimeout(this.timeout)
+ .build())
+ .setServerInfo("TEST-SERVER/1.1")
+ .setConnectionFactory(new LoggingConnFactory())
+ .setExceptionLogger(new SimpleExceptionLogger())
+ .setExpectationVerifier(this.expectationVerifier)
+ .setHandlerMapper(this.reqistry)
+ .create();
+ this.server.start();
}
public void shutdown() {
- if (this.shutdown) {
- return;
+ final Server local = this.server;
+ this.server = null;
+ if (local != null) {
+ local.shutdown(5, TimeUnit.SECONDS);
}
- this.shutdown = true;
- try {
- this.serversocket.close();
- } catch (final IOException ignore) {}
- this.listener.interrupt();
- try {
- this.listener.join(1000);
- } catch (final InterruptedException ignore) {}
- }
-
- static class WorkerThread extends Thread {
-
- private final HttpService httpservice;
- private final HttpServerConnection conn;
-
- public WorkerThread(
- final HttpService httpservice,
- final HttpServerConnection conn) {
- super();
- this.httpservice = httpservice;
- this.conn = conn;
+ }
+
+ static class LoggingConnFactory implements HttpConnectionFactory<LoggingBHttpServerConnection> {
+
+ @Override
+ public LoggingBHttpServerConnection createConnection(final Socket socket) throws IOException {
+ final LoggingBHttpServerConnection conn = new LoggingBHttpServerConnection(8 * 1024);
+ conn.bind(socket);
+ return conn;
}
+ }
+
+ static class SimpleExceptionLogger implements ExceptionLogger {
+
+ private final Log log = LogFactory.getLog(HttpServer.class);
@Override
- public void run() {
- final HttpContext context = new BasicHttpContext(null);
- try {
- while (!Thread.interrupted() && this.conn.isOpen()) {
- this.httpservice.handleRequest(this.conn, context);
- }
- } catch (final ConnectionClosedException ex) {
- } catch (final IOException ex) {
- System.err.println("I/O error: " + ex.getMessage());
- } catch (final HttpException ex) {
- System.err.println("Unrecoverable HTTP protocol violation: " + ex.getMessage());
- } finally {
- try {
- this.conn.shutdown();
- } catch (final IOException ignore) {}
+ public void log(final Exception ex) {
+ if (ex instanceof ConnectionClosedException) {
+ this.log.debug(ex.getMessage());
+ } else if (ex instanceof SocketException) {
+ this.log.debug(ex.getMessage());
+ } else {
+ this.log.error(ex.getMessage(), ex);
}
}
-
}
}