Polish
This commit is contained in:
		
							parent
							
								
									e5158d47e0
								
							
						
					
					
						commit
						6cb7d51ee5
					
				| 
						 | 
				
			
			@ -16,6 +16,8 @@
 | 
			
		|||
 | 
			
		||||
package org.springframework.mock.http.server.reactive;
 | 
			
		||||
 | 
			
		||||
import java.nio.charset.Charset;
 | 
			
		||||
import java.nio.charset.StandardCharsets;
 | 
			
		||||
import java.util.function.Supplier;
 | 
			
		||||
 | 
			
		||||
import org.reactivestreams.Publisher;
 | 
			
		||||
| 
						 | 
				
			
			@ -24,11 +26,14 @@ import reactor.core.publisher.Mono;
 | 
			
		|||
 | 
			
		||||
import org.springframework.core.io.buffer.DataBuffer;
 | 
			
		||||
import org.springframework.core.io.buffer.DataBufferFactory;
 | 
			
		||||
import org.springframework.core.io.buffer.DataBufferUtils;
 | 
			
		||||
import org.springframework.core.io.buffer.DefaultDataBufferFactory;
 | 
			
		||||
import org.springframework.http.HttpHeaders;
 | 
			
		||||
import org.springframework.http.HttpStatus;
 | 
			
		||||
import org.springframework.http.MediaType;
 | 
			
		||||
import org.springframework.http.ResponseCookie;
 | 
			
		||||
import org.springframework.http.server.reactive.ServerHttpResponse;
 | 
			
		||||
import org.springframework.util.Assert;
 | 
			
		||||
import org.springframework.util.LinkedMultiValueMap;
 | 
			
		||||
import org.springframework.util.MultiValueMap;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -106,4 +111,42 @@ public class MockServerHttpResponse implements ServerHttpResponse {
 | 
			
		|||
		return this.bufferFactory;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Return the body of the response aggregated and converted to a String
 | 
			
		||||
	 * using the charset of the Content-Type response or otherwise defaulting
 | 
			
		||||
	 * to "UTF-8".
 | 
			
		||||
	 */
 | 
			
		||||
	public Mono<String> getBodyAsString() {
 | 
			
		||||
		Charset charset = getCharset();
 | 
			
		||||
		Charset charsetToUse = (charset != null ? charset : StandardCharsets.UTF_8);
 | 
			
		||||
		return Flux.from(this.body)
 | 
			
		||||
				.reduce(this.bufferFactory.allocateBuffer(), (previous, current) -> {
 | 
			
		||||
					previous.write(current);
 | 
			
		||||
					DataBufferUtils.release(current);
 | 
			
		||||
					return previous;
 | 
			
		||||
				})
 | 
			
		||||
				.map(buffer -> dumpString(buffer, charsetToUse));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private static String dumpString(DataBuffer buffer, Charset charset) {
 | 
			
		||||
		Assert.notNull(charset, "'charset' must not be null");
 | 
			
		||||
		byte[] bytes = dumpBytes(buffer);
 | 
			
		||||
		return new String(bytes, charset);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private static byte[] dumpBytes(DataBuffer buffer) {
 | 
			
		||||
		Assert.notNull(buffer, "'buffer' must not be null");
 | 
			
		||||
		byte[] bytes = new byte[buffer.readableByteCount()];
 | 
			
		||||
		buffer.read(bytes);
 | 
			
		||||
		return bytes;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private Charset getCharset() {
 | 
			
		||||
		MediaType contentType = getHeaders().getContentType();
 | 
			
		||||
		if (contentType != null) {
 | 
			
		||||
			return contentType.getCharset();
 | 
			
		||||
		}
 | 
			
		||||
		return null;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,21 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2002-2016 the original author or authors.
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
 * you may not use this file except in compliance with the License.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *      http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
package org.springframework.http.codec;
 | 
			
		||||
 | 
			
		||||
import static java.nio.charset.StandardCharsets.UTF_8;
 | 
			
		||||
import static org.junit.Assert.*;
 | 
			
		||||
import static org.hamcrest.Matchers.*;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -7,11 +23,13 @@ import java.nio.ByteBuffer;
 | 
			
		|||
import java.nio.charset.StandardCharsets;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
 | 
			
		||||
import org.jetbrains.annotations.NotNull;
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
import reactor.core.publisher.Mono;
 | 
			
		||||
 | 
			
		||||
import org.springframework.core.ResolvableType;
 | 
			
		||||
import org.springframework.core.codec.ByteBufferEncoder;
 | 
			
		||||
import org.springframework.core.codec.Encoder;
 | 
			
		||||
import org.springframework.http.MediaType;
 | 
			
		||||
import org.springframework.mock.http.server.reactive.test.MockServerHttpResponse;
 | 
			
		||||
import org.springframework.tests.TestSubscriber;
 | 
			
		||||
| 
						 | 
				
			
			@ -21,35 +39,42 @@ import org.springframework.util.MimeTypeUtils;
 | 
			
		|||
 * Unit tests for {@link EncoderHttpMessageWriter}.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Marcin Kamionowski
 | 
			
		||||
 * @author Rossen Stoyanchev
 | 
			
		||||
 */
 | 
			
		||||
public class EncoderHttpMessageWriterTest {
 | 
			
		||||
 | 
			
		||||
	private EncoderHttpMessageWriter<ByteBuffer> writer = new EncoderHttpMessageWriter<>(new ByteBufferEncoder());
 | 
			
		||||
 | 
			
		||||
	private MockServerHttpResponse response = new MockServerHttpResponse();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void writableMediaTypes() throws Exception {
 | 
			
		||||
		EncoderHttpMessageWriter<ByteBuffer> writer = createWriter(new ByteBufferEncoder());
 | 
			
		||||
		assertThat(writer.getWritableMediaTypes(), containsInAnyOrder(MimeTypeUtils.ALL));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void supportedMediaTypes() throws Exception {
 | 
			
		||||
		assertTrue(writer.canWrite(ResolvableType.forClass(ByteBuffer.class),
 | 
			
		||||
				MediaType.ALL));
 | 
			
		||||
		assertTrue(writer.canWrite(ResolvableType.forClass(ByteBuffer.class),
 | 
			
		||||
				MediaType.TEXT_PLAIN));
 | 
			
		||||
		EncoderHttpMessageWriter<ByteBuffer> writer = createWriter(new ByteBufferEncoder());
 | 
			
		||||
		assertTrue(writer.canWrite(ResolvableType.forClass(ByteBuffer.class), MediaType.ALL));
 | 
			
		||||
		assertTrue(writer.canWrite(ResolvableType.forClass(ByteBuffer.class), MediaType.TEXT_PLAIN));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void encodeByteBuffer(){
 | 
			
		||||
		String payload = "Buffer payload";
 | 
			
		||||
		Mono<ByteBuffer> source = Mono.just(ByteBuffer.wrap(payload.getBytes(StandardCharsets.UTF_8)));
 | 
			
		||||
		Mono<ByteBuffer> source = Mono.just(ByteBuffer.wrap(payload.getBytes(UTF_8)));
 | 
			
		||||
 | 
			
		||||
		EncoderHttpMessageWriter<ByteBuffer> writer = createWriter(new ByteBufferEncoder());
 | 
			
		||||
		writer.write(source, ResolvableType.forClass(ByteBuffer.class),
 | 
			
		||||
				MediaType.APPLICATION_OCTET_STREAM, response, Collections.emptyMap());
 | 
			
		||||
				MediaType.APPLICATION_OCTET_STREAM, this.response, Collections.emptyMap());
 | 
			
		||||
 | 
			
		||||
		assertThat(this.response.getHeaders().getContentType(), is(MediaType.APPLICATION_OCTET_STREAM));
 | 
			
		||||
		TestSubscriber.subscribe(response.getBodyAsString()).assertComplete().assertValues(payload);
 | 
			
		||||
		TestSubscriber.subscribe(this.response.getBodyAsString()).assertComplete().assertValues(payload);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@NotNull
 | 
			
		||||
	private <T> EncoderHttpMessageWriter<T> createWriter(Encoder<T> encoder) {
 | 
			
		||||
		return new EncoderHttpMessageWriter<>(encoder);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -76,7 +76,7 @@ public class ResourceHttpMessageWriterTests {
 | 
			
		|||
		assertThat(this.response.getHeaders().getContentLength(), is(39L));
 | 
			
		||||
		assertThat(this.response.getHeaders().getFirst(HttpHeaders.ACCEPT_RANGES), is("bytes"));
 | 
			
		||||
 | 
			
		||||
		Mono<String> result = response.getBodyAsString();
 | 
			
		||||
		Mono<String> result = this.response.getBodyAsString();
 | 
			
		||||
		TestSubscriber.subscribe(result).assertComplete().assertValues("Spring Framework test resource content.");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -92,7 +92,7 @@ public class ResourceHttpMessageWriterTests {
 | 
			
		|||
		assertThat(this.response.getHeaders().getFirst(HttpHeaders.ACCEPT_RANGES), is("bytes"));
 | 
			
		||||
		assertThat(this.response.getHeaders().getContentLength(), is(6L));
 | 
			
		||||
 | 
			
		||||
		Mono<String> result = response.getBodyAsString();
 | 
			
		||||
		Mono<String> result = this.response.getBodyAsString();
 | 
			
		||||
		TestSubscriber.subscribe(result).assertComplete().assertValues("Spring");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,6 +16,7 @@
 | 
			
		|||
 | 
			
		||||
package org.springframework.mock.http.server.reactive.test;
 | 
			
		||||
 | 
			
		||||
import java.nio.charset.Charset;
 | 
			
		||||
import java.nio.charset.StandardCharsets;
 | 
			
		||||
import java.util.function.Supplier;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -30,6 +31,7 @@ import org.springframework.core.io.buffer.DefaultDataBufferFactory;
 | 
			
		|||
import org.springframework.core.io.buffer.support.DataBufferTestUtils;
 | 
			
		||||
import org.springframework.http.HttpHeaders;
 | 
			
		||||
import org.springframework.http.HttpStatus;
 | 
			
		||||
import org.springframework.http.MediaType;
 | 
			
		||||
import org.springframework.http.ResponseCookie;
 | 
			
		||||
import org.springframework.http.server.reactive.ServerHttpResponse;
 | 
			
		||||
import org.springframework.util.LinkedMultiValueMap;
 | 
			
		||||
| 
						 | 
				
			
			@ -109,16 +111,29 @@ public class MockServerHttpResponse implements ServerHttpResponse {
 | 
			
		|||
		return this.bufferFactory;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Return the body of the response aggregated and converted to a String
 | 
			
		||||
	 * using the charset of the Content-Type response or otherwise defaulting
 | 
			
		||||
	 * to "UTF-8".
 | 
			
		||||
	 */
 | 
			
		||||
	public Mono<String> getBodyAsString() {
 | 
			
		||||
 | 
			
		||||
		return Flux.from(body)
 | 
			
		||||
				.reduce(bufferFactory.allocateBuffer(), (previous, current) -> {
 | 
			
		||||
		Charset charset = getCharset();
 | 
			
		||||
		Charset charsetToUse = (charset != null ? charset : StandardCharsets.UTF_8);
 | 
			
		||||
		return Flux.from(this.body)
 | 
			
		||||
				.reduce(this.bufferFactory.allocateBuffer(), (previous, current) -> {
 | 
			
		||||
					previous.write(current);
 | 
			
		||||
					DataBufferUtils.release(current);
 | 
			
		||||
					return previous;
 | 
			
		||||
				})
 | 
			
		||||
				.map(buffer -> DataBufferTestUtils.dumpString(buffer, StandardCharsets.UTF_8));
 | 
			
		||||
				.map(buffer -> DataBufferTestUtils.dumpString(buffer, charsetToUse));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private Charset getCharset() {
 | 
			
		||||
		MediaType contentType = getHeaders().getContentType();
 | 
			
		||||
		if (contentType != null) {
 | 
			
		||||
			return contentType.getCharset();
 | 
			
		||||
		}
 | 
			
		||||
		return null;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue