Skip to content

Latest commit

 

History

History
114 lines (75 loc) · 4.8 KB

README.md

File metadata and controls

114 lines (75 loc) · 4.8 KB

NIOHttp

Build Status

Reading and writing HTTP request and response objects from and to java.nio.channels .

⚠️ This project has exploratory character and is in a very early stage of development.

Goals

  • Create a library/toolkit to write and read HTTP requests to and from java.nio.channels (Java's non-blocking IO)
  • Explore java.util.concurrentjava.util.concurrent API
  • Do not use external frameworks, integrate HTTP protocol and java.nio.channels using JDK 1.8+.

Boundary Conditions

  • zero external dependencies beside standard JDK except for unit & integration testing and build automation

Idea

First one need to connect a SocketStream to a URL such as http://www.raumzeitfalle.de/.

 
 URL url = new URL("http://www.raumzeitfalle.de/");
 InetSocketAddress address = new InetSocketAddress(url.getHost(), url.getDefaultPort());
 SocketChannel socketChannel = SocketChannel.open(address);

The server won't respond unless a request is sent (for example a GET request).

  writeGetRequestTo(socketChannel);
  

Even with bad requests server will respond, however, this may take time and response time is different. Here the static HttpResponseReader.fromChannel(...) method provides a FutureTask< Void > which can be executed by an ExecutorService. To collect the result, a Consumer< HttpResponse > must be provided. (https://github.com/Oliver-Loeffler/NIOHttp/blob/master/src/main/java/net/raumzeitfalle/niohttp/playground/FutureDemo.java)

 FutureTask<Void> futureTask = HttpResponseReader
 				.fromChannel(socketChannel,r -> System.out.println(r.responseHeader());
 		
 ExecutorService executor = Executors.newFixedThreadPool(1);
 executor.submit(futureTask);

Furthermore HttpResponseReader.fromChannel(...) returns a Stream of HttpResponse objects (https://github.com/Oliver-Loeffler/NIOHttp/blob/master/src/main/java/net/raumzeitfalle/niohttp/playground/StreamDemo.java)

Stream<HttpResponse> responseStream = HttpResponseReader.fromChannel(socketChannel); 
responseStream.findFirst().ifPresent(consumer);

This would enable (given appropriate HttpResponse capabilities), interesting ways of working with HttpResponses.

HttpResponseReader.fromChannel(socketChannel)
	    .filter( r -> r.isNotBadRequest() )
	    .findFirst().ifPresent(consumer);
	    

The current implementation is not yet fully functional here, as the HttpResponseReader only reads exactly one message from a channel. The response reading process has to be extended for continuous reading so that HttpResponse streaming will work.

Resources

The HTTP/1.1 Protocol

HTTP/2 Protocol

HTTP over TLS (transport layer security)

Java non-blocking IO (NIO and NIO2) and Networking

Other helpful references