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/28 17:52:01 UTC

svn commit: r1598055 - in /httpcomponents/httpcore/trunk: httpcore-nio/src/main/java/org/apache/http/impl/nio/ httpcore-nio/src/main/java/org/apache/http/impl/nio/bootstrap/ httpcore/src/main/java/org/apache/http/impl/bootstrap/

Author: olegk
Date: Wed May 28 15:52:00 2014
New Revision: 1598055

URL: http://svn.apache.org/r1598055
Log:
 Bootstrap for embedded server based on non-blocking I/O

Added:
    httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/bootstrap/
    httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/bootstrap/Server.java   (with props)
    httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/bootstrap/ServerBootstrap.java
      - copied, changed from r1598053, httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/bootstrap/ServerBootstrap.java
    httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/bootstrap/ThreadFactoryImpl.java   (with props)
    httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/bootstrap/package-info.java   (with props)
Modified:
    httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/DefaultHttpServerIODispatch.java
    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

Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/DefaultHttpServerIODispatch.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/DefaultHttpServerIODispatch.java?rev=1598055&r1=1598054&r2=1598055&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/DefaultHttpServerIODispatch.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/DefaultHttpServerIODispatch.java Wed May 28 15:52:00 2014
@@ -54,11 +54,11 @@ public class DefaultHttpServerIODispatch
                     extends AbstractIODispatch<DefaultNHttpServerConnection> {
 
     private final NHttpServerEventHandler handler;
-    private final NHttpConnectionFactory<DefaultNHttpServerConnection> connFactory;
+    private final NHttpConnectionFactory<? extends DefaultNHttpServerConnection> connFactory;
 
     public DefaultHttpServerIODispatch(
             final NHttpServerEventHandler handler,
-            final NHttpConnectionFactory<DefaultNHttpServerConnection> connFactory) {
+            final NHttpConnectionFactory<? extends DefaultNHttpServerConnection> connFactory) {
         super();
         this.handler = Args.notNull(handler, "HTTP client handler");
         this.connFactory = Args.notNull(connFactory, "HTTP server connection factory");

Added: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/bootstrap/Server.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/bootstrap/Server.java?rev=1598055&view=auto
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/bootstrap/Server.java (added)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/bootstrap/Server.java Wed May 28 15:52:00 2014
@@ -0,0 +1,160 @@
+/*
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+package org.apache.http.impl.nio.bootstrap;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.apache.http.ExceptionLogger;
+import org.apache.http.impl.nio.DefaultHttpServerIODispatch;
+import org.apache.http.impl.nio.DefaultNHttpServerConnection;
+import org.apache.http.impl.nio.reactor.DefaultListeningIOReactor;
+import org.apache.http.impl.nio.reactor.IOReactorConfig;
+import org.apache.http.nio.NHttpConnectionFactory;
+import org.apache.http.nio.protocol.HttpAsyncService;
+import org.apache.http.nio.reactor.IOEventDispatch;
+import org.apache.http.nio.reactor.IOReactorException;
+import org.apache.http.nio.reactor.IOReactorExceptionHandler;
+import org.apache.http.nio.reactor.ListenerEndpoint;
+
+/**
+ * @since 4.4
+ */
+public class Server {
+
+    enum Status { READY, ACTIVE, STOPPING }
+
+    private final int port;
+    private final InetAddress ifAddress;
+    private final IOReactorConfig ioReactorConfig;
+    private final HttpAsyncService httpService;
+    private final NHttpConnectionFactory<? extends DefaultNHttpServerConnection> connectionFactory;
+    private final ExceptionLogger exceptionLogger;
+    private final ExecutorService listenerExecutorService;
+    private final ThreadGroup dispatchThreads;
+    private final AtomicReference<Status> status;
+    private final DefaultListeningIOReactor ioReactor;
+
+    private volatile ListenerEndpoint endpoint;
+
+    Server(
+            final int port,
+            final InetAddress ifAddress,
+            final IOReactorConfig ioReactorConfig,
+            final HttpAsyncService httpService,
+            final NHttpConnectionFactory<? extends DefaultNHttpServerConnection> connectionFactory,
+            final ExceptionLogger exceptionLogger) {
+        this.port = port;
+        this.ifAddress = ifAddress;
+        this.ioReactorConfig = ioReactorConfig;
+        this.httpService = httpService;
+        this.connectionFactory = connectionFactory;
+        this.exceptionLogger = exceptionLogger;
+        this.listenerExecutorService = Executors.newSingleThreadExecutor(
+                new ThreadFactoryImpl("HTTP-listener-" + this.port));
+        this.dispatchThreads = new ThreadGroup("I/O-dispatchers");
+        try {
+            this.ioReactor = new DefaultListeningIOReactor(
+                    this.ioReactorConfig,
+                    new ThreadFactoryImpl("I/O-dispatch", this.dispatchThreads));
+        } catch (IOReactorException ex) {
+            throw new IllegalStateException(ex);
+        }
+        this.ioReactor.setExceptionHandler(new IOReactorExceptionHandler() {
+            @Override
+            public boolean handle(final IOException ex) {
+                exceptionLogger.log(ex);
+                return false;
+            }
+
+            @Override
+            public boolean handle(final RuntimeException ex) {
+                exceptionLogger.log(ex);
+                return false;
+            }
+        });
+        this.status = new AtomicReference<Status>(Status.READY);
+    }
+
+    public InetAddress getInetAddress() {
+        final ListenerEndpoint local = this.endpoint;
+        if (local != null) {
+            return ((InetSocketAddress) local.getAddress()).getAddress();
+        } else {
+            return null;
+        }
+    }
+
+    public int getLocalPort() {
+        final ListenerEndpoint local = this.endpoint;
+        if (local != null) {
+            return ((InetSocketAddress) local.getAddress()).getPort();
+        } else {
+            return -1;
+        }
+    }
+
+    public void start() throws IOException {
+        if (this.status.compareAndSet(Status.READY, Status.ACTIVE)) {
+            this.ioReactor.listen(new InetSocketAddress(this.ifAddress, this.port > 0 ? this.port : 0));
+            final IOEventDispatch ioEventDispatch = new DefaultHttpServerIODispatch(
+                    this.httpService, this.connectionFactory);
+            this.listenerExecutorService.execute(new Runnable() {
+
+                @Override
+                public void run() {
+                    try {
+                        ioReactor.execute(ioEventDispatch);
+                    } catch (Exception ex) {
+                        exceptionLogger.log(ex);
+                    }
+                }
+
+            });
+        }
+    }
+
+    public void awaitTermination(final long timeout, final TimeUnit timeUnit) throws InterruptedException {
+        this.listenerExecutorService.awaitTermination(timeout, timeUnit);
+    }
+
+    public void shutdown(final long gracePeriod, final TimeUnit timeUnit) {
+        if (this.status.compareAndSet(Status.ACTIVE, Status.STOPPING)) {
+            try {
+                this.ioReactor.shutdown(timeUnit.toMillis(gracePeriod));
+            } catch (IOException ex) {
+                this.exceptionLogger.log(ex);
+            }
+        }
+    }
+
+}

Propchange: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/bootstrap/Server.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/bootstrap/Server.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/bootstrap/Server.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/bootstrap/ServerBootstrap.java (from r1598053, httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/bootstrap/ServerBootstrap.java)
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/bootstrap/ServerBootstrap.java?p2=httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/bootstrap/ServerBootstrap.java&p1=httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/bootstrap/ServerBootstrap.java&r1=1598053&r2=1598055&rev=1598055&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/bootstrap/ServerBootstrap.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/bootstrap/ServerBootstrap.java Wed May 28 15:52:00 2014
@@ -24,39 +24,40 @@
  * <http://www.apache.org/>.
  *
  */
-package org.apache.http.impl.bootstrap;
+package org.apache.http.impl.nio.bootstrap;
 
 import java.net.InetAddress;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.Map;
 
-import javax.net.ServerSocketFactory;
 import javax.net.ssl.SSLContext;
 
 import org.apache.http.ConnectionReuseStrategy;
 import org.apache.http.ExceptionLogger;
-import org.apache.http.HttpConnectionFactory;
 import org.apache.http.HttpRequestInterceptor;
 import org.apache.http.HttpResponseFactory;
 import org.apache.http.HttpResponseInterceptor;
-import org.apache.http.HttpServerConnection;
 import org.apache.http.config.ConnectionConfig;
-import org.apache.http.config.SocketConfig;
-import org.apache.http.impl.DefaultBHttpServerConnectionFactory;
 import org.apache.http.impl.DefaultConnectionReuseStrategy;
 import org.apache.http.impl.DefaultHttpResponseFactory;
-import org.apache.http.protocol.HttpExpectationVerifier;
+import org.apache.http.impl.nio.DefaultNHttpServerConnection;
+import org.apache.http.impl.nio.DefaultNHttpServerConnectionFactory;
+import org.apache.http.impl.nio.SSLNHttpServerConnectionFactory;
+import org.apache.http.impl.nio.reactor.IOReactorConfig;
+import org.apache.http.nio.NHttpConnectionFactory;
+import org.apache.http.nio.protocol.HttpAsyncExpectationVerifier;
+import org.apache.http.nio.protocol.HttpAsyncRequestHandler;
+import org.apache.http.nio.protocol.HttpAsyncRequestHandlerMapper;
+import org.apache.http.nio.protocol.HttpAsyncService;
+import org.apache.http.nio.protocol.UriHttpAsyncRequestHandlerMapper;
+import org.apache.http.nio.reactor.ssl.SSLSetupHandler;
 import org.apache.http.protocol.HttpProcessor;
 import org.apache.http.protocol.HttpProcessorBuilder;
-import org.apache.http.protocol.HttpRequestHandler;
-import org.apache.http.protocol.HttpRequestHandlerMapper;
-import org.apache.http.protocol.HttpService;
 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;
 
 /**
  * @since 4.4
@@ -65,7 +66,7 @@ public class ServerBootstrap {
 
     private int listenerPort;
     private InetAddress localAddress;
-    private SocketConfig socketConfig;
+    private IOReactorConfig ioReactorConfig;
     private ConnectionConfig connectionConfig;
     private LinkedList<HttpRequestInterceptor> requestFirst;
     private LinkedList<HttpRequestInterceptor> requestLast;
@@ -75,11 +76,12 @@ public class ServerBootstrap {
     private HttpProcessor httpProcessor;
     private ConnectionReuseStrategy connStrategy;
     private HttpResponseFactory responseFactory;
-    private HttpRequestHandlerMapper handlerMapper;
-    private Map<String, HttpRequestHandler> handlerMap;
-    private HttpExpectationVerifier expectationVerifier;
+    private HttpAsyncRequestHandlerMapper handlerMapper;
+    private Map<String, HttpAsyncRequestHandler<?>> handlerMap;
+    private HttpAsyncExpectationVerifier expectationVerifier;
     private SSLContext sslContext;
-    private HttpConnectionFactory<? extends HttpServerConnection> connectionFactory;
+    private SSLSetupHandler sslSetupHandler;
+    private NHttpConnectionFactory<? extends DefaultNHttpServerConnection> connectionFactory;
     private ExceptionLogger exceptionLogger;
 
     private ServerBootstrap() {
@@ -106,10 +108,10 @@ public class ServerBootstrap {
     }
 
     /**
-     * Sets socket configuration.
+     * Sets I/O reactor configuration.
      */
-    public final ServerBootstrap setSocketConfig(final SocketConfig socketConfig) {
-        this.socketConfig = socketConfig;
+    public final ServerBootstrap setIOReactorConfig(final IOReactorConfig ioReactorConfig) {
+        this.ioReactorConfig = ioReactorConfig;
         return this;
     }
 
@@ -117,7 +119,7 @@ public class ServerBootstrap {
      * Sets connection configuration.
      * <p/>
      * Please note this value can be overridden by the {@link #setConnectionFactory(
-     * org.apache.http.HttpConnectionFactory)} method.
+     *   org.apache.http.nio.NHttpConnectionFactory)} method.
      */
     public final ServerBootstrap setConnectionConfig(final ConnectionConfig connectionConfig) {
         this.connectionConfig = connectionConfig;
@@ -125,7 +127,7 @@ public class ServerBootstrap {
     }
 
     /**
-     * Assigns {@link HttpProcessor} instance.
+     * Assigns {@link org.apache.http.protocol.HttpProcessor} instance.
      */
     public final ServerBootstrap setHttpProcessor(final HttpProcessor httpProcessor) {
         this.httpProcessor = httpProcessor;
@@ -212,7 +214,7 @@ public class ServerBootstrap {
     }
 
     /**
-     * Assigns {@link ConnectionReuseStrategy} instance.
+     * Assigns {@link org.apache.http.ConnectionReuseStrategy} instance.
      */
     public final ServerBootstrap setConnectionReuseStrategy(final ConnectionReuseStrategy connStrategy) {
         this.connStrategy = connStrategy;
@@ -220,7 +222,7 @@ public class ServerBootstrap {
     }
 
     /**
-     * Assigns {@link HttpResponseFactory} instance.
+     * Assigns {@link org.apache.http.HttpResponseFactory} instance.
      */
     public final ServerBootstrap setResponseFactory(final HttpResponseFactory responseFactory) {
         this.responseFactory = responseFactory;
@@ -228,53 +230,56 @@ public class ServerBootstrap {
     }
 
     /**
-     * Assigns {@link HttpRequestHandlerMapper} instance.
+     * Assigns {@link org.apache.http.nio.protocol.HttpAsyncRequestHandlerMapper} instance.
      */
-    public final ServerBootstrap setHandlerMapper(final HttpRequestHandlerMapper handlerMapper) {
+    public final ServerBootstrap setHandlerMapper(final HttpAsyncRequestHandlerMapper handlerMapper) {
         this.handlerMapper = handlerMapper;
         return this;
     }
 
     /**
-     * Registers the given {@link HttpRequestHandler} as a handler for URIs
-     * matching the given pattern.
+     * Registers the given {@link org.apache.http.nio.protocol.HttpAsyncRequestHandler}
+     * as a handler for URIs matching the given pattern.
      * <p/>
      * Please note this value can be overridden by the {@link #setHandlerMapper(
-     *   org.apache.http.protocol.HttpRequestHandlerMapper)} method.
+     *   org.apache.http.nio.protocol.HttpAsyncRequestHandlerMapper)} )} method.
      *
      * @param pattern the pattern to register the handler for.
      * @param handler the handler.
      */
-    public final ServerBootstrap registerHandler(final String pattern, final HttpRequestHandler handler) {
+    public final ServerBootstrap registerHandler(final String pattern, final HttpAsyncRequestHandler<?> handler) {
         if (pattern == null || handler == null) {
             return this;
         }
         if (handlerMap == null) {
-            handlerMap = new HashMap<String, HttpRequestHandler>();
+            handlerMap = new HashMap<String, HttpAsyncRequestHandler<?>>();
         }
         handlerMap.put(pattern, handler);
         return this;
     }
 
     /**
-     * Assigns {@link HttpExpectationVerifier} instance.
+     * Assigns {@link org.apache.http.nio.protocol.HttpAsyncExpectationVerifier} instance.
      */
-    public final ServerBootstrap setExpectationVerifier(final HttpExpectationVerifier expectationVerifier) {
+    public final ServerBootstrap setExpectationVerifier(final HttpAsyncExpectationVerifier expectationVerifier) {
         this.expectationVerifier = expectationVerifier;
         return this;
     }
 
     /**
-     * Assigns {@link HttpConnectionFactory} instance.
+     * Assigns {@link org.apache.http.nio.NHttpConnectionFactory} instance.
      */
     public final ServerBootstrap setConnectionFactory(
-            final HttpConnectionFactory<? extends HttpServerConnection> connectionFactory) {
+            final NHttpConnectionFactory<? extends DefaultNHttpServerConnection> connectionFactory) {
         this.connectionFactory = connectionFactory;
         return this;
     }
 
     /**
      * Assigns {@link javax.net.ssl.SSLContext} instance.
+     * <p/>
+     * Please note this value can be overridden by the {@link #setConnectionFactory(
+     *   org.apache.http.nio.NHttpConnectionFactory)} method.
      */
     public final ServerBootstrap setSslContext(final SSLContext sslContext) {
         this.sslContext = sslContext;
@@ -282,6 +287,17 @@ public class ServerBootstrap {
     }
 
     /**
+     * Assigns {@link org.apache.http.nio.reactor.ssl.SSLSetupHandler} instance.
+     * <p/>
+     * Please note this value can be overridden by the {@link #setConnectionFactory(
+     *   org.apache.http.nio.NHttpConnectionFactory)} method.
+     */
+    public ServerBootstrap setSslSetupHandler(final SSLSetupHandler sslSetupHandler) {
+        this.sslSetupHandler = sslSetupHandler;
+        return this;
+    }
+
+    /**
      * Assigns {@link org.apache.http.ExceptionLogger} instance.
      */
     public final ServerBootstrap setExceptionLogger(final ExceptionLogger exceptionLogger) {
@@ -308,7 +324,7 @@ public class ServerBootstrap {
 
             String serverInfoCopy = this.serverInfo;
             if (serverInfoCopy == null) {
-                serverInfoCopy = "Apache-HttpCore/1.1";
+                serverInfoCopy = "Apache-HttpCore-NIO/1.1";
             }
 
             b.addAll(
@@ -329,11 +345,11 @@ public class ServerBootstrap {
             httpProcessorCopy = b.build();
         }
 
-        HttpRequestHandlerMapper handlerMapperCopy = this.handlerMapper;
+        HttpAsyncRequestHandlerMapper handlerMapperCopy = this.handlerMapper;
         if (handlerMapperCopy == null) {
-            final UriHttpRequestHandlerMapper reqistry = new UriHttpRequestHandlerMapper();
+            final UriHttpAsyncRequestHandlerMapper reqistry = new UriHttpAsyncRequestHandlerMapper();
             if (handlerMap != null) {
-                for (Map.Entry<String, HttpRequestHandler> entry: handlerMap.entrySet()) {
+                for (Map.Entry<String, HttpAsyncRequestHandler<?>> entry: handlerMap.entrySet()) {
                     reqistry.register(entry.getKey(), entry.getValue());
                 }
             }
@@ -350,23 +366,13 @@ public class ServerBootstrap {
             responseFactoryCopy = DefaultHttpResponseFactory.INSTANCE;
         }
 
-        final HttpService httpService = new HttpService(
-                httpProcessorCopy, connStrategyCopy, responseFactoryCopy, handlerMapperCopy,
-                this.expectationVerifier);
-
-        final ServerSocketFactory serverSocketFactory;
-        if (this.sslContext != null) {
-            serverSocketFactory = this.sslContext.getServerSocketFactory();
-        } else {
-            serverSocketFactory = ServerSocketFactory.getDefault();
-        }
-
-        HttpConnectionFactory<? extends HttpServerConnection> connectionFactoryCopy = this.connectionFactory;
+        NHttpConnectionFactory<? extends DefaultNHttpServerConnection> connectionFactoryCopy = this.connectionFactory;
         if (connectionFactoryCopy == null) {
-            if (this.connectionConfig != null) {
-                connectionFactoryCopy = new DefaultBHttpServerConnectionFactory(this.connectionConfig);
+            if (this.sslContext != null) {
+                connectionFactoryCopy = new SSLNHttpServerConnectionFactory(
+                        this.sslContext, this.sslSetupHandler, this.connectionConfig);
             } else {
-                connectionFactoryCopy = DefaultBHttpServerConnectionFactory.INSTANCE;
+                connectionFactoryCopy = new DefaultNHttpServerConnectionFactory(this.connectionConfig);
             }
         }
 
@@ -375,14 +381,13 @@ public class ServerBootstrap {
             exceptionLoggerCopy = ExceptionLogger.NO_OP;
         }
 
-        return new Server(
-                this.listenerPort > 0 ? this.listenerPort : 0,
-                this.localAddress,
-                this.socketConfig != null ? this.socketConfig : SocketConfig.DEFAULT,
-                serverSocketFactory,
-                httpService,
-                connectionFactoryCopy,
-                exceptionLoggerCopy);
+        final HttpAsyncService httpService = new HttpAsyncService(
+                httpProcessorCopy, connStrategyCopy, responseFactoryCopy, handlerMapperCopy,
+                this.expectationVerifier, exceptionLoggerCopy);
+
+        return new Server(this.listenerPort, this.localAddress, this.ioReactorConfig,
+                httpService, connectionFactoryCopy, exceptionLoggerCopy);
+
     }
 
 }

Added: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/bootstrap/ThreadFactoryImpl.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/bootstrap/ThreadFactoryImpl.java?rev=1598055&view=auto
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/bootstrap/ThreadFactoryImpl.java (added)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/bootstrap/ThreadFactoryImpl.java Wed May 28 15:52:00 2014
@@ -0,0 +1,56 @@
+/*
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+package org.apache.http.impl.nio.bootstrap;
+
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * @since 4.4
+ */
+class ThreadFactoryImpl implements ThreadFactory {
+
+    private final String namePrefix;
+    private final ThreadGroup group;
+    private final AtomicLong count;
+
+    ThreadFactoryImpl(final String namePrefix, final ThreadGroup group) {
+        this.namePrefix = namePrefix;
+        this.group = group;
+        this.count = new AtomicLong();
+    }
+
+    ThreadFactoryImpl(final String namePrefix) {
+        this(namePrefix, null);
+    }
+
+    @Override
+    public Thread newThread(final Runnable target) {
+        return new Thread(this.group, target, this.namePrefix + "-"  + this.count.incrementAndGet());
+    }
+
+}

Propchange: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/bootstrap/ThreadFactoryImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/bootstrap/ThreadFactoryImpl.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/bootstrap/ThreadFactoryImpl.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/bootstrap/package-info.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/bootstrap/package-info.java?rev=1598055&view=auto
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/bootstrap/package-info.java (added)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/bootstrap/package-info.java Wed May 28 15:52:00 2014
@@ -0,0 +1,31 @@
+/*
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+/**
+ * Embedded non-blocking server and server bootstrap.
+ */
+package org.apache.http.impl.nio.bootstrap;

Propchange: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/bootstrap/package-info.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/bootstrap/package-info.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/bootstrap/package-info.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

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=1598055&r1=1598054&r2=1598055&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 Wed May 28 15:52:00 2014
@@ -41,6 +41,7 @@ import org.apache.http.ExceptionLogger;
 import org.apache.http.HttpConnectionFactory;
 import org.apache.http.HttpServerConnection;
 import org.apache.http.config.SocketConfig;
+import org.apache.http.impl.DefaultBHttpServerConnection;
 import org.apache.http.protocol.HttpService;
 
 /**
@@ -55,7 +56,7 @@ public class Server {
     private final SocketConfig socketConfig;
     private final ServerSocketFactory serverSocketFactory;
     private final HttpService httpService;
-    private final HttpConnectionFactory<? extends HttpServerConnection> connectionFactory;
+    private final HttpConnectionFactory<? extends DefaultBHttpServerConnection> connectionFactory;
     private final ExceptionLogger exceptionLogger;
     private final ExecutorService listenerExecutorService;
     private final ThreadGroup workerThreads;
@@ -71,7 +72,7 @@ public class Server {
             final SocketConfig socketConfig,
             final ServerSocketFactory serverSocketFactory,
             final HttpService httpService,
-            final HttpConnectionFactory<? extends HttpServerConnection> connectionFactory,
+            final HttpConnectionFactory<? extends DefaultBHttpServerConnection> connectionFactory,
             final ExceptionLogger exceptionLogger) {
         this.port = port;
         this.ifAddress = ifAddress;

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=1598055&r1=1598054&r2=1598055&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 Wed May 28 15:52:00 2014
@@ -40,9 +40,9 @@ import org.apache.http.HttpConnectionFac
 import org.apache.http.HttpRequestInterceptor;
 import org.apache.http.HttpResponseFactory;
 import org.apache.http.HttpResponseInterceptor;
-import org.apache.http.HttpServerConnection;
 import org.apache.http.config.ConnectionConfig;
 import org.apache.http.config.SocketConfig;
+import org.apache.http.impl.DefaultBHttpServerConnection;
 import org.apache.http.impl.DefaultBHttpServerConnectionFactory;
 import org.apache.http.impl.DefaultConnectionReuseStrategy;
 import org.apache.http.impl.DefaultHttpResponseFactory;
@@ -79,7 +79,7 @@ public class ServerBootstrap {
     private Map<String, HttpRequestHandler> handlerMap;
     private HttpExpectationVerifier expectationVerifier;
     private SSLContext sslContext;
-    private HttpConnectionFactory<? extends HttpServerConnection> connectionFactory;
+    private HttpConnectionFactory<? extends DefaultBHttpServerConnection> connectionFactory;
     private ExceptionLogger exceptionLogger;
 
     private ServerBootstrap() {
@@ -268,7 +268,7 @@ public class ServerBootstrap {
      * Assigns {@link HttpConnectionFactory} instance.
      */
     public final ServerBootstrap setConnectionFactory(
-            final HttpConnectionFactory<? extends HttpServerConnection> connectionFactory) {
+            final HttpConnectionFactory<? extends DefaultBHttpServerConnection> connectionFactory) {
         this.connectionFactory = connectionFactory;
         return this;
     }
@@ -361,7 +361,7 @@ public class ServerBootstrap {
             serverSocketFactory = ServerSocketFactory.getDefault();
         }
 
-        HttpConnectionFactory<? extends HttpServerConnection> connectionFactoryCopy = this.connectionFactory;
+        HttpConnectionFactory<? extends DefaultBHttpServerConnection> connectionFactoryCopy = this.connectionFactory;
         if (connectionFactoryCopy == null) {
             if (this.connectionConfig != null) {
                 connectionFactoryCopy = new DefaultBHttpServerConnectionFactory(this.connectionConfig);