Skip to content

Commit

Permalink
Add WebSocketServiceHandler (#4954)
Browse files Browse the repository at this point in the history
I need to add `WebSocketServiceHandler` and refactor `WebSocketHandler` before releasing a new version.
  • Loading branch information
minwoox committed Jun 14, 2023
1 parent a395ca6 commit 6d50c35
Show file tree
Hide file tree
Showing 9 changed files with 60 additions and 28 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/*
* Copyright 2023 LINE Corporation
*
* LINE Corporation licenses this file to you under the Apache License,
* version 2.0 (the "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at:
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
package com.linecorp.armeria.common.websocket;

import com.linecorp.armeria.common.RequestContext;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.server.websocket.WebSocketServiceHandler;

/**
* Implement this interface to handle incoming {@link WebSocketFrame}s from the peer and
* send {@link WebSocketFrame}s to the peer.
*
* @see WebSocketServiceHandler
*/
@UnstableApi
@FunctionalInterface
public interface WebSocketHandler<T extends RequestContext> {

/**
* Handles the incoming {@link WebSocket} and returns {@link WebSocket} created via
* {@link WebSocket#streaming()} to send {@link WebSocketFrame}s.
*/
WebSocket handle(T ctx, WebSocket in);
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
* License for the specific language governing permissions and limitations
* under the License.
*/
package com.linecorp.armeria.server.websocket;
package com.linecorp.armeria.internal.common.websocket;

import java.util.concurrent.CompletableFuture;

Expand All @@ -26,11 +26,11 @@

import io.netty.util.concurrent.EventExecutor;

final class WebSocketWrapper implements WebSocket {
public final class WebSocketWrapper implements WebSocket {

private final StreamMessage<WebSocketFrame> delegate;

WebSocketWrapper(StreamMessage<WebSocketFrame> delegate) {
public WebSocketWrapper(StreamMessage<WebSocketFrame> delegate) {
this.delegate = delegate;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception
assert encoder instanceof ServerHttp1ObjectEncoder;
((ServerHttp1ObjectEncoder) encoder).webSocketUpgrading();
final ChannelPipeline pipeline = ctx.pipeline();
pipeline.replace(this, null, new WebSocketSessionHandler(
pipeline.replace(this, null, new WebSocketSessionChannelHandler(
webSocketRequest, encoder, serviceConfig));
if (pipeline.get(HttpServerUpgradeHandler.class) != null) {
pipeline.remove(HttpServerUpgradeHandler.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,16 +38,16 @@
import io.netty.handler.codec.http2.Http2Error;
import io.netty.util.ReferenceCountUtil;

final class WebSocketSessionHandler extends ChannelDuplexHandler {
final class WebSocketSessionChannelHandler extends ChannelDuplexHandler {

private static final Logger logger = LoggerFactory.getLogger(WebSocketSessionHandler.class);
private static final Logger logger = LoggerFactory.getLogger(WebSocketSessionChannelHandler.class);

private final StreamingDecodedHttpRequest req;
private final ServerHttpObjectEncoder encoder;
private final ServiceConfig serviceConfig;

WebSocketSessionHandler(StreamingDecodedHttpRequest req, ServerHttpObjectEncoder encoder,
ServiceConfig serviceConfig) {
WebSocketSessionChannelHandler(StreamingDecodedHttpRequest req, ServerHttpObjectEncoder encoder,
ServiceConfig serviceConfig) {
this.req = req;
this.encoder = encoder;
this.serviceConfig = serviceConfig;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
import com.linecorp.armeria.common.websocket.WebSocketFrame;
import com.linecorp.armeria.internal.common.websocket.WebSocketFrameDecoder;
import com.linecorp.armeria.internal.common.websocket.WebSocketFrameEncoder;
import com.linecorp.armeria.internal.common.websocket.WebSocketWrapper;
import com.linecorp.armeria.server.AbstractHttpService;
import com.linecorp.armeria.server.HttpService;
import com.linecorp.armeria.server.ServiceRequestContext;
Expand Down Expand Up @@ -80,27 +81,27 @@ public final class WebSocketService extends AbstractHttpService {
private static final WebSocketFrameEncoder encoder = WebSocketFrameEncoder.of(false);

/**
* Returns a new {@link WebSocketService} with the {@link WebSocketHandler}.
* Returns a new {@link WebSocketService} with the {@link WebSocketServiceHandler}.
*/
public static WebSocketService of(WebSocketHandler handler) {
public static WebSocketService of(WebSocketServiceHandler handler) {
return new WebSocketServiceBuilder(handler).build();
}

/**
* Returns a new {@link WebSocketServiceBuilder} with the {@link WebSocketHandler}.
* Returns a new {@link WebSocketServiceBuilder} with the {@link WebSocketServiceHandler}.
*/
public static WebSocketServiceBuilder builder(WebSocketHandler handler) {
public static WebSocketServiceBuilder builder(WebSocketServiceHandler handler) {
return new WebSocketServiceBuilder(handler);
}

private final WebSocketHandler handler;
private final WebSocketServiceHandler handler;
private final int maxFramePayloadLength;
private final boolean allowMaskMismatch;
private final Set<String> subprotocols;
private final Set<String> allowedOrigins;
private final boolean allowAnyOrigin;

WebSocketService(WebSocketHandler handler, int maxFramePayloadLength, boolean allowMaskMismatch,
WebSocketService(WebSocketServiceHandler handler, int maxFramePayloadLength, boolean allowMaskMismatch,
Set<String> subprotocols, Set<String> allowedOrigins, boolean allowAnyOrigin) {
this.handler = handler;
this.maxFramePayloadLength = maxFramePayloadLength;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,14 +41,14 @@ public final class WebSocketServiceBuilder {

static final int DEFAULT_MAX_FRAME_PAYLOAD_LENGTH = 65535; // 64 * 1024 -1

private final WebSocketHandler handler;
private final WebSocketServiceHandler handler;

private int maxFramePayloadLength = DEFAULT_MAX_FRAME_PAYLOAD_LENGTH;
private boolean allowMaskMismatch;
private Set<String> subprotocols = ImmutableSet.of();
private Set<String> allowedOrigins = ImmutableSet.of();

WebSocketServiceBuilder(WebSocketHandler handler) {
WebSocketServiceBuilder(WebSocketServiceHandler handler) {
this.handler = requireNonNull(handler, "handler");
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2022 LINE Corporation
* Copyright 2023 LINE Corporation
*
* LINE Corporation licenses this file to you under the Apache License,
* version 2.0 (the "License"); you may not use this file except in compliance
Expand All @@ -16,8 +16,8 @@
package com.linecorp.armeria.server.websocket;

import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.websocket.WebSocket;
import com.linecorp.armeria.common.websocket.WebSocketFrame;
import com.linecorp.armeria.common.websocket.WebSocketHandler;
import com.linecorp.armeria.server.ServiceRequestContext;

/**
Expand All @@ -28,11 +28,5 @@
*/
@UnstableApi
@FunctionalInterface
public interface WebSocketHandler {

/**
* Handles the incoming {@link WebSocket} and returns {@link WebSocket} created via
* {@link WebSocket#streaming()} to send {@link WebSocketFrame}s.
*/
WebSocket handle(ServiceRequestContext ctx, WebSocket in);
public interface WebSocketServiceHandler extends WebSocketHandler<ServiceRequestContext> {
}
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ private HttpData toHttpData(WebSocketFrame frame) {
return HttpData.wrap(encoder.encode(ctx, frame));
}

static class AbstractWebSocketHandler implements WebSocketHandler {
static class AbstractWebSocketHandler implements WebSocketServiceHandler {

@Override
public WebSocket handle(ServiceRequestContext ctx, WebSocket in) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,9 @@
import com.linecorp.armeria.common.websocket.WebSocketWriter;
import com.linecorp.armeria.server.ServerBuilder;
import com.linecorp.armeria.server.ServiceRequestContext;
import com.linecorp.armeria.server.websocket.WebSocketHandler;
import com.linecorp.armeria.server.websocket.WebSocketProtocolViolationException;
import com.linecorp.armeria.server.websocket.WebSocketService;
import com.linecorp.armeria.server.websocket.WebSocketServiceHandler;
import com.linecorp.armeria.testing.junit5.server.ServerExtension;

class WebSocketServiceItTest {
Expand Down Expand Up @@ -227,7 +227,7 @@ public void onClose(int code, String reason, boolean remote) {
public void onError(Exception ex) {}
}

static final class WebSocketEchoHandler implements WebSocketHandler {
static final class WebSocketEchoHandler implements WebSocketServiceHandler {

@Override
public WebSocket handle(ServiceRequestContext ctx, WebSocket in) {
Expand Down

0 comments on commit 6d50c35

Please sign in to comment.