Skip to content

Commit 7d56f49

Browse files
committed
client websocket lifecycle events: add Http2WebSocketSupportedEvent
1 parent d1ad53d commit 7d56f49

File tree

4 files changed

+71
-12
lines changed

4 files changed

+71
-12
lines changed

netty-websocket-http2/src/main/java/com/jauntsdn/netty/handler/codec/http2/websocketx/Http2WebSocketClientHandler.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ public void onSettingsRead(ChannelHandlerContext ctx, Http2Settings settings)
105105
settings.get(Http2WebSocketProtocol.SETTINGS_ENABLE_CONNECT_PROTOCOL);
106106
boolean supports =
107107
supportsWebSocket = extendedConnectEnabled != null && extendedConnectEnabled == 1;
108+
Http2WebSocketEvent.fireWebSocketSupported(webSocketsParent.context().channel(), supports);
108109
Http2WebSocketClientHandshaker listener = HANDSHAKER.get(this);
109110
if (listener != null) {
110111
supportsWebSocketCalled = true;

netty-websocket-http2/src/main/java/com/jauntsdn/netty/handler/codec/http2/websocketx/Http2WebSocketEvent.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@ public abstract class Http2WebSocketEvent {
3333
this.type = type;
3434
}
3535

36+
static void fireWebSocketSupported(Channel parentChannel, boolean webSocketSupported) {
37+
long timestamp = System.nanoTime();
38+
ChannelPipeline parentPipeline = parentChannel.pipeline();
39+
parentPipeline.fireUserEventTriggered(
40+
new Http2WebSocketSupportedEvent(webSocketSupported, timestamp));
41+
}
42+
3643
static void fireFrameWriteError(Channel parentChannel, Throwable t) {
3744
ChannelPipeline parentPipeline = parentChannel.pipeline();
3845
if (parentChannel.config().isAutoClose()) {
@@ -242,7 +249,8 @@ public enum Type {
242249
CLOSE_REMOTE_RESET,
243250
CLOSE_REMOTE_GOAWAY,
244251
WEIGHT_UPDATE,
245-
WRITE_ERROR
252+
WRITE_ERROR,
253+
WEBSOCKET_SUPPORTED
246254
}
247255

248256
/**
@@ -514,6 +522,26 @@ public static Short streamWeight(Channel webSocketChannel) {
514522
}
515523
}
516524

525+
/** websocket-over-http2 support event */
526+
public static final class Http2WebSocketSupportedEvent extends Http2WebSocketEvent {
527+
private final boolean webSocketSupported;
528+
private final long timestampNanos;
529+
530+
Http2WebSocketSupportedEvent(boolean webSocketSupported, long timestampNanos) {
531+
super(Type.WEBSOCKET_SUPPORTED);
532+
this.webSocketSupported = webSocketSupported;
533+
this.timestampNanos = timestampNanos;
534+
}
535+
536+
public boolean isWebSocketSupported() {
537+
return webSocketSupported;
538+
}
539+
540+
public long timestampNanos() {
541+
return timestampNanos;
542+
}
543+
}
544+
517545
private static String nonNullString(@Nullable CharSequence seq) {
518546
if (seq == null) {
519547
return "";

netty-websocket-http2/src/test/java/com/jauntsdn/netty/handler/codec/http2/websocketx/AbstractTest.java

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package com.jauntsdn.netty.handler.codec.http2.websocketx;
1818

19+
import com.jauntsdn.netty.handler.codec.http2.websocketx.Http2WebSocketEvent.Http2WebSocketSupportedEvent;
1920
import io.netty.bootstrap.Bootstrap;
2021
import io.netty.bootstrap.ServerBootstrap;
2122
import io.netty.channel.ChannelFuture;
@@ -127,37 +128,47 @@ static SslProvider sslProvider() {
127128
}
128129

129130
static class WebsocketEventsHandler extends ChannelInboundHandlerAdapter {
130-
private final int eventsCount;
131-
private final List<Http2WebSocketEvent> events = new ArrayList<>();
132-
private volatile ChannelPromise eventsReceived;
131+
private final int orderedEventsCount;
132+
private final List<Http2WebSocketEvent> orderedEvents = new ArrayList<>();
133+
private Http2WebSocketEvent webSocketSupportedEvent;
134+
private volatile ChannelPromise orderedEventsReceived;
133135

134-
public WebsocketEventsHandler(int eventsCount) {
135-
this.eventsCount = eventsCount;
136+
public WebsocketEventsHandler(int orderedEventsCount) {
137+
this.orderedEventsCount = orderedEventsCount;
136138
}
137139

138140
@Override
139141
public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
140-
eventsReceived = ctx.newPromise();
142+
orderedEventsReceived = ctx.newPromise();
141143
super.handlerAdded(ctx);
142144
}
143145

144146
@Override
145147
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
146148
if (evt instanceof Http2WebSocketEvent) {
147-
events.add((Http2WebSocketEvent) evt);
148-
if (events.size() == eventsCount) {
149-
eventsReceived.setSuccess();
149+
/*may occur in any order relative to other events so accounted separately*/
150+
if (evt instanceof Http2WebSocketSupportedEvent) {
151+
webSocketSupportedEvent = (Http2WebSocketEvent) evt;
152+
return;
153+
}
154+
orderedEvents.add((Http2WebSocketEvent) evt);
155+
if (orderedEvents.size() == orderedEventsCount) {
156+
orderedEventsReceived.setSuccess();
150157
}
151158
}
152159
super.userEventTriggered(ctx, evt);
153160
}
154161

155162
ChannelFuture eventsReceived() {
156-
return eventsReceived;
163+
return orderedEventsReceived;
157164
}
158165

159166
public List<Http2WebSocketEvent> events() {
160-
return events;
167+
return orderedEvents;
168+
}
169+
170+
public Http2WebSocketEvent webSocketSupportedEvent() {
171+
return webSocketSupportedEvent;
161172
}
162173
}
163174

netty-websocket-http2/src/test/java/com/jauntsdn/netty/handler/codec/http2/websocketx/ProtocolHandshakeTest.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.jauntsdn.netty.handler.codec.http2.websocketx.Http2WebSocketEvent.Http2WebSocketHandshakeErrorEvent;
2020
import com.jauntsdn.netty.handler.codec.http2.websocketx.Http2WebSocketEvent.Http2WebSocketHandshakeStartEvent;
2121
import com.jauntsdn.netty.handler.codec.http2.websocketx.Http2WebSocketEvent.Http2WebSocketHandshakeSuccessEvent;
22+
import com.jauntsdn.netty.handler.codec.http2.websocketx.Http2WebSocketEvent.Http2WebSocketSupportedEvent;
2223
import com.jauntsdn.netty.handler.codec.http2.websocketx.WebSocketEvent.WebSocketHandshakeErrorEvent;
2324
import com.jauntsdn.netty.handler.codec.http2.websocketx.WebSocketEvent.WebSocketHandshakeStartEvent;
2425
import com.jauntsdn.netty.handler.codec.http2.websocketx.WebSocketEvent.WebSocketHandshakeSuccessEvent;
@@ -103,6 +104,8 @@ void settingsEnableConnectAccepted() throws Exception {
103104

104105
eventsRecorder.eventsReceived().await(5, TimeUnit.SECONDS);
105106
List<Http2WebSocketEvent> events = eventsRecorder.events();
107+
Http2WebSocketEvent webSocketSupportedEvent = eventsRecorder.webSocketSupportedEvent();
108+
106109
Assertions.assertThat(events).hasSize(4);
107110
Http2WebSocketEvent http2startEvent = events.get(0);
108111
Http2WebSocketEvent startEvent = events.get(1);
@@ -118,6 +121,13 @@ void settingsEnableConnectAccepted() throws Exception {
118121
Assertions.assertThat(startEvent.<WebSocketHandshakeStartEvent>cast().path())
119122
.isEqualTo("/test");
120123

124+
Assertions.assertThat(webSocketSupportedEvent)
125+
.isNotNull()
126+
.isExactlyInstanceOf(Http2WebSocketSupportedEvent.class);
127+
Assertions.assertThat(
128+
webSocketSupportedEvent.<Http2WebSocketSupportedEvent>cast().isWebSocketSupported())
129+
.isTrue();
130+
121131
Assertions.assertThat(http2successEvent)
122132
.isExactlyInstanceOf(Http2WebSocketHandshakeSuccessEvent.class);
123133

@@ -167,6 +177,8 @@ void settingsNoEnableConnectRejected() throws Exception {
167177

168178
eventsRecorder.eventsReceived().await(5, TimeUnit.SECONDS);
169179
List<Http2WebSocketEvent> events = eventsRecorder.events();
180+
Http2WebSocketEvent webSocketSupportedEvent = eventsRecorder.webSocketSupportedEvent();
181+
170182
Assertions.assertThat(events).hasSize(4);
171183
Http2WebSocketEvent http2startEvent = events.get(0);
172184
Http2WebSocketEvent startEvent = events.get(1);
@@ -182,6 +194,13 @@ void settingsNoEnableConnectRejected() throws Exception {
182194
Assertions.assertThat(startEvent.<WebSocketHandshakeStartEvent>cast().path())
183195
.isEqualTo("/test");
184196

197+
Assertions.assertThat(webSocketSupportedEvent)
198+
.isNotNull()
199+
.isExactlyInstanceOf(Http2WebSocketSupportedEvent.class);
200+
Assertions.assertThat(
201+
webSocketSupportedEvent.<Http2WebSocketSupportedEvent>cast().isWebSocketSupported())
202+
.isFalse();
203+
185204
Assertions.assertThat(http2errorEvent)
186205
.isExactlyInstanceOf(Http2WebSocketHandshakeErrorEvent.class);
187206
Assertions.assertThat(http2errorEvent.<Http2WebSocketHandshakeErrorEvent>cast().error())

0 commit comments

Comments
 (0)