Skip to content

org.springframework.web.client.HttpMessageConverterExtractor#extractData fails to detect empty body when content-length header is missing #22265

@bruce-stewart

Description

@bruce-stewart

spring-web 5.1.3.RELEASE:

The org.springframework.web.client.HttpMessageConverterExtractor#extractData results in a NullPointerException if:

  1. The HttpStatus of the org.springframework.http.client.ClientHttpResponse is 401
  2. The org.springframework.http.client.ClientHttpResponse#getBody is null.
  3. The response does not contain a content-length header.

The following test can be added to org.springframework.web.client.HttpMessageConverterExtractorTest to verify this behaviour:

   @Test
    public void missingContentLengthHeader() throws IOException {
        HttpMessageConverter<?> converter = mock(HttpMessageConverter.class);
        HttpHeaders responseHeaders = new HttpHeaders();
        extractor = new HttpMessageConverterExtractor<>(String.class, createConverterList(converter));
        given(response.getRawStatusCode()).willReturn(HttpStatus.valueOf(401).value());
        given(response.getHeaders()).willReturn(responseHeaders);

        Object result = extractor.extractData(response);
        assertNull(result);
    }

The org.springframework.web.client.MessageBodyClientHttpResponseWrapper#hasMessageBody incorrectly returns true which causes org.springframework.web.client.MessageBodyClientHttpResponseWrapper#hasEmptyMessageBody to throw the NPE.

public T extractData(ClientHttpResponse response) throws IOException {
...
		if (!responseWrapper.hasMessageBody() || responseWrapper.hasEmptyMessageBody()) {
...

This can be fixed in org.springframework.web.client.MessageBodyClientHttpResponseWrapper#hasMessageBody by changing this:

if (getHeaders().getContentLength() == 0) {
   return false;
} 

to this:

if (getHeaders().getContentLength() <= 0) {
   return false;
} 

When the headers do not contain a content-length header, getHeaders().getContentLength() returns -1.

Metadata

Metadata

Assignees

Labels

in: webIssues in web modules (web, webmvc, webflux, websocket)type: enhancementA general enhancement

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions