Upgrade to Reactor Netty 0.8
Issue: SPR-16387
This commit is contained in:
committed by
Rossen Stoyanchev
parent
61ffbe5554
commit
ffbc75ae47
@@ -20,11 +20,11 @@ import io.netty.handler.codec.http.websocketx.WebSocketFrame;
|
||||
import org.reactivestreams.Publisher;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
import reactor.ipc.netty.NettyInbound;
|
||||
import reactor.ipc.netty.NettyOutbound;
|
||||
import reactor.ipc.netty.NettyPipeline;
|
||||
import reactor.ipc.netty.http.websocket.WebsocketInbound;
|
||||
import reactor.ipc.netty.http.websocket.WebsocketOutbound;
|
||||
import reactor.netty.NettyInbound;
|
||||
import reactor.netty.NettyOutbound;
|
||||
import reactor.netty.NettyPipeline;
|
||||
import reactor.netty.http.websocket.WebsocketInbound;
|
||||
import reactor.netty.http.websocket.WebsocketOutbound;
|
||||
|
||||
import org.springframework.core.io.buffer.NettyDataBufferFactory;
|
||||
import org.springframework.web.reactive.socket.CloseStatus;
|
||||
|
||||
@@ -21,9 +21,7 @@ import java.util.function.Consumer;
|
||||
|
||||
import io.netty.buffer.ByteBufAllocator;
|
||||
import reactor.core.publisher.Mono;
|
||||
import reactor.ipc.netty.http.client.HttpClient;
|
||||
import reactor.ipc.netty.http.client.HttpClientOptions;
|
||||
import reactor.ipc.netty.http.client.HttpClientResponse;
|
||||
import reactor.netty.http.client.HttpClient;
|
||||
|
||||
import org.springframework.core.io.buffer.NettyDataBufferFactory;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
@@ -48,15 +46,14 @@ public class ReactorNettyWebSocketClient extends WebSocketClientSupport implemen
|
||||
* Default constructor.
|
||||
*/
|
||||
public ReactorNettyWebSocketClient() {
|
||||
this(options -> {});
|
||||
this(HttpClient.create());
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor that accepts an {@link HttpClientOptions.Builder} consumer
|
||||
* to supply to {@link HttpClient#create(Consumer)}.
|
||||
* Constructor that accepts an existing {@link HttpClient} builder.
|
||||
*/
|
||||
public ReactorNettyWebSocketClient(Consumer<? super HttpClientOptions.Builder> clientOptions) {
|
||||
this.httpClient = HttpClient.create(clientOptions);
|
||||
public ReactorNettyWebSocketClient(HttpClient httpClient) {
|
||||
this.httpClient = httpClient;
|
||||
}
|
||||
|
||||
|
||||
@@ -78,29 +75,28 @@ public class ReactorNettyWebSocketClient extends WebSocketClientSupport implemen
|
||||
List<String> protocols = beforeHandshake(url, headers, handler);
|
||||
|
||||
return getHttpClient()
|
||||
.ws(url.toString(),
|
||||
nettyHeaders -> setNettyHeaders(headers, nettyHeaders),
|
||||
StringUtils.collectionToCommaDelimitedString(protocols))
|
||||
.flatMap(response -> {
|
||||
HandshakeInfo info = afterHandshake(url, toHttpHeaders(response));
|
||||
ByteBufAllocator allocator = response.channel().alloc();
|
||||
.headers(nettyHeaders -> setNettyHeaders(headers, nettyHeaders))
|
||||
.websocket(StringUtils.collectionToCommaDelimitedString(protocols))
|
||||
.uri(url.toString())
|
||||
.handle((in, out) -> {
|
||||
HandshakeInfo info = afterHandshake(url, toHttpHeaders(in.headers()));
|
||||
ByteBufAllocator allocator = out.alloc();
|
||||
NettyDataBufferFactory factory = new NettyDataBufferFactory(allocator);
|
||||
return response.receiveWebsocket((in, out) -> {
|
||||
WebSocketSession session = new ReactorNettyWebSocketSession(in, out, info, factory);
|
||||
return handler.handle(session);
|
||||
});
|
||||
});
|
||||
WebSocketSession session = new ReactorNettyWebSocketSession(in, out, info, factory);
|
||||
return handler.handle(session);
|
||||
})
|
||||
.next();
|
||||
}
|
||||
|
||||
private void setNettyHeaders(HttpHeaders headers, io.netty.handler.codec.http.HttpHeaders nettyHeaders) {
|
||||
headers.forEach(nettyHeaders::set);
|
||||
}
|
||||
|
||||
private HttpHeaders toHttpHeaders(HttpClientResponse response) {
|
||||
private HttpHeaders toHttpHeaders(io.netty.handler.codec.http.HttpHeaders responseHeaders) {
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
response.responseHeaders().forEach(entry -> {
|
||||
responseHeaders.forEach(entry -> {
|
||||
String name = entry.getKey();
|
||||
headers.put(name, response.responseHeaders().getAll(name));
|
||||
headers.put(name, responseHeaders.getAll(name));
|
||||
});
|
||||
return headers;
|
||||
}
|
||||
|
||||
@@ -75,7 +75,7 @@ public class HandshakeWebSocketService implements WebSocketService, Lifecycle {
|
||||
HandshakeWebSocketService.class.getClassLoader());
|
||||
|
||||
private static final boolean reactorNettyPresent = ClassUtils.isPresent(
|
||||
"reactor.ipc.netty.http.server.HttpServerResponse",
|
||||
"reactor.netty.http.server.HttpServerResponse",
|
||||
HandshakeWebSocketService.class.getClassLoader());
|
||||
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ package org.springframework.web.reactive.socket.server.upgrade;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import reactor.core.publisher.Mono;
|
||||
import reactor.ipc.netty.http.server.HttpServerResponse;
|
||||
import reactor.netty.http.server.HttpServerResponse;
|
||||
|
||||
import org.springframework.core.io.buffer.NettyDataBufferFactory;
|
||||
import org.springframework.http.server.reactive.AbstractServerHttpResponse;
|
||||
|
||||
Reference in New Issue
Block a user