package org.webpieces.httpclient;
import java.net.InetSocketAddress;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.webpieces.data.api.BufferCreationPool;
import org.webpieces.data.api.BufferPool;
import org.webpieces.data.api.DataWrapper;
import org.webpieces.httpclient.api.HttpClient;
import org.webpieces.httpclient.api.HttpClientFactory;
import org.webpieces.httpclient.api.HttpResponseListener;
import org.webpieces.httpclient.api.HttpSocket;
import org.webpieces.httpparser.api.HttpParser;
import org.webpieces.httpparser.api.HttpParserFactory;
import org.webpieces.httpparser.api.common.Header;
import org.webpieces.httpparser.api.common.KnownHeaderName;
import org.webpieces.httpparser.api.dto.HttpChunk;
import org.webpieces.httpparser.api.dto.HttpRequest;
import org.webpieces.httpparser.api.dto.HttpRequestLine;
import org.webpieces.httpparser.api.dto.HttpResponse;
import org.webpieces.httpparser.api.dto.HttpUri;
import org.webpieces.httpparser.api.dto.KnownHttpMethod;
import org.webpieces.nio.api.ChannelManager;
import org.webpieces.nio.api.ChannelManagerFactory;
import org.webpieces.util.threading.NamedThreadFactory;
public class IntegGoogleHttps {
private static final Logger log = LoggerFactory.getLogger(IntegGoogleHttps.class);
public static void main(String[] args) throws InterruptedException {
new IntegGoogleHttps().start();
}
public void start() throws InterruptedException {
log.info("starting test to download / page from google");
boolean isHttp = false;
String host = "www.google.com";
int port = 443;
if(isHttp)
port = 80;
HttpRequestLine requestLine = new HttpRequestLine();
requestLine.setMethod(KnownHttpMethod.GET);
requestLine.setUri(new HttpUri("/"));
HttpRequest req = new HttpRequest();
req.setRequestLine(requestLine);
req.addHeader(new Header(KnownHeaderName.HOST, host));
req.addHeader(new Header(KnownHeaderName.ACCEPT, "*/*"));
req.addHeader(new Header(KnownHeaderName.USER_AGENT, "webpieces/0.9"));
HttpSocket socket = createSocket(isHttp, host, port);
socket
.connect(new InetSocketAddress(host, port))
.thenAccept(p -> sendRequest(socket, req))
.exceptionally(e -> reportException(socket, e));
Thread.sleep(100000);
}
public static HttpSocket createSocket(boolean isHttp, String host, int port) {
HttpClient client = createHttpClient();
HttpSocket socket;
if(isHttp)
socket = client.createHttpSocket("oneTimer");
else {
ForTestSslClientEngineFactory sslFactory = new ForTestSslClientEngineFactory();
socket = client.createHttpsSocket("oneTimer", sslFactory.createSslEngine(host, port));
}
return socket;
}
public static HttpClient createHttpClient() {
BufferPool pool2 = new BufferCreationPool();
Executor executor2 = Executors.newFixedThreadPool(10, new NamedThreadFactory("clientThread"));
ChannelManagerFactory factory = ChannelManagerFactory.createFactory();
ChannelManager mgr = factory.createMultiThreadedChanMgr("client", pool2, executor2);
HttpParser parser = HttpParserFactory.createParser(pool2);
HttpClient client = HttpClientFactory.createHttpClient(mgr, parser);
return client;
}
private void sendRequest(HttpSocket socket, HttpRequest req) {
socket.send(req, new OurListener());
}
private Void reportException(HttpSocket socket, Throwable e) {
log.error("exception on socket="+socket, e);
return null;
}
private static class OurListener implements HttpResponseListener {
@Override
public void incomingResponse(HttpResponse resp, boolean isComplete) {
log.info("resp="+resp+" complete="+isComplete);
}
@Override
public void incomingChunk(HttpChunk chunk, boolean isLastChunk) {
DataWrapper wrapper = chunk.getBody();
String result = wrapper.createStringFrom(0, wrapper.getReadableSize(), HttpParserFactory.iso8859_1);
log.info("result=(lastChunk="+isLastChunk+"\n"+result+"/////");
}
@Override
public void failure(Throwable e) {
log.error("exception", e);
}
}
}