Skip to content

Commit 46a8926

Browse files
committed
add contextual request
1 parent 32381a3 commit 46a8926

File tree

7 files changed

+63
-14
lines changed

7 files changed

+63
-14
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package io.vertx.httpproxy;
2+
3+
import io.vertx.codegen.annotations.VertxGen;
4+
import io.vertx.core.http.*;
5+
import io.vertx.httpproxy.impl.ContextedHttpServerRequestImpl;
6+
7+
@VertxGen
8+
public interface ContextedHttpServerRequest extends HttpServerRequest {
9+
10+
public void set(String name, Object value);
11+
12+
public <T> T get(String name, Class<T> type);
13+
14+
static ContextedHttpServerRequest from(HttpServerRequest httpServerRequest) {
15+
return new ContextedHttpServerRequestImpl(httpServerRequest);
16+
}
17+
}

src/main/java/io/vertx/httpproxy/HttpProxy.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ default HttpProxy originSelector(Function<HttpServerRequest, Future<SocketAddres
9898
*/
9999
@GenIgnore()
100100
@Fluent
101-
HttpProxy originRequestProvider(BiFunction<HttpServerRequest, HttpClient, Future<HttpClientRequest>> provider);
101+
HttpProxy originRequestProvider(BiFunction<ContextedHttpServerRequest, HttpClient, Future<HttpClientRequest>> provider);
102102

103103
/**
104104
* Add an interceptor to the interceptor chain.

src/main/java/io/vertx/httpproxy/ProxyRequest.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,14 @@ public interface ProxyRequest {
3838
* @return a reference to this, so the API can be used fluently
3939
*/
4040
static ProxyRequest reverseProxy(HttpServerRequest proxiedRequest) {
41+
ContextedHttpServerRequest contextedHttpServerRequest;
42+
if (proxiedRequest instanceof ContextedHttpServerRequest) {
43+
contextedHttpServerRequest = (ContextedHttpServerRequest) proxiedRequest;
44+
} else {
45+
contextedHttpServerRequest = ContextedHttpServerRequest.from(proxiedRequest);
46+
}
4147
proxiedRequest.pause();
42-
return new ProxiedRequest(proxiedRequest);
48+
return new ProxiedRequest(contextedHttpServerRequest);
4349
}
4450

4551
/**
@@ -169,7 +175,7 @@ default Future<Void> proxy(HttpClientRequest request) {
169175
/**
170176
* @return the proxied HTTP server request
171177
*/
172-
HttpServerRequest proxiedRequest();
178+
ContextedHttpServerRequest proxiedRequest();
173179

174180
/**
175181
* Create and return the proxy response.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package io.vertx.httpproxy.impl;
2+
3+
import io.vertx.core.http.HttpServerRequest;
4+
import io.vertx.core.internal.http.HttpServerRequestInternal;
5+
import io.vertx.core.internal.http.HttpServerRequestWrapper;
6+
import io.vertx.httpproxy.ContextedHttpServerRequest;
7+
8+
import java.util.HashMap;
9+
import java.util.Map;
10+
11+
public class ContextedHttpServerRequestImpl extends HttpServerRequestWrapper implements ContextedHttpServerRequest {
12+
private final Map<String, Object> attachments = new HashMap<>();
13+
14+
public ContextedHttpServerRequestImpl(HttpServerRequest request) {
15+
super((HttpServerRequestInternal) request);
16+
}
17+
18+
public void set(String name, Object value) {
19+
attachments.put(name, value);
20+
}
21+
22+
public <T> T get(String name, Class<T> type) {
23+
Object o = attachments.get(name);
24+
return type.isInstance(o) ? type.cast(o) : null;
25+
}
26+
}

src/main/java/io/vertx/httpproxy/impl/ProxiedRequest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import io.vertx.core.net.HostAndPort;
2121
import io.vertx.core.streams.Pipe;
2222
import io.vertx.httpproxy.Body;
23+
import io.vertx.httpproxy.ContextedHttpServerRequest;
2324
import io.vertx.httpproxy.ProxyRequest;
2425
import io.vertx.httpproxy.ProxyResponse;
2526

@@ -50,9 +51,9 @@ public class ProxiedRequest implements ProxyRequest {
5051
private HostAndPort authority;
5152
private final MultiMap headers;
5253
HttpClientRequest request;
53-
private final HttpServerRequest proxiedRequest;
54+
private final ContextedHttpServerRequest proxiedRequest;
5455

55-
public ProxiedRequest(HttpServerRequest proxiedRequest) {
56+
public ProxiedRequest(ContextedHttpServerRequest proxiedRequest) {
5657

5758
// Determine content length
5859
long contentLength = -1L;
@@ -132,7 +133,7 @@ public ProxyRequest setMethod(HttpMethod method) {
132133
}
133134

134135
@Override
135-
public HttpServerRequest proxiedRequest() {
136+
public ContextedHttpServerRequest proxiedRequest() {
136137
return proxiedRequest;
137138
}
138139

src/main/java/io/vertx/httpproxy/impl/ReverseProxy.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public class ReverseProxy implements HttpProxy {
2727
private final static Logger log = LoggerFactory.getLogger(ReverseProxy.class);
2828
private final HttpClient client;
2929
private final boolean supportWebSocket;
30-
private BiFunction<HttpServerRequest, HttpClient, Future<HttpClientRequest>> selector = (req, client) -> Future.failedFuture("No origin available");
30+
private BiFunction<ContextedHttpServerRequest, HttpClient, Future<HttpClientRequest>> selector = (req, client) -> Future.failedFuture("No origin available");
3131
private final List<ProxyInterceptor> interceptors = new ArrayList<>();
3232

3333
public ReverseProxy(ProxyOptions options, HttpClient client) {
@@ -41,7 +41,7 @@ public ReverseProxy(ProxyOptions options, HttpClient client) {
4141
}
4242

4343
@Override
44-
public HttpProxy originRequestProvider(BiFunction<HttpServerRequest, HttpClient, Future<HttpClientRequest>> provider) {
44+
public HttpProxy originRequestProvider(BiFunction<ContextedHttpServerRequest, HttpClient, Future<HttpClientRequest>> provider) {
4545
selector = provider;
4646
return this;
4747
}
@@ -85,7 +85,7 @@ public void handle(HttpServerRequest request) {
8585
}
8686

8787
private void handleWebSocketUpgrade(ProxyRequest proxyRequest) {
88-
HttpServerRequest proxiedRequest = proxyRequest.proxiedRequest();
88+
ContextedHttpServerRequest proxiedRequest = proxyRequest.proxiedRequest();
8989
resolveOrigin(proxiedRequest).onComplete(ar -> {
9090
if (ar.succeeded()) {
9191
HttpClientRequest request = ar.result();
@@ -145,15 +145,14 @@ private void end(ProxyRequest proxyRequest, int sc) {
145145
.send();
146146
}
147147

148-
private Future<HttpClientRequest> resolveOrigin(HttpServerRequest proxiedRequest) {
148+
private Future<HttpClientRequest> resolveOrigin(ContextedHttpServerRequest proxiedRequest) {
149149
return selector.apply(proxiedRequest, client);
150150
}
151151

152152
private class Proxy implements ProxyContext {
153153

154154
private final ProxyRequest request;
155155
private ProxyResponse response;
156-
private final Map<String, Object> attachments = new HashMap<>();
157156
private ListIterator<ProxyInterceptor> filters;
158157

159158
private Proxy(ProxyRequest request) {
@@ -162,13 +161,12 @@ private Proxy(ProxyRequest request) {
162161

163162
@Override
164163
public void set(String name, Object value) {
165-
attachments.put(name, value);
164+
request.proxiedRequest().set(name, value);
166165
}
167166

168167
@Override
169168
public <T> T get(String name, Class<T> type) {
170-
Object o = attachments.get(name);
171-
return type.isInstance(o) ? type.cast(o) : null;
169+
return request.proxiedRequest().get(name, type);
172170
}
173171

174172
@Override

src/main/java/module-info.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
requires static io.vertx.codegen.api;
55
requires static io.vertx.codegen.json;
66
requires static vertx.docgen;
7+
requires io.netty.codec;
78
exports io.vertx.httpproxy;
89
exports io.vertx.httpproxy.cache;
910
exports io.vertx.httpproxy.interceptors;

0 commit comments

Comments
 (0)