package org.keycloak.testsuite.performance.httpclient; import org.apache.http.client.config.CookieSpecs; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpHead; import org.apache.http.client.methods.HttpOptions; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.protocol.HttpClientContext; import org.apache.http.config.SocketConfig; import org.apache.http.impl.client.BasicCookieStore; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.DefaultHttpRequestRetryHandler; import org.apache.http.impl.client.DefaultRedirectStrategy; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.junit.After; import org.junit.Before; import org.keycloak.testsuite.performance.PerformanceTest; import java.io.IOException; import static org.keycloak.testsuite.performance.PerformanceTest.MAX_THREADS; /** * * @author tkyjovsk */ public abstract class HttpClientPerformanceTest extends PerformanceTest { protected CloseableHttpClient client; public static final Integer HTTP_CLIENT_SOCKET_TIMEOUT = Integer.parseInt(System.getProperty("httpclient.socket.timeout", "10000")); public static final Integer HTTP_CLIENT_CONNECT_TIMEOUT = Integer.parseInt(System.getProperty("httpclient.connect.timeout", "10000")); public static final Integer HTTP_CLIENT_CONNECTION_REQUEST_TIMEOUT = Integer.parseInt(System.getProperty("httpclient.connection-request.timeout", "10000")); @Before public void initializeClient() { PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(); connectionManager.setMaxTotal(Math.max(1, MAX_THREADS / 10)); connectionManager.setDefaultMaxPerRoute(connectionManager.getMaxTotal()); connectionManager.setValidateAfterInactivity(10000); connectionManager.setDefaultSocketConfig(getDefaultSocketConfig()); client = HttpClients.custom() .setConnectionManager(connectionManager) .setDefaultCookieStore(new BasicCookieStore()) .setDefaultRequestConfig(getDefaultRequestConfig()) .setRedirectStrategy(new CustomRedirectStrategy()) .setRetryHandler(new DefaultHttpRequestRetryHandler(0, false)) .build(); } protected SocketConfig getDefaultSocketConfig() { return SocketConfig.copy(SocketConfig.DEFAULT) .setSoTimeout(HTTP_CLIENT_SOCKET_TIMEOUT).build(); } protected RequestConfig getDefaultRequestConfig() { return RequestConfig.custom() .setSocketTimeout(HTTP_CLIENT_SOCKET_TIMEOUT) .setConnectTimeout(HTTP_CLIENT_CONNECT_TIMEOUT) .setConnectionRequestTimeout(HTTP_CLIENT_CONNECTION_REQUEST_TIMEOUT) .setCookieSpec(CookieSpecs.DEFAULT) .setRedirectsEnabled(true) .setRelativeRedirectsAllowed(true) .setCircularRedirectsAllowed(false) .setMaxRedirects(2) .build(); } public class CustomRedirectStrategy extends DefaultRedirectStrategy { private final String[] REDIRECT_METHODS; public CustomRedirectStrategy() { this.REDIRECT_METHODS = new String[]{ HttpGet.METHOD_NAME, HttpPost.METHOD_NAME, HttpHead.METHOD_NAME, HttpDelete.METHOD_NAME, HttpOptions.METHOD_NAME }; } @Override protected boolean isRedirectable(String method) { for (final String m : REDIRECT_METHODS) { if (m.equalsIgnoreCase(method)) { return true; } } return false; } } @After public void closeClient() throws IOException { client.close(); } public abstract class Runnable extends PerformanceTest.Runnable { protected HttpClientContext context; public Runnable() { this.context = HttpClientContext.create(); this.context.setCookieStore(new BasicCookieStore()); } } }