Handle X-Forwarded-Prefix parsed by Reactor Netty
See gh-33638
This commit is contained in:
committed by
rstoyanchev
parent
f9f025df43
commit
a78385f8e5
@@ -65,7 +65,8 @@ class ReactorServerHttpRequest extends AbstractServerHttpRequest {
|
||||
public ReactorServerHttpRequest(HttpServerRequest request, NettyDataBufferFactory bufferFactory)
|
||||
throws URISyntaxException {
|
||||
|
||||
super(HttpMethod.valueOf(request.method().name()), ReactorUriHelper.createUri(request), "",
|
||||
super(HttpMethod.valueOf(request.method().name()),
|
||||
ReactorUriHelper.createUri(request), request.forwardedPrefix(),
|
||||
new Netty4HeadersAdapter(request.requestHeaders()));
|
||||
Assert.notNull(bufferFactory, "DataBufferFactory must not be null");
|
||||
this.request = request;
|
||||
|
||||
@@ -48,8 +48,12 @@ abstract class ReactorUriHelper {
|
||||
builder.append(port);
|
||||
}
|
||||
|
||||
appendRequestUri(request, builder);
|
||||
String prefix = request.forwardedPrefix();
|
||||
if (prefix != null && !prefix.isEmpty()) {
|
||||
builder.append(prefix);
|
||||
}
|
||||
|
||||
appendRequestUri(request, builder);
|
||||
return new URI(builder.toString());
|
||||
}
|
||||
|
||||
|
||||
@@ -20,6 +20,8 @@ import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.CsvSource;
|
||||
import reactor.netty.http.server.HttpServerRequest;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
@@ -49,4 +51,29 @@ class ReactorUriHelperTests {
|
||||
|
||||
}
|
||||
|
||||
@ParameterizedTest(name = "{displayName}({arguments})")
|
||||
@CsvSource(delimiter='|', value = {
|
||||
"/prefix | /prefix/",
|
||||
"/prefix1/prefix2 | /prefix1/prefix2/",
|
||||
" | /",
|
||||
"'' | /",
|
||||
})
|
||||
void forwardedPrefix(String prefixHeader, String expectedPath) throws URISyntaxException {
|
||||
HttpServerRequest nettyRequest = mock();
|
||||
|
||||
given(nettyRequest.scheme()).willReturn("https");
|
||||
given(nettyRequest.hostName()).willReturn("localhost");
|
||||
given(nettyRequest.hostPort()).willReturn(443);
|
||||
given(nettyRequest.uri()).willReturn("/");
|
||||
given(nettyRequest.forwardedPrefix()).willReturn(prefixHeader);
|
||||
|
||||
URI uri = ReactorUriHelper.createUri(nettyRequest);
|
||||
assertThat(uri).hasScheme("https")
|
||||
.hasHost("localhost")
|
||||
.hasPort(-1)
|
||||
.hasPath(expectedPath)
|
||||
.hasToString("https://localhost" + expectedPath);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user