use of io.undertow.client.UndertowClient in project camel by apache.
the class UndertowProducer method process.
@Override
public boolean process(Exchange exchange, AsyncCallback callback) {
ClientConnection connection = null;
try {
final UndertowClient client = UndertowClient.getInstance();
IoFuture<ClientConnection> connect = client.connect(endpoint.getHttpURI(), worker, pool, options);
// creating the url to use takes 2-steps
final String exchangeUri = UndertowHelper.createURL(exchange, getEndpoint());
final URI uri = UndertowHelper.createURI(exchange, exchangeUri, getEndpoint());
final String pathAndQuery = URISupport.pathAndQueryOf(uri);
// what http method to use
HttpString method = UndertowHelper.createMethod(exchange, endpoint, exchange.getIn().getBody() != null);
ClientRequest request = new ClientRequest();
request.setProtocol(Protocols.HTTP_1_1);
request.setPath(pathAndQuery);
request.setMethod(method);
final HeaderMap requestHeaders = request.getRequestHeaders();
// Set the Host header
Message message = exchange.getIn();
final String host = message.getHeader("Host", String.class);
requestHeaders.put(Headers.HOST, Optional.ofNullable(host).orElseGet(() -> uri.getAuthority()));
Object body = getRequestBody(request, exchange);
TypeConverter tc = endpoint.getCamelContext().getTypeConverter();
ByteBuffer bodyAsByte = tc.tryConvertTo(ByteBuffer.class, body);
if (body != null) {
requestHeaders.put(Headers.CONTENT_LENGTH, bodyAsByte.array().length);
}
if (getEndpoint().getCookieHandler() != null) {
Map<String, List<String>> cookieHeaders = getEndpoint().getCookieHandler().loadCookies(exchange, uri);
for (Map.Entry<String, List<String>> entry : cookieHeaders.entrySet()) {
requestHeaders.putAll(new HttpString(entry.getKey()), entry.getValue());
}
}
if (LOG.isDebugEnabled()) {
LOG.debug("Executing http {} method: {}", method, pathAndQuery);
}
connection = connect.get();
connection.sendRequest(request, new UndertowProducerCallback(connection, bodyAsByte, exchange, callback));
} catch (Exception e) {
IOHelper.close(connection);
exchange.setException(e);
callback.done(true);
return true;
}
// use async routing engine
return false;
}
use of io.undertow.client.UndertowClient in project undertow by undertow-io.
the class Http2ClientTestCase method testHeadRequest.
@Test
public void testHeadRequest() throws Exception {
//
final UndertowClient client = createClient();
final List<ClientResponse> responses = new CopyOnWriteArrayList<>();
final CountDownLatch latch = new CountDownLatch(10);
final ClientConnection connection = client.connect(ADDRESS, worker, new UndertowXnioSsl(worker.getXnio(), OptionMap.EMPTY, DefaultServer.getClientSSLContext()), DefaultServer.getBufferPool(), OptionMap.create(UndertowOptions.ENABLE_HTTP2, true)).get();
try {
connection.getIoThread().execute(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
final ClientRequest request = new ClientRequest().setMethod(Methods.HEAD).setPath(MESSAGE);
request.getRequestHeaders().put(Headers.HOST, DefaultServer.getHostAddress());
connection.sendRequest(request, createClientCallback(responses, latch));
}
}
});
latch.await(10, TimeUnit.SECONDS);
Assert.assertEquals(10, responses.size());
for (final ClientResponse response : responses) {
Assert.assertEquals("", response.getAttachment(RESPONSE_BODY));
}
} finally {
IoUtils.safeClose(connection);
}
}
use of io.undertow.client.UndertowClient in project undertow by undertow-io.
the class Http2ClientTestCase method testSimpleBasic.
@Test
public void testSimpleBasic() throws Exception {
//
final UndertowClient client = createClient();
final List<ClientResponse> responses = new CopyOnWriteArrayList<>();
final CountDownLatch latch = new CountDownLatch(10);
final ClientConnection connection = client.connect(ADDRESS, worker, new UndertowXnioSsl(worker.getXnio(), OptionMap.EMPTY, DefaultServer.getClientSSLContext()), DefaultServer.getBufferPool(), OptionMap.create(UndertowOptions.ENABLE_HTTP2, true)).get();
try {
connection.getIoThread().execute(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
final ClientRequest request = new ClientRequest().setMethod(Methods.GET).setPath(MESSAGE);
request.getRequestHeaders().put(Headers.HOST, DefaultServer.getHostAddress());
connection.sendRequest(request, createClientCallback(responses, latch));
}
}
});
latch.await(10, TimeUnit.SECONDS);
Assert.assertEquals(10, responses.size());
for (final ClientResponse response : responses) {
Assert.assertEquals(message, response.getAttachment(RESPONSE_BODY));
}
} finally {
IoUtils.safeClose(connection);
}
}
use of io.undertow.client.UndertowClient in project undertow by undertow-io.
the class AjpClientTestCase method testSendPing.
@Test
public void testSendPing() throws Exception {
//
final UndertowClient client = createClient();
final List<ClientResponse> responses = new CopyOnWriteArrayList<>();
final FutureResult<Boolean> result = new FutureResult<>();
final CountDownLatch latch = new CountDownLatch(3);
final ClientConnection connection = client.connect(ADDRESS, worker, DefaultServer.getBufferPool(), OptionMap.EMPTY).get();
assertTrue(connection.isPingSupported());
try {
connection.getIoThread().execute(() -> {
final ClientRequest request = new ClientRequest().setMethod(Methods.GET).setPath(MESSAGE);
request.getRequestHeaders().put(Headers.HOST, DefaultServer.getHostAddress());
connection.sendRequest(request, createClientCallback(responses, latch));
connection.sendPing(new ClientConnection.PingListener() {
@Override
public void acknowledged() {
result.setResult(true);
latch.countDown();
}
@Override
public void failed(IOException e) {
result.setException(e);
latch.countDown();
}
}, 5, TimeUnit.SECONDS);
connection.sendRequest(request, createClientCallback(responses, latch));
});
assertTrue(latch.await(10, TimeUnit.SECONDS));
Assert.assertEquals(2, responses.size());
assertTrue(result.getIoFuture().get());
for (final ClientResponse response : responses) {
Assert.assertEquals(message, response.getAttachment(RESPONSE_BODY));
}
// now try a failed ping
try {
undertow.stop();
final FutureResult<Boolean> failResult = new FutureResult<>();
connection.getIoThread().execute(() -> connection.sendPing(new ClientConnection.PingListener() {
@Override
public void acknowledged() {
failResult.setResult(true);
}
@Override
public void failed(IOException e) {
failResult.setException(e);
}
}, 4, TimeUnit.SECONDS));
try {
failResult.getIoFuture().get();
Assert.fail("ping should have failed");
} catch (IOException e) {
// ignored
}
} finally {
// add an extra sleep time to make sure we are not getting a BindException
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// ignore
}
undertow.start();
}
} finally {
IoUtils.safeClose(connection);
}
}
use of io.undertow.client.UndertowClient in project undertow by undertow-io.
the class AjpClientTestCase method testConnectionClose.
@Test
public void testConnectionClose() throws Exception {
//
final UndertowClient client = createClient();
final CountDownLatch latch = new CountDownLatch(1);
final ClientConnection connection = client.connect(ADDRESS, worker, DefaultServer.getBufferPool(), OptionMap.EMPTY).get();
try {
ClientRequest request = new ClientRequest().setPath(MESSAGE).setMethod(Methods.GET);
request.getRequestHeaders().put(Headers.HOST, DefaultServer.getHostAddress());
final List<ClientResponse> responses = new CopyOnWriteArrayList<>();
request.getRequestHeaders().add(Headers.CONNECTION, Headers.CLOSE.toString());
connection.sendRequest(request, createClientCallback(responses, latch));
latch.await();
final ClientResponse response = responses.iterator().next();
Assert.assertEquals(message, response.getAttachment(RESPONSE_BODY));
Assert.assertFalse(connection.isOpen());
} finally {
IoUtils.safeClose(connection);
}
}
Aggregations