diff --git a/web/netty-web/src/main/kotlin/cn/tursom/web/netty/NettyHttpServer.kt b/web/netty-web/src/main/kotlin/cn/tursom/web/netty/NettyHttpServer.kt index 9a3b556..4ddd366 100644 --- a/web/netty-web/src/main/kotlin/cn/tursom/web/netty/NettyHttpServer.kt +++ b/web/netty-web/src/main/kotlin/cn/tursom/web/netty/NettyHttpServer.kt @@ -10,15 +10,20 @@ import io.netty.channel.nio.NioEventLoopGroup import io.netty.channel.socket.SocketChannel import io.netty.channel.socket.nio.NioServerSocketChannel import io.netty.handler.codec.http.HttpObjectAggregator -import io.netty.handler.codec.http.HttpRequestDecoder -import io.netty.handler.codec.http.HttpResponseEncoder +import io.netty.handler.codec.http.HttpServerCodec +import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler import io.netty.handler.stream.ChunkedWriteHandler +import io.netty.handler.timeout.ReadTimeoutHandler +import io.netty.handler.timeout.WriteTimeoutHandler class NettyHttpServer( override val port: Int, handler: HttpHandler, bodySize: Int = 512 * 1024, - autoRun: Boolean = false + autoRun: Boolean = false, + webSocketPath: String? = null, + readTimeout: Int? = null, + writeTimeout: Int? = null ) : HttpServer { constructor( port: Int, @@ -41,10 +46,24 @@ class NettyHttpServer( .childHandler(object : ChannelInitializer() { override fun initChannel(ch: SocketChannel) { ch.pipeline() - .addLast("decoder", HttpRequestDecoder()) - .addLast("encoder", HttpResponseEncoder()) + .apply { + if (readTimeout != null) { + addLast(ReadTimeoutHandler(readTimeout)) + } + } + .apply { + if (writeTimeout != null) { + addLast(WriteTimeoutHandler(writeTimeout)) + } + } + .addLast("codec", HttpServerCodec()) .addLast("aggregator", HttpObjectAggregator(bodySize)) .addLast("http-chunked", ChunkedWriteHandler()) + .apply { + if (webSocketPath != null) { + addLast("ws", WebSocketServerProtocolHandler(webSocketPath)) + } + } .addLast("handle", httpHandler) } }) diff --git a/web/netty-web/src/main/kotlin/cn/tursom/web/netty/ws/NettyTextWebSocketFrame.kt b/web/netty-web/src/main/kotlin/cn/tursom/web/netty/ws/NettyTextWebSocketFrame.kt new file mode 100644 index 0000000..fe3935c --- /dev/null +++ b/web/netty-web/src/main/kotlin/cn/tursom/web/netty/ws/NettyTextWebSocketFrame.kt @@ -0,0 +1,12 @@ +package cn.tursom.web.netty.ws + +import cn.tursom.core.buffer.ByteBuffer +import cn.tursom.web.netty.NettyByteBuffer +import cn.tursom.web.ws.TextWebSocketFrame + +class NettyTextWebSocketFrame( + @Suppress("MemberVisibilityCanBePrivate") val frame: io.netty.handler.codec.http.websocketx.TextWebSocketFrame +) : TextWebSocketFrame { + override val text: String by lazy { data.toString(data.readable) } + override val data: ByteBuffer = NettyByteBuffer(frame.content()) +} \ No newline at end of file diff --git a/web/netty-web/src/main/kotlin/cn/tursom/web/netty/ws/NettyWebSocketHandler.kt b/web/netty-web/src/main/kotlin/cn/tursom/web/netty/ws/NettyWebSocketHandler.kt new file mode 100644 index 0000000..ba0a558 --- /dev/null +++ b/web/netty-web/src/main/kotlin/cn/tursom/web/netty/ws/NettyWebSocketHandler.kt @@ -0,0 +1,15 @@ +package cn.tursom.web.netty.ws + +import cn.tursom.web.netty.NettyExceptionContent +import cn.tursom.web.ws.WebSocketHandler +import io.netty.channel.ChannelHandlerContext +import io.netty.channel.SimpleChannelInboundHandler +import io.netty.handler.codec.http.websocketx.WebSocketFrame + +class NettyWebSocketHandler( + val handler: WebSocketHandler +) : SimpleChannelInboundHandler() { + override fun channelRead0(ctx: ChannelHandlerContext?, msg: WebSocketFrame?) { + + } +} \ No newline at end of file diff --git a/web/netty-web/src/main/kotlin/cn/tursom/web/netty/ws/NettyWsHttpContent.kt b/web/netty-web/src/main/kotlin/cn/tursom/web/netty/ws/NettyWsHttpContent.kt new file mode 100644 index 0000000..1f8cf7d --- /dev/null +++ b/web/netty-web/src/main/kotlin/cn/tursom/web/netty/ws/NettyWsHttpContent.kt @@ -0,0 +1,9 @@ +package cn.tursom.web.netty.ws + +import io.netty.channel.ChannelHandlerContext +import io.netty.handler.codec.http.FullHttpRequest + +class NettyWsHttpContent( + val ctx: ChannelHandlerContext, + val msg: FullHttpRequest +) \ No newline at end of file diff --git a/web/src/main/kotlin/cn/tursom/web/ws/TextWebSocketFrame.kt b/web/src/main/kotlin/cn/tursom/web/ws/TextWebSocketFrame.kt new file mode 100644 index 0000000..fdfa725 --- /dev/null +++ b/web/src/main/kotlin/cn/tursom/web/ws/TextWebSocketFrame.kt @@ -0,0 +1,5 @@ +package cn.tursom.web.ws + +interface TextWebSocketFrame : WebSocketFrame { + val text: String +} \ No newline at end of file diff --git a/web/src/main/kotlin/cn/tursom/web/ws/WebSocketContent.kt b/web/src/main/kotlin/cn/tursom/web/ws/WebSocketContent.kt new file mode 100644 index 0000000..00398f5 --- /dev/null +++ b/web/src/main/kotlin/cn/tursom/web/ws/WebSocketContent.kt @@ -0,0 +1,6 @@ +package cn.tursom.web.ws + +interface WebSocketContent { + val frame: WebSocketFrame + fun write(frame: WebSocketFrame) +} \ No newline at end of file diff --git a/web/src/main/kotlin/cn/tursom/web/ws/WebSocketFrame.kt b/web/src/main/kotlin/cn/tursom/web/ws/WebSocketFrame.kt new file mode 100644 index 0000000..0986c07 --- /dev/null +++ b/web/src/main/kotlin/cn/tursom/web/ws/WebSocketFrame.kt @@ -0,0 +1,7 @@ +package cn.tursom.web.ws + +import cn.tursom.core.buffer.ByteBuffer + +interface WebSocketFrame { + val data: ByteBuffer +} \ No newline at end of file diff --git a/web/src/main/kotlin/cn/tursom/web/ws/WebSocketHandler.kt b/web/src/main/kotlin/cn/tursom/web/ws/WebSocketHandler.kt new file mode 100644 index 0000000..5bfb546 --- /dev/null +++ b/web/src/main/kotlin/cn/tursom/web/ws/WebSocketHandler.kt @@ -0,0 +1,24 @@ +package cn.tursom.web.ws + +import cn.tursom.web.ExceptionContent +import cn.tursom.web.HttpHandler + +interface WebSocketHandler : HttpHandler { + override fun handle(content: WsHttpContent) { + val frame = content.frame + when (frame) { + is TextWebSocketFrame -> { + handle(content, frame) + } + else -> { + } + } + handle(content, frame) + } + + fun handle(content: WsHttpContent, frame: TextWebSocketFrame) { + } + + fun handle(content: WsHttpContent, frame: WebSocketFrame) { + } +} \ No newline at end of file