}
public int getRawStatusCode() {
return 0;
}
public MultiValueMap<String, ResponseCookie> getCookies() {
return null;
}
}
public class ModifyResponseGatewayFilter implements GatewayFilter, Ordered {
private final ModifyResponseBodyGatewayFilterFactory.Config config;
public ModifyResponseGatewayFilter(ModifyResponseBodyGatewayFilterFactory.Config config) {
this.config = config;
}
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpResponseDecorator responseDecorator = new ServerHttpResponseDecorator(exchange.getResponse()) {
public Mono writeWith(Publisher<? extends DataBuffer> body) {
Class inClass = ModifyResponseGatewayFilter.this.config.getInClass();
Class outClass = ModifyResponseGatewayFilter.this.config.getOutClass();
MediaType originalResponseContentType = (MediaType)exchange.getAttribute(“original_response_content_type”);
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(originalResponseContentType);
ModifyResponseBodyGatewayFilterFactory.ResponseAdapter responseAdapter = ModifyResponseBodyGatewayFilterFactory.this.new ResponseAdapter(body, httpHeaders);
DefaultClientResponse clientResponse = new DefaultClientResponse(responseAdapter, ExchangeStrategies.withDefaults());
Mono modifiedBody = clientResponse.bodyToMono(inClass).flatMap((originalBody) -> {
return ModifyResponseGatewayFilter.this.config.rewriteFunction.apply(exchange, originalBody);
});
BodyInserter bodyInserter = BodyInserters.fromPublisher(modifiedBody, outClass);
CachedBodyOutputMessage outputMessage = new CachedBodyOutputMessage(exchange, exchange.getResponse().getHeaders());
return bodyInserter.insert(outputMessage, new BodyInserterContext()).then(Mono.defer(() -> {
long contentLength1 = this.getDelegate().getHeaders().getContentLength();
Flux messageBody = outputMessage.getBody();
HttpHeaders headers = this.getDelegate().getHeaders();
if (!headers.containsKey(“Transfer-Encoding”)) {
messageBody = messageBody.doOnNext((data) -> {
headers.setContentLength((long)data.readableByteCount());
});
}
return this.ge