use of com.predic8.membrane.core.transport.http.HttpClient in project service-proxy by membrane.
the class HttpKeepAliveTest method testMaxParameter.
@Test
public void testMaxParameter() throws Exception {
HttpClient client = new HttpClient();
sp1.getInterceptors().add(0, new AbstractInterceptor() {
@Override
public Outcome handleResponse(Exchange exc) throws Exception {
exc.getResponse().getHeader().add(Header.KEEP_ALIVE, "max=2");
return Outcome.CONTINUE;
}
});
assertEquals(200, issueRequest(client));
assertEquals(200, issueRequest(client));
assertEquals(1, set.size());
assertEquals(200, issueRequest(client));
assertEquals(2, set.size());
assertEquals(200, issueRequest(client));
assertEquals(2, set.size());
assertEquals(200, issueRequest(client));
assertEquals(3, set.size());
}
use of com.predic8.membrane.core.transport.http.HttpClient in project service-proxy by membrane.
the class HttpKeepAliveTest method testTimeoutCustom.
@Test
public void testTimeoutCustom() throws Exception {
HttpClient client = createHttpClient(1000);
sp1.getInterceptors().add(0, new AbstractInterceptor() {
@Override
public Outcome handleResponse(Exchange exc) throws Exception {
exc.getResponse().getHeader().add(Header.KEEP_ALIVE, "timeout=1,max=2");
return Outcome.CONTINUE;
}
});
assertEquals(200, issueRequest(client));
assertEquals(1, set.size());
Thread.sleep(1500);
assertEquals(200, issueRequest(client));
assertEquals(2, set.size());
assertEquals(200, issueRequest(client));
assertEquals(2, set.size());
assertEquals(200, issueRequest(client));
assertEquals(3, set.size());
}
use of com.predic8.membrane.core.transport.http.HttpClient in project service-proxy by membrane.
the class ProxySSLTest method test.
@Test
public void test() throws Exception {
// Step 1: create the backend
Router backend = new Router();
backend.setHotDeploy(false);
ServiceProxy sp = new ServiceProxy(new ServiceProxyKey(backendPort), null, 0);
if (backendUsesSSL) {
SSLParser ssl = new SSLParser();
ssl.setKeyStore(new KeyStore());
ssl.getKeyStore().setLocation("classpath:/ssl-rsa.keystore");
ssl.getKeyStore().setKeyPassword("secret");
sp.setSslInboundParser(ssl);
}
sp.getInterceptors().add(new CountInterceptor());
backend.getRuleManager().addProxy(sp, RuleManager.RuleDefinitionSource.MANUAL);
backend.start();
// Step 2: put a proxy in front of it
AtomicInteger proxyCounter = new AtomicInteger();
Router proxyRouter = new Router();
proxyRouter.setHotDeploy(false);
ProxyRule proxy = new ProxyRule(new ProxyRuleKey(proxyPort));
proxy.getInterceptors().add(new AbstractInterceptor() {
@Override
public Outcome handleRequest(Exchange exc) throws Exception {
proxyCounter.incrementAndGet();
return super.handleRequest(exc);
}
});
if (proxyUsesSSL) {
SSLParser ssl = new SSLParser();
ssl.setKeyStore(new KeyStore());
ssl.getKeyStore().setLocation("classpath:/ssl-rsa2.keystore");
ssl.getKeyStore().setKeyPassword("secret");
proxy.setSslInboundParser(ssl);
}
proxyRouter.getRuleManager().addProxy(proxy, RuleManager.RuleDefinitionSource.MANUAL);
proxyRouter.start();
// Step 3: configure the client to access the backend through the proxy
HttpClientConfiguration httpClientConfiguration = new HttpClientConfiguration();
ProxyConfiguration proxyConfiguration = new ProxyConfiguration();
proxyConfiguration.setHost("localhost");
proxyConfiguration.setPort(proxyPort);
if (proxyUsesSSL) {
SSLParser ssl = new SSLParser();
ssl.setTrustStore(new TrustStore());
ssl.getTrustStore().setLocation("classpath:/ssl-rsa-pub2.keystore");
ssl.getTrustStore().setPassword("secret");
// workarond the fact that the certificate was not issued for 'localhost'
ssl.setEndpointIdentificationAlgorithm("");
proxyConfiguration.setSslParser(ssl);
}
httpClientConfiguration.setProxy(proxyConfiguration);
HttpClient hc = new HttpClient(httpClientConfiguration);
// Step 4: Test client
Exchange exc = new Request.Builder().get("http" + (backendUsesSSL ? "s" : "") + "://localhost:" + backendPort + "/foo").buildExchange();
if (backendUsesSSL) {
SSLParser ssl = new SSLParser();
ssl.setTrustStore(new TrustStore());
ssl.getTrustStore().setLocation("classpath:/ssl-rsa-pub.keystore");
ssl.getTrustStore().setPassword("secret");
// workarond the fact that the certificate was not issued for 'localhost'
ssl.setEndpointIdentificationAlgorithm("");
exc.setProperty(Exchange.SSL_CONTEXT, new StaticSSLContext(ssl, new ResolverMap(), null));
}
hc.call(exc);
Assert.assertEquals(200, exc.getResponse().getStatusCode());
Assert.assertEquals("Did the request go through the proxy?", 1, proxyCounter.get());
proxyRouter.shutdown();
backend.shutdown();
}
use of com.predic8.membrane.core.transport.http.HttpClient in project service-proxy by membrane.
the class OAuth2ResourceTest method testUseRefreshTokenOnTokenExpiration.
// this test also implicitly tests concurrency on oauth2resource
@Test
public void testUseRefreshTokenOnTokenExpiration() throws Exception {
HttpRouter mockAuthServer = new HttpRouter();
mockAuthServer.getRuleManager().addProxyAndOpenPortIfNew(getMockAuthServiceProxy());
mockAuthServer.init();
HttpRouter oauth2Resource = new HttpRouter();
oauth2Resource.getRuleManager().addProxyAndOpenPortIfNew(getConfiguredOAuth2Resource());
oauth2Resource.init();
HttpClient httpClient = new HttpClient();
Exchange excCallResource = new Request.Builder().get(getClientAddress()).buildExchange();
excCallResource = httpClient.call(excCallResource);
String cookie = excCallResource.getResponse().getHeader().getFirstValue("Set-Cookie");
Exchange excFollowRedirectToAuth = new Request.Builder().header("Cookie", cookie).get(excCallResource.getResponse().getHeader().getFirstValue("Location")).buildExchange();
excFollowRedirectToAuth = httpClient.call(excFollowRedirectToAuth);
Exchange excFollowRedirectToClient = new Request.Builder().header("Cookie", cookie).get(excFollowRedirectToAuth.getResponse().getHeader().getFirstValue("Location")).buildExchange();
excFollowRedirectToClient = httpClient.call(excFollowRedirectToClient);
Set<String> accessTokens = new HashSet<>();
int limit = 1000;
List<Thread> threadList = new ArrayList<>();
CountDownLatch cdl = new CountDownLatch(limit);
for (int i = 0; i < limit; i++) {
threadList.add(new Thread(() -> {
try {
cdl.countDown();
cdl.await();
Exchange excCallResource2 = new Request.Builder().get(getClientAddress()).header("Cookie", cookie).buildExchange();
excCallResource2 = httpClient.call(excCallResource2);
synchronized (accessTokens) {
accessTokens.add(excCallResource2.getResponse().getBodyAsStringDecoded());
}
} catch (Exception e) {
e.printStackTrace();
}
}));
}
threadList.forEach(thread -> thread.start());
threadList.forEach(thread -> {
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
assertTrue(accessTokens.size() == limit);
}
use of com.predic8.membrane.core.transport.http.HttpClient in project service-proxy by membrane.
the class HttpKeepAliveTest method createHttpClient.
private HttpClient createHttpClient(int defaultKeepAliveTimeout) {
HttpClientConfiguration configuration = new HttpClientConfiguration();
ConnectionConfiguration connection = new ConnectionConfiguration();
connection.setKeepAliveTimeout(defaultKeepAliveTimeout);
configuration.setConnection(connection);
HttpClient client = new HttpClient(configuration);
return client;
}
Aggregations