Modify request body now uses recalculated content-length header.

This commit is contained in:
Spencer Gibb
2018-08-14 12:05:44 -04:00
parent 03df59da56
commit de86661ca6
3 changed files with 14 additions and 7 deletions

View File

@@ -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;
}

View File

@@ -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)
)

View File

@@ -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")