package org.webpieces.http2client.integ; import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; import java.util.concurrent.Executors; import javax.net.ssl.SSLEngine; import org.webpieces.data.api.BufferCreationPool; import org.webpieces.data.api.BufferPool; import org.webpieces.http2client.api.Http2Client; import org.webpieces.http2client.api.Http2ClientFactory; import org.webpieces.http2client.api.Http2Socket; import org.webpieces.nio.api.ChannelManager; import org.webpieces.nio.api.ChannelManagerFactory; import org.webpieces.util.logging.Logger; import org.webpieces.util.logging.LoggerFactory; import org.webpieces.util.threading.NamedThreadFactory; import com.webpieces.hpack.api.HpackParser; import com.webpieces.hpack.api.HpackParserFactory; import com.webpieces.hpack.api.dto.Http2Headers; import com.webpieces.http2engine.api.client.Http2ResponseListener; import com.webpieces.http2engine.api.client.InjectionConfig; import com.webpieces.http2engine.api.client.PushPromiseListener; import com.webpieces.http2parser.api.dto.lib.Http2Header; import com.webpieces.http2parser.api.dto.lib.Http2HeaderName; import com.webpieces.http2parser.api.dto.lib.PartialStream; public class IntegSingleRequest { private static final Logger log = LoggerFactory.getLogger(IntegSingleRequest.class); public static void main(String[] args) throws InterruptedException { new IntegSingleRequest().start(); } public void start() throws InterruptedException { log.info("starting test to download / page from google"); boolean isHttp = true; String host = "www.google.com"; //String host = "localhost"; //jetty //String host = "api.push.apple.com"; //String host = "gcm-http.googleapis.com"; //String host = "nghttp2.org"; int port = 443; if(isHttp) port = 80; if("localhost".equals(host)) { port = 8443; if(isHttp) port = 8080; } List<Http2Header> req = createRequest(host, isHttp); Http2Headers request = new Http2Headers(req); request.setEndOfStream(true); InetSocketAddress addr = new InetSocketAddress(host, port); Http2Socket socket = createHttpClient("testRunSocket", isHttp, addr); socket .connect(addr) .thenAccept(s -> s.send(request, new ChunkedResponseListener())) .exceptionally(e -> reportException(socket, e)); Thread.sleep(10000000); } public static Http2Socket createHttpClient(String id, boolean isHttp, InetSocketAddress addr) { BufferPool pool2 = new BufferCreationPool(); HpackParser hpackParser = HpackParserFactory.createParser(pool2, false); Executor executor2 = Executors.newFixedThreadPool(10, new NamedThreadFactory("clientThread")); ChannelManagerFactory factory = ChannelManagerFactory.createFactory(); ChannelManager mgr = factory.createMultiThreadedChanMgr("client", pool2, executor2); InjectionConfig injConfig = new InjectionConfig(executor2, hpackParser); String host = addr.getHostName(); int port = addr.getPort(); ForTestSslClientEngineFactory ssl = new ForTestSslClientEngineFactory(); SSLEngine engine = ssl.createSslEngine(host, port); Http2Client client = Http2ClientFactory.createHttpClient(mgr, injConfig); Http2Socket socket; if(isHttp) { socket = client.createHttpSocket(id); } else { socket = client.createHttpsSocket(id, engine); } return socket; } private Void reportException(Http2Socket socket, Throwable e) { log.error("exception on socket="+socket, e); return null; } private static class ChunkedResponseListener implements Http2ResponseListener, PushPromiseListener { @Override public CompletableFuture<Void> incomingPartialResponse(PartialStream response) { log.info("incoming part of response="+response); return CompletableFuture.completedFuture(null); } @Override public PushPromiseListener newIncomingPush(int streamId) { return this; } @Override public CompletableFuture<Void> incomingPushPromise(PartialStream response) { log.info("incoming push promise. response="+response); return CompletableFuture.completedFuture(null); } } private static List<Http2Header> createRequest(String host, boolean isHttp) { String scheme; if(isHttp) scheme = "http"; else scheme = "https"; List<Http2Header> headers = new ArrayList<>(); headers.add(new Http2Header(Http2HeaderName.METHOD, "GET")); headers.add(new Http2Header(Http2HeaderName.AUTHORITY, host)); headers.add(new Http2Header(Http2HeaderName.PATH, "/")); headers.add(new Http2Header(Http2HeaderName.SCHEME, scheme)); headers.add(new Http2Header(Http2HeaderName.HOST, host)); headers.add(new Http2Header(Http2HeaderName.ACCEPT, "*/*")); headers.add(new Http2Header(Http2HeaderName.ACCEPT_ENCODING, "gzip, deflate")); headers.add(new Http2Header(Http2HeaderName.USER_AGENT, "webpieces/1.15.0")); return headers; } }