Polishing
This commit is contained in:
@@ -19,24 +19,25 @@ package org.springframework.http.client.reactive;
|
||||
import java.net.URI;
|
||||
import java.util.function.Function;
|
||||
|
||||
import org.springframework.http.HttpMethod;
|
||||
|
||||
import reactor.core.publisher.Mono;
|
||||
import reactor.ipc.netty.config.ClientOptions;
|
||||
import reactor.ipc.netty.http.HttpException;
|
||||
import reactor.ipc.netty.http.HttpInbound;
|
||||
|
||||
import org.springframework.http.HttpMethod;
|
||||
|
||||
/**
|
||||
* Reactor-Netty implementation of {@link ClientHttpConnector}
|
||||
*
|
||||
* @author Brian Clozel
|
||||
* @see reactor.ipc.netty.http.HttpClient
|
||||
* @since 5.0
|
||||
* @see reactor.ipc.netty.http.HttpClient
|
||||
*/
|
||||
public class ReactorClientHttpConnector implements ClientHttpConnector {
|
||||
|
||||
private final ClientOptions clientOptions;
|
||||
|
||||
|
||||
/**
|
||||
* Create a Reactor Netty {@link ClientHttpConnector} with default {@link ClientOptions}
|
||||
* and SSL support enabled.
|
||||
@@ -52,6 +53,7 @@ public class ReactorClientHttpConnector implements ClientHttpConnector {
|
||||
this.clientOptions = clientOptions;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Mono<ClientHttpResponse> connect(HttpMethod method, URI uri,
|
||||
Function<? super ClientHttpRequest, Mono<Void>> requestCallback) {
|
||||
@@ -66,4 +68,4 @@ public class ReactorClientHttpConnector implements ClientHttpConnector {
|
||||
.map(httpInbound -> new ReactorClientHttpResponse(httpInbound));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,6 +47,7 @@ public abstract class AbstractServerHttpMessageWriter<T> implements ServerHttpMe
|
||||
this.writer = writer;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean canWrite(ResolvableType elementType, MediaType mediaType) {
|
||||
return this.writer.canWrite(elementType, mediaType);
|
||||
@@ -78,14 +79,13 @@ public abstract class AbstractServerHttpMessageWriter<T> implements ServerHttpMe
|
||||
/**
|
||||
* Invoked before writing the response to resolve hints by
|
||||
* {@link #write(Publisher, ResolvableType, ResolvableType, MediaType, ServerHttpRequest, ServerHttpResponse, Map)}.
|
||||
*
|
||||
* @param streamType the original type used for the method return value. For annotation
|
||||
* based controllers, the {@link MethodParameter} is available via {@link ResolvableType#getSource()}.
|
||||
* @param elementType the stream element type to process
|
||||
* @param mediaType the content type to use when writing. May be {@code null} to
|
||||
* indicate that the default content type of the converter must be used.
|
||||
* @param request the current HTTP request
|
||||
* @return Additional information about how to write the body
|
||||
* @return additional information about how to write the body
|
||||
*/
|
||||
protected abstract Map<String, Object> resolveWriteHints(ResolvableType streamType, ResolvableType elementType,
|
||||
MediaType mediaType, ServerHttpRequest request);
|
||||
|
||||
@@ -18,16 +18,15 @@ package org.springframework.http.server.reactive;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import reactor.core.publisher.Mono;
|
||||
import reactor.ipc.netty.http.HttpChannel;
|
||||
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.springframework.core.io.buffer.NettyDataBufferFactory;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||
|
||||
/**
|
||||
* Adapt {@link HttpHandler} to the Reactor Netty channel handling function.
|
||||
*
|
||||
@@ -43,7 +42,7 @@ public class ReactorHttpHandlerAdapter implements Function<HttpChannel, Mono<Voi
|
||||
|
||||
|
||||
public ReactorHttpHandlerAdapter(HttpHandler httpHandler) {
|
||||
Assert.notNull(httpHandler, "'httpHandler' is required.");
|
||||
Assert.notNull(httpHandler, "HttpHandler is required");
|
||||
this.httpHandler = httpHandler;
|
||||
}
|
||||
|
||||
|
||||
@@ -86,15 +86,13 @@ import org.springframework.util.ClassUtils;
|
||||
*/
|
||||
public final class WebClient {
|
||||
|
||||
private static final ClassLoader classLoader = WebClient.class.getClassLoader();
|
||||
private static final boolean jackson2Present =
|
||||
ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", WebClient.class.getClassLoader()) &&
|
||||
ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", WebClient.class.getClassLoader());
|
||||
|
||||
private static final boolean jackson2Present = ClassUtils
|
||||
.isPresent("com.fasterxml.jackson.databind.ObjectMapper", classLoader)
|
||||
&& ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator",
|
||||
classLoader);
|
||||
private static final boolean jaxb2Present =
|
||||
ClassUtils.isPresent("javax.xml.bind.Binder", WebClient.class.getClassLoader());
|
||||
|
||||
private static final boolean jaxb2Present = ClassUtils
|
||||
.isPresent("javax.xml.bind.Binder", classLoader);
|
||||
|
||||
private ClientHttpConnector clientHttpConnector;
|
||||
|
||||
@@ -107,7 +105,6 @@ public final class WebClient {
|
||||
* Create a {@code WebClient} instance, using the {@link ClientHttpConnector}
|
||||
* implementation given as an argument to drive the underlying
|
||||
* implementation.
|
||||
*
|
||||
* Register by default the following Encoders and Decoders:
|
||||
* <ul>
|
||||
* <li>{@link ByteBufferEncoder} / {@link ByteBufferDecoder}</li>
|
||||
@@ -115,7 +112,6 @@ public final class WebClient {
|
||||
* <li>{@link Jaxb2XmlEncoder} / {@link Jaxb2XmlDecoder}</li>
|
||||
* <li>{@link Jackson2JsonEncoder} / {@link Jackson2JsonDecoder}</li>
|
||||
* </ul>
|
||||
*
|
||||
* @param clientHttpConnector the {@code ClientHttpRequestFactory} to use
|
||||
*/
|
||||
public WebClient(ClientHttpConnector clientHttpConnector) {
|
||||
@@ -124,8 +120,9 @@ public final class WebClient {
|
||||
this.webClientConfig.setResponseErrorHandler(new DefaultResponseErrorHandler());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds default HTTP message readers.
|
||||
* Add default HTTP message readers.
|
||||
*/
|
||||
protected final void addDefaultHttpMessageReaders(List<HttpMessageReader<?>> messageReaders) {
|
||||
messageReaders.add(new DecoderHttpMessageReader<>(new ByteBufferDecoder()));
|
||||
@@ -140,7 +137,7 @@ public final class WebClient {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds default HTTP message writers.
|
||||
* Add default HTTP message writers.
|
||||
*/
|
||||
protected final void addDefaultHttpMessageWriters(List<HttpMessageWriter<?>> messageWriters) {
|
||||
messageWriters.add(new EncoderHttpMessageWriter<>(new ByteBufferEncoder()));
|
||||
@@ -187,11 +184,10 @@ public final class WebClient {
|
||||
Collections.unmodifiableList(interceptors) : Collections.emptyList());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Perform the actual HTTP request/response exchange
|
||||
*
|
||||
* <p>
|
||||
* Requesting from the exposed {@code Flux} will result in:
|
||||
* <p>Requesting from the exposed {@code Flux} will result in:
|
||||
* <ul>
|
||||
* <li>building the actual HTTP request using the provided {@code ClientWebRequestBuilder}</li>
|
||||
* <li>encoding the HTTP request body with the configured {@code HttpMessageWriter}s</li>
|
||||
@@ -199,7 +195,6 @@ public final class WebClient {
|
||||
* </ul>
|
||||
*/
|
||||
public WebResponseActions perform(ClientWebRequestBuilder builder) {
|
||||
|
||||
ClientWebRequest clientWebRequest = builder.build();
|
||||
DefaultClientHttpRequestInterceptionChain interception =
|
||||
new DefaultClientHttpRequestInterceptionChain(this.clientHttpConnector,
|
||||
@@ -214,7 +209,6 @@ public final class WebClient {
|
||||
public void doWithStatus(Consumer<HttpStatus> consumer) {
|
||||
clientResponse.doOnNext(clientHttpResponse -> consumer.accept(clientHttpResponse.getStatusCode()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T extract(ResponseExtractor<T> extractor) {
|
||||
return extractor.extract(clientResponse, webClientConfig);
|
||||
@@ -222,6 +216,7 @@ public final class WebClient {
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
protected class DefaultWebClientConfig implements WebClientConfig {
|
||||
|
||||
private List<HttpMessageReader<?>> messageReaders;
|
||||
@@ -230,7 +225,6 @@ public final class WebClient {
|
||||
|
||||
private ResponseErrorHandler responseErrorHandler;
|
||||
|
||||
|
||||
public DefaultWebClientConfig() {
|
||||
this.messageReaders = new ArrayList<>();
|
||||
addDefaultHttpMessageReaders(this.messageReaders);
|
||||
@@ -266,13 +260,13 @@ public final class WebClient {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
protected class DefaultRequestCallback implements Function<ClientHttpRequest, Mono<Void>> {
|
||||
|
||||
private final ClientWebRequest clientWebRequest;
|
||||
|
||||
private final List<Consumer<? super HttpMessage>> requestCustomizers;
|
||||
|
||||
|
||||
public DefaultRequestCallback(ClientWebRequest clientWebRequest,
|
||||
List<Consumer<? super HttpMessage>> requestCustomizers) {
|
||||
this.clientWebRequest = clientWebRequest;
|
||||
@@ -303,9 +297,8 @@ public final class WebClient {
|
||||
}
|
||||
|
||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||
protected Mono<Void> writeRequestBody(Publisher<?> content,
|
||||
ResolvableType requestType, ClientHttpRequest request,
|
||||
List<HttpMessageWriter<?>> messageWriters) {
|
||||
protected Mono<Void> writeRequestBody(Publisher<?> content, ResolvableType requestType,
|
||||
ClientHttpRequest request, List<HttpMessageWriter<?>> messageWriters) {
|
||||
|
||||
MediaType contentType = request.getHeaders().getContentType();
|
||||
Optional<HttpMessageWriter<?>> messageWriter = resolveWriter(messageWriters, requestType, contentType);
|
||||
@@ -324,6 +317,7 @@ public final class WebClient {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
protected class DefaultClientHttpRequestInterceptionChain implements ClientHttpRequestInterceptionChain {
|
||||
|
||||
private final ClientHttpConnector connector;
|
||||
@@ -337,10 +331,9 @@ public final class WebClient {
|
||||
private int index;
|
||||
|
||||
public DefaultClientHttpRequestInterceptionChain(ClientHttpConnector connector,
|
||||
List<ClientHttpRequestInterceptor> interceptors,
|
||||
ClientWebRequest clientWebRequest) {
|
||||
List<ClientHttpRequestInterceptor> interceptors, ClientWebRequest clientWebRequest) {
|
||||
|
||||
Assert.notNull(connector, "'connector' should not be null");
|
||||
Assert.notNull(connector, "ClientHttpConnector should not be null");
|
||||
this.connector = connector;
|
||||
this.interceptors = interceptors;
|
||||
this.clientWebRequest = clientWebRequest;
|
||||
@@ -364,7 +357,6 @@ public final class WebClient {
|
||||
new DefaultRequestCallback(this.clientWebRequest, this.requestCustomizers));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user