|
23 | 23 |
|
24 | 24 | import org.assertj.core.api.Assertions;
|
25 | 25 | import org.junit.jupiter.api.Test;
|
| 26 | +import org.mockito.Mockito; |
| 27 | +import reactor.core.publisher.Mono; |
26 | 28 |
|
27 | 29 | import org.springframework.core.io.buffer.DataBuffer;
|
28 | 30 | import org.springframework.core.io.buffer.DefaultDataBuffer;
|
| 31 | +import org.springframework.http.HttpHeaders; |
29 | 32 | import org.springframework.http.HttpMethod;
|
30 | 33 | import org.springframework.mock.http.server.reactive.MockServerHttpRequest;
|
31 | 34 | import org.springframework.mock.web.server.MockServerWebExchange;
|
| 35 | +import org.springframework.web.reactive.DispatcherHandler; |
32 | 36 | import org.springframework.web.reactive.function.server.HandlerStrategies;
|
33 | 37 | import org.springframework.web.reactive.function.server.ServerRequest;
|
| 38 | +import org.springframework.web.server.ServerWebExchange; |
34 | 39 |
|
35 | 40 | import static org.assertj.core.api.Assertions.assertThat;
|
| 41 | +import static org.mockito.ArgumentMatchers.any; |
| 42 | +import static org.mockito.ArgumentMatchers.assertArg; |
36 | 43 | import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.CACHED_REQUEST_BODY_ATTR;
|
| 44 | +import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_PREDICATE_PATH_CONTAINER_ATTR; |
37 | 45 | import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.expand;
|
| 46 | +import static org.springframework.http.server.PathContainer.parsePath; |
38 | 47 |
|
39 | 48 | public class ServerWebExchangeUtilsTests {
|
40 | 49 |
|
@@ -94,6 +103,26 @@ public void duplicatedCachingDataBufferHandling() {
|
94 | 103 | Assertions.assertThat(dataBufferBeforeCaching).isEqualTo(dataBufferAfterCached);
|
95 | 104 | }
|
96 | 105 |
|
| 106 | + @Test |
| 107 | + public void forwardedRequestsHaveDisruptiveAttributesAndHeadersRemoved() { |
| 108 | + DispatcherHandler handler = Mockito.mock(DispatcherHandler.class); |
| 109 | + Mockito.when(handler.handle(any(ServerWebExchange.class))).thenReturn(Mono.empty()); |
| 110 | + |
| 111 | + ServerWebExchange originalExchange = mockExchange(Map.of()).mutate() |
| 112 | + .request(request -> request.headers(headers -> headers.setOrigin("https://example.com"))).build(); |
| 113 | + originalExchange.getAttributes().put(GATEWAY_PREDICATE_PATH_CONTAINER_ATTR, parsePath("/example/path")); |
| 114 | + |
| 115 | + ServerWebExchangeUtils.handle(handler, originalExchange).block(); |
| 116 | + |
| 117 | + Mockito.verify(handler).handle(assertArg(exchange -> { |
| 118 | + Assertions.assertThat(exchange.getAttributes()).as("exchange attributes") |
| 119 | + .doesNotContainKey(GATEWAY_PREDICATE_PATH_CONTAINER_ATTR); |
| 120 | + |
| 121 | + Assertions.assertThat(exchange.getRequest().getHeaders()).as("request headers") |
| 122 | + .doesNotContainKey(HttpHeaders.ORIGIN); |
| 123 | + })); |
| 124 | + } |
| 125 | + |
97 | 126 | private MockServerWebExchange mockExchange(Map<String, String> vars) {
|
98 | 127 | return mockExchange(HttpMethod.GET, vars);
|
99 | 128 | }
|
|
0 commit comments