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.
This commit is contained in:
Brian Clozel 2017-09-26 11:05:32 +02:00
parent 80979e7592
commit 95b83fe1ba
1 changed files with 8 additions and 1 deletions

View File

@ -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<Void> writeWith(File file, long position, long count) {
return doCommit(() -> this.httpRequest.sendFile(file.toPath(), position, count).then());
}
@Override
public Mono<Void> setComplete() {
return doCommit(() -> httpRequest.sendHeaders().then());