1313import io .vertx .core .Future ;
1414import io .vertx .core .Vertx ;
1515import io .vertx .core .buffer .Buffer ;
16- import io .vertx .core .http .HttpClient ;
17- import io .vertx .core .http .HttpClientRequest ;
18- import io .vertx .core .http .HttpClientResponse ;
19- import io .vertx .core .http .HttpHeaders ;
20- import io .vertx .core .http .HttpServerRequest ;
21- import io .vertx .core .http .HttpServerResponse ;
16+ import io .vertx .core .http .*;
2217import io .vertx .core .internal .CloseFuture ;
2318import io .vertx .core .internal .VertxInternal ;
2419import io .vertx .core .internal .http .HttpClientInternal ;
2520import io .vertx .core .internal .logging .Logger ;
2621import io .vertx .core .internal .logging .LoggerFactory ;
2722import io .vertx .core .net .NetSocket ;
2823import io .vertx .core .streams .ReadStream ;
29- import io .vertx .httpproxy .HttpProxy ;
30- import io .vertx .httpproxy .ProxyContext ;
31- import io .vertx .httpproxy .ProxyInterceptor ;
32- import io .vertx .httpproxy .ProxyOptions ;
33- import io .vertx .httpproxy .ProxyRequest ;
34- import io .vertx .httpproxy .ProxyResponse ;
24+ import io .vertx .httpproxy .*;
3525import io .vertx .httpproxy .cache .CacheOptions ;
3626import io .vertx .httpproxy .spi .cache .Cache ;
3727
38- import java .util .ArrayList ;
39- import java .util .HashMap ;
40- import java .util .List ;
41- import java .util .ListIterator ;
42- import java .util .Map ;
43- import java .util .Objects ;
44- import java .util .function .BiFunction ;
28+ import java .util .*;
4529
4630import static io .vertx .core .http .HttpHeaders .CONNECTION ;
4731import static io .vertx .core .http .HttpHeaders .UPGRADE ;
@@ -51,7 +35,7 @@ public class ReverseProxy implements HttpProxy {
5135 private final static Logger log = LoggerFactory .getLogger (ReverseProxy .class );
5236 private final HttpClient client ;
5337 private final boolean supportWebSocket ;
54- private BiFunction < HttpServerRequest , HttpClient , Future < HttpClientRequest >> selector = (req , client ) -> Future .failedFuture ("No origin available" );
38+ private OriginRequestProvider originRequestProvider = (pc ) -> Future .failedFuture ("No origin available" );
5539 private final List <ProxyInterceptorEntry > interceptors = new ArrayList <>();
5640
5741 public ReverseProxy (ProxyOptions options , HttpClient client ) {
@@ -75,8 +59,8 @@ public Cache newCache(CacheOptions options, Vertx vertx) {
7559 }
7660
7761 @ Override
78- public HttpProxy originRequestProvider ( BiFunction < HttpServerRequest , HttpClient , Future < HttpClientRequest >> provider ) {
79- selector = provider ;
62+ public HttpProxy origin ( OriginRequestProvider provider ) {
63+ originRequestProvider = Objects . requireNonNull ( provider ) ;
8064 return this ;
8165 }
8266
@@ -121,8 +105,8 @@ private void end(ProxyRequest proxyRequest, int sc) {
121105 .send ();
122106 }
123107
124- private Future <HttpClientRequest > resolveOrigin (HttpServerRequest proxiedRequest ) {
125- return selector . apply ( proxiedRequest , client );
108+ private Future <HttpClientRequest > resolveOrigin (ProxyContext proxyContext ) {
109+ return originRequestProvider . create ( proxyContext );
126110 }
127111
128112 private class Proxy implements ProxyContext {
@@ -155,6 +139,11 @@ public <T> T get(String name, Class<T> type) {
155139 return type .isInstance (o ) ? type .cast (o ) : null ;
156140 }
157141
142+ @ Override
143+ public HttpClient client () {
144+ return client ;
145+ }
146+
158147 @ Override
159148 public ProxyRequest request () {
160149 return request ;
@@ -171,7 +160,7 @@ public Future<ProxyResponse> sendRequest() {
171160 } else {
172161 if (isWebSocket ) {
173162 HttpServerRequest proxiedRequest = request ().proxiedRequest ();
174- return resolveOrigin (proxiedRequest ).compose (request -> {
163+ return resolveOrigin (this ).compose (request -> {
175164 request .setMethod (request ().getMethod ());
176165 request .setURI (request ().getURI ());
177166 // Firefox is known to send an unexpected connection header value
@@ -237,7 +226,7 @@ public Future<Void> sendResponse() {
237226 }
238227
239228 private Future <ProxyResponse > sendProxyRequest (ProxyRequest proxyRequest ) {
240- return resolveOrigin (proxyRequest . proxiedRequest () ).compose (proxyRequest ::send );
229+ return resolveOrigin (this ).compose (proxyRequest ::send );
241230 }
242231
243232 private Future <Void > sendProxyResponse (ProxyResponse response ) {
0 commit comments