From 95b83fe1ba774e5e54b3ac9ab05ef811aa0b4ec0 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Tue, 26 Sep 2017 11:05:32 +0200 Subject: [PATCH] Add zero copy support in reactor-based WebClient This commit makes Reactor Netty `WebClient` instances support zero-copy requests by implementing `ZeroCopyHttpOutputMessage`. The implementation leverages the optimized `sendFile` mechanism if available. --- .../http/client/reactive/ReactorClientHttpRequest.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/spring-web/src/main/java/org/springframework/http/client/reactive/ReactorClientHttpRequest.java b/spring-web/src/main/java/org/springframework/http/client/reactive/ReactorClientHttpRequest.java index e1042cb478f..aa20db21b12 100644 --- a/spring-web/src/main/java/org/springframework/http/client/reactive/ReactorClientHttpRequest.java +++ b/spring-web/src/main/java/org/springframework/http/client/reactive/ReactorClientHttpRequest.java @@ -16,6 +16,7 @@ package org.springframework.http.client.reactive; +import java.io.File; import java.net.URI; import java.util.Collection; @@ -30,6 +31,7 @@ import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DataBufferFactory; import org.springframework.core.io.buffer.NettyDataBufferFactory; import org.springframework.http.HttpMethod; +import org.springframework.http.ZeroCopyHttpOutputMessage; /** * {@link ClientHttpRequest} implementation for the Reactor-Netty HTTP client. @@ -38,7 +40,7 @@ import org.springframework.http.HttpMethod; * @since 5.0 * @see reactor.ipc.netty.http.client.HttpClient */ -public class ReactorClientHttpRequest extends AbstractClientHttpRequest { +public class ReactorClientHttpRequest extends AbstractClientHttpRequest implements ZeroCopyHttpOutputMessage { private final HttpMethod httpMethod; @@ -89,6 +91,11 @@ public class ReactorClientHttpRequest extends AbstractClientHttpRequest { return Flux.from(dataBuffers).map(NettyDataBufferFactory::toByteBuf); } + @Override + public Mono writeWith(File file, long position, long count) { + return doCommit(() -> this.httpRequest.sendFile(file.toPath(), position, count).then()); + } + @Override public Mono setComplete() { return doCommit(() -> httpRequest.sendHeaders().then());