|
11 | 11 | package io.vertx.httpproxy.impl; |
12 | 12 |
|
13 | 13 | import io.vertx.core.Future; |
14 | | -import io.vertx.core.Promise; |
15 | 14 | import io.vertx.core.http.*; |
| 15 | +import io.vertx.core.internal.logging.Logger; |
| 16 | +import io.vertx.core.internal.logging.LoggerFactory; |
16 | 17 | import io.vertx.core.net.NetSocket; |
17 | 18 | import io.vertx.httpproxy.*; |
18 | 19 | import io.vertx.httpproxy.cache.CacheOptions; |
|
23 | 24 |
|
24 | 25 | public class ReverseProxy implements HttpProxy { |
25 | 26 |
|
| 27 | + private final static Logger log = LoggerFactory.getLogger(ReverseProxy.class); |
26 | 28 | private final HttpClient client; |
27 | 29 | private final boolean supportWebSocket; |
28 | 30 | private BiFunction<HttpServerRequest, HttpClient, Future<HttpClientRequest>> selector = (req, client) -> Future.failedFuture("No origin available"); |
@@ -70,7 +72,16 @@ public void handle(HttpServerRequest request) { |
70 | 72 |
|
71 | 73 | Proxy proxy = new Proxy(proxyRequest); |
72 | 74 | proxy.filters = interceptors.listIterator(); |
73 | | - proxy.sendRequest().compose(proxy::sendProxyResponse); |
| 75 | + proxy.sendRequest() |
| 76 | + .recover(throwable -> { |
| 77 | + log.trace("Error in sending the request", throwable); |
| 78 | + return Future.succeededFuture(proxyRequest.release().response().setStatusCode(502)); |
| 79 | + }) |
| 80 | + .compose(proxy::sendProxyResponse) |
| 81 | + .recover(throwable -> { |
| 82 | + log.trace("Error in sending the response", throwable); |
| 83 | + return proxy.response().release().setStatusCode(502).send(); |
| 84 | + }); |
74 | 85 | } |
75 | 86 |
|
76 | 87 | private void handleWebSocketUpgrade(ProxyRequest proxyRequest) { |
@@ -191,27 +202,7 @@ public Future<Void> sendResponse() { |
191 | 202 | } |
192 | 203 |
|
193 | 204 | private Future<ProxyResponse> sendProxyRequest(ProxyRequest proxyRequest) { |
194 | | - Future<HttpClientRequest> f = resolveOrigin(proxyRequest.proxiedRequest()); |
195 | | - f.onFailure(err -> { |
196 | | - // Should this be done here ? I don't think so |
197 | | - HttpServerRequest proxiedRequest = proxyRequest.proxiedRequest(); |
198 | | - proxiedRequest.resume(); |
199 | | - Promise<Void> promise = Promise.promise(); |
200 | | - proxiedRequest.exceptionHandler(promise::tryFail); |
201 | | - proxiedRequest.endHandler(promise::tryComplete); |
202 | | - promise.future().onComplete(ar2 -> { |
203 | | - end(proxyRequest, 502); |
204 | | - }); |
205 | | - }); |
206 | | - return f.compose(a -> sendProxyRequest(proxyRequest, a)); |
207 | | - } |
208 | | - |
209 | | - private Future<ProxyResponse> sendProxyRequest(ProxyRequest proxyRequest, HttpClientRequest request) { |
210 | | - Future<ProxyResponse> fut = proxyRequest.send(request); |
211 | | - fut.onFailure(err -> { |
212 | | - proxyRequest.proxiedRequest().response().setStatusCode(502).end(); |
213 | | - }); |
214 | | - return fut; |
| 205 | + return resolveOrigin(proxyRequest.proxiedRequest()).compose(proxyRequest::send); |
215 | 206 | } |
216 | 207 |
|
217 | 208 | private Future<Void> sendProxyResponse(ProxyResponse response) { |
|
0 commit comments