Explicit content-type for resources
BodyInserters.ofResource now respects the Content-Type, if specified on the client request or server response. Closes gh-24366
This commit is contained in:
parent
5d8c5b0d9b
commit
a234b90abb
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2019 the original author or authors.
|
* Copyright 2002-2020 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|
@ -218,7 +218,8 @@ public abstract class BodyInserters {
|
||||||
return (outputMessage, context) -> {
|
return (outputMessage, context) -> {
|
||||||
ResolvableType elementType = RESOURCE_TYPE;
|
ResolvableType elementType = RESOURCE_TYPE;
|
||||||
HttpMessageWriter<Resource> writer = findWriter(context, elementType, null);
|
HttpMessageWriter<Resource> writer = findWriter(context, elementType, null);
|
||||||
return write(Mono.just(resource), elementType, null, outputMessage, context, writer);
|
MediaType contentType = outputMessage.getHeaders().getContentType();
|
||||||
|
return write(Mono.just(resource), elementType, contentType, outputMessage, context, writer);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2019 the original author or authors.
|
* Copyright 2002-2020 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|
@ -48,6 +48,7 @@ import org.springframework.core.io.buffer.DefaultDataBufferFactory;
|
||||||
import org.springframework.core.testfixture.io.buffer.DataBufferTestUtils;
|
import org.springframework.core.testfixture.io.buffer.DataBufferTestUtils;
|
||||||
import org.springframework.http.HttpMethod;
|
import org.springframework.http.HttpMethod;
|
||||||
import org.springframework.http.HttpRange;
|
import org.springframework.http.HttpRange;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.http.ReactiveHttpOutputMessage;
|
import org.springframework.http.ReactiveHttpOutputMessage;
|
||||||
import org.springframework.http.client.reactive.ClientHttpRequest;
|
import org.springframework.http.client.reactive.ClientHttpRequest;
|
||||||
import org.springframework.http.codec.EncoderHttpMessageWriter;
|
import org.springframework.http.codec.EncoderHttpMessageWriter;
|
||||||
|
|
@ -224,14 +225,13 @@ public class BodyInsertersTests {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void ofResource() throws IOException {
|
public void ofResource() throws IOException {
|
||||||
Resource body = new ClassPathResource("response.txt", getClass());
|
Resource resource = new ClassPathResource("response.txt", getClass());
|
||||||
BodyInserter<Resource, ReactiveHttpOutputMessage> inserter = BodyInserters.fromResource(body);
|
|
||||||
|
|
||||||
MockServerHttpResponse response = new MockServerHttpResponse();
|
MockServerHttpResponse response = new MockServerHttpResponse();
|
||||||
Mono<Void> result = inserter.insert(response, this.context);
|
Mono<Void> result = BodyInserters.fromResource(resource).insert(response, this.context);
|
||||||
StepVerifier.create(result).expectComplete().verify();
|
StepVerifier.create(result).expectComplete().verify();
|
||||||
|
|
||||||
byte[] expectedBytes = Files.readAllBytes(body.getFile().toPath());
|
byte[] expectedBytes = Files.readAllBytes(resource.getFile().toPath());
|
||||||
|
|
||||||
StepVerifier.create(response.getBody())
|
StepVerifier.create(response.getBody())
|
||||||
.consumeNextWith(dataBuffer -> {
|
.consumeNextWith(dataBuffer -> {
|
||||||
|
|
@ -244,6 +244,29 @@ public class BodyInsertersTests {
|
||||||
.verify();
|
.verify();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test // gh-24366
|
||||||
|
public void ofResourceWithExplicitMediaType() throws IOException {
|
||||||
|
Resource resource = new ClassPathResource("response.txt", getClass());
|
||||||
|
|
||||||
|
MockClientHttpRequest request = new MockClientHttpRequest(HttpMethod.POST, "/");
|
||||||
|
request.getHeaders().setContentType(MediaType.TEXT_MARKDOWN);
|
||||||
|
Mono<Void> result = BodyInserters.fromResource(resource).insert(request, this.context);
|
||||||
|
StepVerifier.create(result).expectComplete().verify();
|
||||||
|
|
||||||
|
byte[] expectedBytes = Files.readAllBytes(resource.getFile().toPath());
|
||||||
|
|
||||||
|
assertThat(request.getHeaders().getContentType()).isEqualTo(MediaType.TEXT_MARKDOWN);
|
||||||
|
StepVerifier.create(request.getBody())
|
||||||
|
.consumeNextWith(dataBuffer -> {
|
||||||
|
byte[] resultBytes = new byte[dataBuffer.readableByteCount()];
|
||||||
|
dataBuffer.read(resultBytes);
|
||||||
|
DataBufferUtils.release(dataBuffer);
|
||||||
|
assertThat(resultBytes).isEqualTo(expectedBytes);
|
||||||
|
})
|
||||||
|
.expectComplete()
|
||||||
|
.verify();
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void ofResourceRange() throws IOException {
|
public void ofResourceRange() throws IOException {
|
||||||
final int rangeStart = 10;
|
final int rangeStart = 10;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue