Skip to content

Commit 3fa65e9

Browse files
committed
* added support for streaming response modification
Fixes spring-cloudgh-2275
1 parent b65f009 commit 3fa65e9

File tree

1 file changed

+20
-32
lines changed

1 file changed

+20
-32
lines changed

spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyResponseBodyGatewayFilterFactory.java

Lines changed: 20 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import java.util.Set;
2222
import java.util.stream.Collectors;
2323

24-
import org.jetbrains.annotations.NotNull;
2524
import org.reactivestreams.Publisher;
2625
import reactor.core.publisher.Flux;
2726
import reactor.core.publisher.Mono;
@@ -54,19 +53,17 @@
5453
/**
5554
* GatewayFilter that modifies the response body.
5655
*/
57-
public class ModifyResponseBodyGatewayFilterFactory extends
58-
AbstractGatewayFilterFactory<ModifyResponseBodyGatewayFilterFactory.Config> {
56+
public class ModifyResponseBodyGatewayFilterFactory
57+
extends AbstractGatewayFilterFactory<ModifyResponseBodyGatewayFilterFactory.Config> {
5958

6059
private final Map<String, MessageBodyDecoder> messageBodyDecoders;
6160

6261
private final Map<String, MessageBodyEncoder> messageBodyEncoders;
6362

6463
private final List<HttpMessageReader<?>> messageReaders;
6564

66-
public ModifyResponseBodyGatewayFilterFactory(
67-
List<HttpMessageReader<?>> messageReaders,
68-
Set<MessageBodyDecoder> messageBodyDecoders,
69-
Set<MessageBodyEncoder> messageBodyEncoders) {
65+
public ModifyResponseBodyGatewayFilterFactory(List<HttpMessageReader<?>> messageReaders,
66+
Set<MessageBodyDecoder> messageBodyDecoders, Set<MessageBodyEncoder> messageBodyEncoders) {
7067
super(Config.class);
7168
this.messageReaders = messageReaders;
7269
this.messageBodyDecoders = messageBodyDecoders.stream()
@@ -77,8 +74,7 @@ public ModifyResponseBodyGatewayFilterFactory(
7774

7875
@Override
7976
public GatewayFilter apply(Config config) {
80-
ModifyResponseGatewayFilter gatewayFilter = new ModifyResponseGatewayFilter(
81-
config);
77+
ModifyResponseGatewayFilter gatewayFilter = new ModifyResponseGatewayFilter(config);
8278
gatewayFilter.setFactory(this);
8379
return gatewayFilter;
8480
}
@@ -226,8 +222,7 @@ public ModifyResponseGatewayFilter(Config config) {
226222

227223
@Override
228224
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
229-
return chain.filter(exchange.mutate()
230-
.response(new ModifiedServerHttpResponse(exchange, config)).build());
225+
return chain.filter(exchange.mutate().response(new ModifiedServerHttpResponse(exchange, config)).build());
231226
}
232227

233228
@Override
@@ -237,12 +232,11 @@ public int getOrder() {
237232

238233
@Override
239234
public String toString() {
240-
Object obj = (this.gatewayFilterFactory != null) ? this.gatewayFilterFactory
241-
: this;
242-
return filterToStringCreator(obj)
243-
.append("New content type", config.getNewContentType())
244-
.append("In class", config.getInClass())
245-
.append("Out class", config.getOutClass()).toString();
235+
Object obj = (this.gatewayFilterFactory != null) ? this.gatewayFilterFactory : this;
236+
return filterToStringCreator(obj).append("New content type", config.getNewContentType())
237+
.append("In class", config.getInClass())
238+
.append("Out class", config.getOutClass())
239+
.toString();
246240
}
247241

248242
public void setFactory(GatewayFilterFactory<Config> gatewayFilterFactory) {
@@ -348,7 +342,7 @@ public Mono<Void> writeAndFlushWith(
348342
}));
349343
}
350344

351-
private @NotNull HttpHeaders prepareHttpHeaders() {
345+
private HttpHeaders prepareHttpHeaders() {
352346
String originalResponseContentType = exchange
353347
.getAttribute(ORIGINAL_RESPONSE_CONTENT_TYPE_ATTR);
354348
HttpHeaders httpHeaders = new HttpHeaders();
@@ -360,25 +354,20 @@ public Mono<Void> writeAndFlushWith(
360354
return httpHeaders;
361355
}
362356

363-
private ClientResponse prepareClientResponse(Publisher<? extends DataBuffer> body,
364-
HttpHeaders httpHeaders) {
357+
private ClientResponse prepareClientResponse(Publisher<? extends DataBuffer> body, HttpHeaders httpHeaders) {
365358
ClientResponse.Builder builder;
366-
builder = ClientResponse.create(exchange.getResponse().getStatusCode(),
367-
messageReaders);
368-
return builder.headers(headers -> headers.putAll(httpHeaders))
369-
.body(Flux.from(body)).build();
359+
builder = ClientResponse.create(exchange.getResponse().getStatusCode(), messageReaders);
360+
return builder.headers(headers -> headers.putAll(httpHeaders)).body(Flux.from(body)).build();
370361
}
371362

372-
private <T> Mono<T> extractBody(ServerWebExchange exchange,
373-
ClientResponse clientResponse, Class<T> inClass) {
363+
private <T> Mono<T> extractBody(ServerWebExchange exchange, ClientResponse clientResponse, Class<T> inClass) {
374364
// if inClass is byte[] then just return body, otherwise check if
375365
// decoding required
376366
if (byte[].class.isAssignableFrom(inClass)) {
377367
return clientResponse.bodyToMono(inClass);
378368
}
379369

380-
List<String> encodingHeaders = exchange.getResponse().getHeaders()
381-
.getOrEmpty(HttpHeaders.CONTENT_ENCODING);
370+
List<String> encodingHeaders = exchange.getResponse().getHeaders().getOrEmpty(HttpHeaders.CONTENT_ENCODING);
382371
for (String encoding : encodingHeaders) {
383372
MessageBodyDecoder decoder = messageBodyDecoders.get(encoding);
384373
if (decoder != null) {
@@ -394,15 +383,14 @@ private <T> Mono<T> extractBody(ServerWebExchange exchange,
394383
return clientResponse.bodyToMono(inClass);
395384
}
396385

397-
private Mono<DataBuffer> writeBody(ServerHttpResponse httpResponse,
398-
CachedBodyOutputMessage message, Class<?> outClass) {
386+
private Mono<DataBuffer> writeBody(ServerHttpResponse httpResponse, CachedBodyOutputMessage message,
387+
Class<?> outClass) {
399388
Mono<DataBuffer> response = DataBufferUtils.join(message.getBody());
400389
if (byte[].class.isAssignableFrom(outClass)) {
401390
return response;
402391
}
403392

404-
List<String> encodingHeaders = httpResponse.getHeaders()
405-
.getOrEmpty(HttpHeaders.CONTENT_ENCODING);
393+
List<String> encodingHeaders = httpResponse.getHeaders().getOrEmpty(HttpHeaders.CONTENT_ENCODING);
406394
for (String encoding : encodingHeaders) {
407395
MessageBodyEncoder encoder = messageBodyEncoders.get(encoding);
408396
if (encoder != null) {

0 commit comments

Comments
 (0)