Modify request body now uses recalculated content-length header.
This commit is contained in:
@@ -63,7 +63,9 @@ public class ModifyRequestBodyGatewayFilterFactory
|
||||
.flatMap(o -> config.rewriteFunction.apply(exchange, o));
|
||||
|
||||
BodyInserter bodyInserter = BodyInserters.fromPublisher(modifiedBody, config.getOutClass());
|
||||
CachedBodyOutputMessage outputMessage = new CachedBodyOutputMessage(exchange, exchange.getRequest().getHeaders());
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
headers.putAll(exchange.getRequest().getHeaders());
|
||||
CachedBodyOutputMessage outputMessage = new CachedBodyOutputMessage(exchange, headers);
|
||||
return bodyInserter.insert(outputMessage, new BodyInserterContext())
|
||||
// .log("modify_request", Level.INFO)
|
||||
.then(Mono.defer(() -> {
|
||||
@@ -71,10 +73,15 @@ public class ModifyRequestBodyGatewayFilterFactory
|
||||
exchange.getRequest()) {
|
||||
@Override
|
||||
public HttpHeaders getHeaders() {
|
||||
long contentLength = headers.getContentLength();
|
||||
HttpHeaders httpHeaders = new HttpHeaders();
|
||||
httpHeaders.putAll(super.getHeaders());
|
||||
// TODO: this causes a 'HTTP/1.1 411 Length Required' on httpbin.org
|
||||
httpHeaders.set(HttpHeaders.TRANSFER_ENCODING, "chunked");
|
||||
if (contentLength >= 0) {
|
||||
httpHeaders.setContentLength(contentLength);
|
||||
} else {
|
||||
// TODO: this causes a 'HTTP/1.1 411 Length Required' on httpbin.org
|
||||
httpHeaders.set(HttpHeaders.TRANSFER_ENCODING, "chunked");
|
||||
}
|
||||
return httpHeaders;
|
||||
}
|
||||
|
||||
|
||||
@@ -72,6 +72,7 @@ public class GatewaySampleApplication {
|
||||
.filters(f -> f.prefixPath("/httpbin")
|
||||
//TODO: add as configuration to modifyRequestBody
|
||||
.setRequestHeader("Content-Type", MediaType.APPLICATION_JSON_VALUE)
|
||||
.removeRequestHeader("Content-Length")
|
||||
.addResponseHeader("X-TestHeader", "rewrite_request")
|
||||
.modifyRequestBody(String.class, Hello.class,
|
||||
(exchange, s) -> {
|
||||
@@ -82,9 +83,10 @@ public class GatewaySampleApplication {
|
||||
.route("rewrite_request_upper", r -> r.host("*.rewriterequestupper.org")
|
||||
.filters(f -> f.prefixPath("/httpbin")
|
||||
.addResponseHeader("X-TestHeader", "rewrite_request_upper")
|
||||
.removeRequestHeader("Content-Length")
|
||||
.modifyRequestBody(String.class, String.class,
|
||||
(exchange, s) -> {
|
||||
return Mono.just(s.toUpperCase());
|
||||
return Mono.just(s.toUpperCase()+s.toUpperCase());
|
||||
})
|
||||
).uri(uri)
|
||||
)
|
||||
|
||||
@@ -28,7 +28,6 @@ import com.netflix.loadbalancer.ServerList;
|
||||
import org.junit.AfterClass;
|
||||
import org.junit.Before;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
@@ -119,12 +118,11 @@ public class GatewaySampleApplicationTests {
|
||||
.expectHeader().valueEquals("X-TestHeader", "rewrite_request_upper")
|
||||
.expectBody(Map.class)
|
||||
.consumeWith(result ->
|
||||
assertThat(result.getResponseBody()).containsEntry("data", "HELLO"));
|
||||
assertThat(result.getResponseBody()).containsEntry("data", "HELLOHELLO"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("unchecked")
|
||||
@Ignore //FIXME 2.1.0
|
||||
public void rewriteRequestBodyObjectWorks() {
|
||||
webClient.post()
|
||||
.uri("/post")
|
||||
|
||||
Reference in New Issue
Block a user