Skip to content

Commit

Permalink
Update Content-Length if body changed by client interceptor
Browse files Browse the repository at this point in the history
Prior to this commit, the HTTP interceptor model used for `RestTemplate`
and `RestClient` would not update the "Content-Length" request header,
even when the request body had been updated by a
`ClientHttpRequestInterceptor`.

Even though this is the `ClientHttpRequestInterceptor`'s responsibility
(along with the content type and encoding changes if needed), this
would result in invalid requests. This invalid situation can be detected
by `InterceptingClientHttpRequest`.

This commit ensures that such situations are detected and fixed
automatically by setting the Content-Length header to the actual body
size, right before executing the actual request, after all interceptors
are done.

Closes gh-33459
  • Loading branch information
imzhoukunqiang authored and bclozel committed Sep 2, 2024
1 parent be5d5fa commit aca2649
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,10 @@ public ClientHttpResponse execute(HttpRequest request, byte[] body) throws IOExc
request.getHeaders().forEach((key, value) -> delegate.getHeaders().addAll(key, value));
request.getAttributes().forEach((key, value) -> delegate.getAttributes().put(key, value));
if (body.length > 0) {
long contentLength = delegate.getHeaders().getContentLength();
if (contentLength > -1 && contentLength != body.length) {
delegate.getHeaders().setContentLength(body.length);
}
if (delegate instanceof StreamingHttpOutputMessage streamingOutputMessage) {
streamingOutputMessage.setBody(new StreamingHttpOutputMessage.Body() {
@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,7 @@ void changeBody() throws Exception {
ClientHttpRequest request = requestFactory.createRequest(URI.create("https://example.com"), HttpMethod.GET);
request.execute();
assertThat(Arrays.equals(changedBody, requestMock.getBodyAsBytes())).isTrue();
assertThat(requestMock.getHeaders().getContentLength()).isEqualTo(changedBody.length);
}


Expand Down

0 comments on commit aca2649

Please sign in to comment.