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/30 10:40:34 UTC
svn commit: r1598494 - in /httpcomponents/httpcore/trunk:
httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpServer.java
httpcore/src/examples/org/apache/http/examples/ElementalHttpServer.java
Author: olegk
Date: Fri May 30 08:40:34 2014
New Revision: 1598494
URL: http://svn.apache.org/r1598494
Log:
Updated embedded server examples (blocking and non-blocking)
Modified:
httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpServer.java
httpcomponents/httpcore/trunk/httpcore/src/examples/org/apache/http/examples/ElementalHttpServer.java
Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpServer.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpServer.java?rev=1598494&r1=1598493&r2=1598494&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpServer.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpServer.java Fri May 30 08:40:34 2014
@@ -28,33 +28,27 @@ package org.apache.http.examples.nio;
import java.io.File;
import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.net.InetSocketAddress;
import java.net.URL;
import java.net.URLDecoder;
import java.security.KeyStore;
import java.util.Locale;
+import java.util.concurrent.TimeUnit;
import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
+import org.apache.http.ExceptionLogger;
+import org.apache.http.HttpConnection;
import org.apache.http.HttpException;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.MethodNotSupportedException;
-import org.apache.http.config.ConnectionConfig;
import org.apache.http.entity.ContentType;
-import org.apache.http.impl.nio.DefaultHttpServerIODispatch;
-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.DefaultListeningIOReactor;
+import org.apache.http.impl.nio.bootstrap.Server;
+import org.apache.http.impl.nio.bootstrap.ServerBootstrap;
import org.apache.http.impl.nio.reactor.IOReactorConfig;
-import org.apache.http.nio.NHttpConnection;
-import org.apache.http.nio.NHttpConnectionFactory;
-import org.apache.http.nio.NHttpServerConnection;
import org.apache.http.nio.entity.NFileEntity;
import org.apache.http.nio.entity.NStringEntity;
import org.apache.http.nio.protocol.BasicAsyncRequestConsumer;
@@ -62,21 +56,11 @@ import org.apache.http.nio.protocol.Basi
import org.apache.http.nio.protocol.HttpAsyncExchange;
import org.apache.http.nio.protocol.HttpAsyncRequestConsumer;
import org.apache.http.nio.protocol.HttpAsyncRequestHandler;
-import org.apache.http.nio.protocol.HttpAsyncService;
-import org.apache.http.nio.protocol.UriHttpAsyncRequestHandlerMapper;
-import org.apache.http.nio.reactor.IOEventDispatch;
-import org.apache.http.nio.reactor.ListeningIOReactor;
import org.apache.http.protocol.HttpContext;
import org.apache.http.protocol.HttpCoreContext;
-import org.apache.http.protocol.HttpProcessor;
-import org.apache.http.protocol.HttpProcessorBuilder;
-import org.apache.http.protocol.ResponseConnControl;
-import org.apache.http.protocol.ResponseContent;
-import org.apache.http.protocol.ResponseDate;
-import org.apache.http.protocol.ResponseServer;
/**
- * HTTP/1.1 file server based on the non-blocking I/O model and capable of direct channel
+ * Embedded HTTP/1.1 file server based on a non-blocking I/O model and capable of direct channel
* (zero copy) data transfer.
*/
public class NHttpServer {
@@ -93,34 +77,7 @@ public class NHttpServer {
port = Integer.parseInt(args[1]);
}
- // Create HTTP protocol processing chain
- HttpProcessor httpproc = HttpProcessorBuilder.create()
- .add(new ResponseDate())
- .add(new ResponseServer("Test/1.1"))
- .add(new ResponseContent())
- .add(new ResponseConnControl()).build();
- // Create request handler registry
- UriHttpAsyncRequestHandlerMapper reqistry = new UriHttpAsyncRequestHandlerMapper();
- // Register the default handler for all URIs
- reqistry.register("*", new HttpFileHandler(docRoot));
- // Create server-side HTTP protocol handler
- HttpAsyncService protocolHandler = new HttpAsyncService(httpproc, reqistry) {
-
- @Override
- public void connected(final NHttpServerConnection conn) {
- System.out.println(conn + ": connection open");
- super.connected(conn);
- }
-
- @Override
- public void closed(final NHttpServerConnection conn) {
- System.out.println(conn + ": connection closed");
- super.closed(conn);
- }
-
- };
- // Create HTTP connection factory
- NHttpConnectionFactory<DefaultNHttpServerConnection> connFactory;
+ SSLContext sslcontext = null;
if (port == 8443) {
// Initialize SSL context
ClassLoader cl = NHttpServer.class.getClassLoader();
@@ -135,35 +92,34 @@ public class NHttpServer {
KeyManagerFactory.getDefaultAlgorithm());
kmfactory.init(keystore, "secret".toCharArray());
KeyManager[] keymanagers = kmfactory.getKeyManagers();
- SSLContext sslcontext = SSLContext.getInstance("TLS");
+ sslcontext = SSLContext.getInstance("TLS");
sslcontext.init(keymanagers, null, null);
- connFactory = new SSLNHttpServerConnectionFactory(sslcontext,
- null, ConnectionConfig.DEFAULT);
- } else {
- connFactory = new DefaultNHttpServerConnectionFactory(
- ConnectionConfig.DEFAULT);
- }
- // Create server-side I/O event dispatch
- IOEventDispatch ioEventDispatch = new DefaultHttpServerIODispatch(protocolHandler, connFactory);
- // Set I/O reactor defaults
- IOReactorConfig config = IOReactorConfig.custom()
- .setIoThreadCount(1)
- .setSoTimeout(3000)
- .setConnectTimeout(3000)
- .build();
- // Create server-side I/O reactor
- ListeningIOReactor ioReactor = new DefaultListeningIOReactor(config);
- try {
- // Listen of the given port
- ioReactor.listen(new InetSocketAddress(port));
- // Ready to go!
- ioReactor.execute(ioEventDispatch);
- } catch (InterruptedIOException ex) {
- System.err.println("Interrupted");
- } catch (IOException e) {
- System.err.println("I/O error: " + e.getMessage());
}
- System.out.println("Shutdown");
+
+ IOReactorConfig config = IOReactorConfig.custom()
+ .setSoTimeout(15000)
+ .setTcpNoDelay(true)
+ .build();
+
+ final Server server = ServerBootstrap.bootstrap()
+ .setListenerPort(port)
+ .setServerInfo("Test/1.1")
+ .setIOReactorConfig(config)
+ .setSslContext(sslcontext)
+ .setExceptionLogger(ExceptionLogger.STD_ERR)
+ .registerHandler("*", new HttpFileHandler(docRoot))
+ .create();
+
+ server.start();
+ server.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
+
+ Runtime.getRuntime().addShutdownHook(new Thread() {
+ @Override
+ public void run() {
+ server.shutdown(5, TimeUnit.SECONDS);
+ }
+ });
+
}
static class HttpFileHandler implements HttpAsyncRequestHandler<HttpRequest> {
@@ -196,8 +152,6 @@ public class NHttpServer {
final HttpResponse response,
final HttpContext context) throws HttpException, IOException {
- HttpCoreContext coreContext = HttpCoreContext.adapt(context);
-
String method = request.getRequestLine().getMethod().toUpperCase(Locale.ENGLISH);
if (!method.equals("GET") && !method.equals("HEAD") && !method.equals("POST")) {
throw new MethodNotSupportedException(method + " method not supported");
@@ -225,7 +179,9 @@ public class NHttpServer {
System.out.println("Cannot read file " + file.getPath());
} else {
- NHttpConnection conn = coreContext.getConnection(NHttpConnection.class);
+
+ HttpCoreContext coreContext = HttpCoreContext.adapt(context);
+ HttpConnection conn = coreContext.getConnection(HttpConnection.class);
response.setStatusCode(HttpStatus.SC_OK);
NFileEntity body = new NFileEntity(file, ContentType.create("text/html"));
response.setEntity(body);
Modified: httpcomponents/httpcore/trunk/httpcore/src/examples/org/apache/http/examples/ElementalHttpServer.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/examples/org/apache/http/examples/ElementalHttpServer.java?rev=1598494&r1=1598493&r2=1598494&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/examples/org/apache/http/examples/ElementalHttpServer.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/examples/org/apache/http/examples/ElementalHttpServer.java Fri May 30 08:40:34 2014
@@ -43,6 +43,7 @@ import javax.net.ssl.SSLContext;
import org.apache.http.ConnectionClosedException;
import org.apache.http.ExceptionLogger;
+import org.apache.http.HttpConnection;
import org.apache.http.HttpEntity;
import org.apache.http.HttpEntityEnclosingRequest;
import org.apache.http.HttpException;
@@ -57,11 +58,12 @@ import org.apache.http.entity.StringEnti
import org.apache.http.impl.bootstrap.Server;
import org.apache.http.impl.bootstrap.ServerBootstrap;
import org.apache.http.protocol.HttpContext;
+import org.apache.http.protocol.HttpCoreContext;
import org.apache.http.protocol.HttpRequestHandler;
import org.apache.http.util.EntityUtils;
/**
- * Embedded HTTP/1.1 file server.
+ * Embedded HTTP/1.1 file server based on a classic (blocking) I/O model.
*/
public class ElementalHttpServer {
@@ -183,11 +185,12 @@ public class ElementalHttpServer {
System.out.println("Cannot read file " + file.getPath());
} else {
-
+ HttpCoreContext coreContext = HttpCoreContext.adapt(context);
+ HttpConnection conn = coreContext.getConnection(HttpConnection.class);
response.setStatusCode(HttpStatus.SC_OK);
FileEntity body = new FileEntity(file, ContentType.create("text/html", (Charset) null));
response.setEntity(body);
- System.out.println("Serving file " + file.getPath());
+ System.out.println(conn + ": serving file " + file.getPath());
}
}