Skip to content

Commit

Permalink
fix: Use writeble headers on first. Solve the conflict with RequestAt…
Browse files Browse the repository at this point in the history
…tributesProvider (#3966)
  • Loading branch information
pj892031 authored Jan 24, 2025
1 parent c6c7c0a commit 4751f53
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.server.reactive.AbstractServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
Expand All @@ -27,8 +28,18 @@
@Component
public class RequestAttributesProvider implements WebFilter, GlobalFilter, Ordered {

private <R> R getRequest(ServerWebExchange exchange) {
Object request = exchange.getRequest();
while (request instanceof ServerHttpRequestDecorator) {
Object delegatedRequest = ((ServerHttpRequestDecorator) request).getDelegate();
if (request == delegatedRequest) break;
request = delegatedRequest;
}
return (R) request;
}

private void copyAttributes(ServerWebExchange exchange) {
AbstractServerHttpRequest request = (AbstractServerHttpRequest) exchange.getRequest();
AbstractServerHttpRequest request = getRequest(exchange);
RequestFacade requestFacade;
try {
requestFacade = request.getNativeRequest();
Expand Down Expand Up @@ -56,7 +67,7 @@ public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {

@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
return Ordered.HIGHEST_PRECEDENCE + 1;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,8 @@ void givenRequestWithAttributes_whenFilter_thenCopyJustMissing(String filterName
}

@Test
void givenRequestAttributesProvider_whenOrder_thenIsTheFirstOne() {
assertEquals(Integer.MIN_VALUE, new RequestAttributesProvider().getOrder());
void givenRequestAttributesProvider_whenOrder_thenIsTheFirstOneAfterWritableHeaders() {
assertEquals(Integer.MIN_VALUE + 1, new RequestAttributesProvider().getOrder());
}

@ParameterizedTest(name = "givenMockRequest_whenFilter_thenDoNoCrash with {0}")
Expand All @@ -75,4 +75,4 @@ void givenMockRequest_whenFilter_thenDoNoCrash(String filterName, BiConsumer<Req
assertDoesNotThrow(() -> filter.accept(requestAttributesProvider, exchange));
}

}
}

0 comments on commit 4751f53

Please sign in to comment.