package io.datakernel; import io.datakernel.async.IgnoreCompletionCallback; import io.datakernel.async.ResultCallback; import io.datakernel.dns.AsyncDnsClient; import io.datakernel.eventloop.Eventloop; import io.datakernel.http.*; import io.datakernel.util.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.net.ssl.SSLContext; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Iterator; import java.util.List; import java.util.Random; import java.util.concurrent.ExecutorService; import static io.datakernel.eventloop.FatalErrorHandlers.rethrowOnAnyError; import static io.datakernel.http.HttpHeaders.*; import static io.datakernel.http.HttpUtils.inetAddress; import static io.datakernel.http.MediaTypes.*; import static java.util.concurrent.Executors.newCachedThreadPool; public class ClientStressTest { private final Logger logger = LoggerFactory.getLogger(this.getClass()); private static final String PATH_TO_URLS = "./src/test/resources/urls.txt"; private Eventloop eventloop = Eventloop.create().withFatalErrorHandler(rethrowOnAnyError()); private ExecutorService executor = newCachedThreadPool(); private Random random = new Random(); private Iterator<String> urls = getUrls().iterator(); private AsyncServlet servlet = new AsyncServlet() { @Override public void serve(HttpRequest request, ResultCallback<HttpResponse> callback) { test(); callback.setResult(HttpResponse.ok200()); } }; private AsyncHttpServer server = AsyncHttpServer.create(eventloop, servlet).withListenPort(1234); private final SSLContext context = SSLContext.getDefault(); private AsyncHttpClient client = AsyncHttpClient.create(eventloop) .withDnsClient(AsyncDnsClient.create(eventloop).withDnsServerAddress(inetAddress("8.8.8.8"))) .withSslEnabled(context, executor); private ClientStressTest() throws Exception {} private void doTest() throws IOException { server.listen(); eventloop.run(); } private void test() { int delay = random.nextInt(10000); final String url = urls.next(); if (url != null) { eventloop.schedule(eventloop.currentTimeMillis() + delay, new Runnable() { @Override public void run() { logger.info("sending request to: {}", url); client.send(formRequest(url, random.nextBoolean()), new ResultCallback<HttpResponse>() { @Override public void onResult(HttpResponse result) { logger.info("url: {}, succeed", url); } @Override public void onException(Exception e) { logger.error("url: {}, failed", url, e); } }); test(); } }); } else { server.close(IgnoreCompletionCallback.create()); } } private List<String> getUrls() throws IOException { return StringUtils.splitToList('\n', new String(Files.readAllBytes(Paths.get(PATH_TO_URLS)))); } private HttpRequest formRequest(String url, boolean keepAlive) { HttpRequest request = HttpRequest.get(url); request.addHeader(CACHE_CONTROL, "max-age=0"); request.addHeader(ACCEPT_ENCODING, "gzip, deflate, sdch"); request.addHeader(ACCEPT_LANGUAGE, "en-US,en;q=0.8"); request.addHeader(USER_AGENT, "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36"); request.setAccept(AcceptMediaType.of(HTML), AcceptMediaType.of(XHTML_APP), AcceptMediaType.of(XML_APP, 90), AcceptMediaType.of(WEBP), AcceptMediaType.of(ANY, 80)); if (keepAlive) { request.addHeader(CONNECTION, "keep-alive"); } return request; } public static void main(String[] args) throws Exception { new ClientStressTest().doTest(); } }