Hi there,
I am using HTTP vertx module, and I have encountered some issues. I wante to double check if the use of the API I am doing is wrong.
My use case requires, to proxy the request to multiple origins based on processing some headers and querying a DB in order to determine the origin. Looks to me that makes sense to delay ProxyRequest creation until I can know the origin (in case it fails the DB access)
If I delay the creation ProxyRequest, basically the proxy functionally does NOT work.
I include a reproducer. Port 7070 used for origin, port 8080 handler shows the issue, port 9090 works because ProxyRequest is NOT delayed.
Thanks in advance,
Evaristo
Example.java
package com.cheva.proxy;
import io.vertx.core.Handler;
import io.vertx.core.Vertx;
import io.vertx.core.http.HttpClient;
import io.vertx.core.http.HttpServerRequest;
import io.vertx.httpproxy.ProxyRequest;
public class Example{
public static void main(String[] args) throws Exception {
final Vertx vertx = Vertx.vertx();
vertx
.createHttpServer()
.requestHandler(
req -> {
req.response()
.putHeader("content-type", "text/html")
.end("<html><body><h1>I'm the target resource!</h1></body></html>");
})
.listen(7070);
final HttpClient proxyClient = vertx.createHttpClient();
vertx.createHttpServer().requestHandler(hanldeRequestNoOk(vertx, proxyClient)).listen(8080);
vertx.createHttpServer().requestHandler(hanldeRequestOk(vertx, proxyClient)).listen(9090);
}
private static Handler<HttpServerRequest> hanldeRequestOk(
final Vertx vertx, final HttpClient proxyClient) {
return request -> {
ProxyRequest proxyRequest = ProxyRequest.reverseProxy(request);
vertx
.<Integer>executeBlocking(() -> getPort(), false)
.onSuccess(
port -> {
System.out.println("XXX1 " + port);
// ProxyRequest proxyRequest = ProxyRequest.reverseProxy(request);
System.out.println("XXX2 " + proxyRequest);
proxyClient
.request(proxyRequest.getMethod(), port, "localhost", proxyRequest.getURI())
.compose(
proxyHttpRequest -> {
System.out.println("XXX3");
return proxyRequest.send(proxyHttpRequest);
})
.onSuccess(
proxyResponse -> {
System.out.println("XXX4");
// Send the proxy response
proxyResponse.send().onFailure(err -> err.printStackTrace());
})
.onFailure(
err -> {
err.printStackTrace();
// Release the request
proxyRequest.release();
// Send error
request.response().setStatusCode(500).send();
});
})
.onFailure(err -> err.printStackTrace());
};
}
private static Handler<HttpServerRequest> hanldeRequestNoOk(
final Vertx vertx, final HttpClient proxyClient) {
return request -> {
vertx
.<Integer>executeBlocking(() -> getPort(), false)
.onSuccess(
port -> {
System.out.println("XXX1 " + port);
ProxyRequest proxyRequest = ProxyRequest.reverseProxy(request);
System.out.println("XXX2 " + proxyRequest);
proxyClient
.request(proxyRequest.getMethod(), port, "localhost", proxyRequest.getURI())
.compose(
proxyHttpRequest -> {
System.out.println("XXX3");
return proxyRequest.send(proxyHttpRequest);
})
.onSuccess(
proxyResponse -> {
System.out.println("XXX4");
// Send the proxy response
proxyResponse.send().onFailure(err -> err.printStackTrace());
})
.onFailure(
err -> {
err.printStackTrace();
// Release the request
proxyRequest.release();
// Send error
request.response().setStatusCode(500).send();
});
})
.onFailure(err -> err.printStackTrace());
};
}
private static Integer getPort() throws InterruptedException {
Thread.sleep(10L);
return 7070;
}
}