Skip to content

Commit fae246e

Browse files
committed
refactor(middleware): read and respond request
1 parent 4017dad commit fae246e

File tree

4 files changed

+26
-25
lines changed

4 files changed

+26
-25
lines changed

src/main/kotlin/net/ccbluex/netty/http/HttpServerHandler.kt

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,13 @@ internal class HttpServerHandler(private val server: HttpServer) : ChannelInboun
6868
if (connection.equals("Upgrade", ignoreCase = true) &&
6969
upgrade.equals("WebSocket", ignoreCase = true)) {
7070

71-
if (server.middlewares.any {
72-
it is Middleware.OnWebSocketUpgrade && !it.invoke(ctx, msg)
73-
}) return
71+
server.middlewares.filterIsInstance<Middleware.OnWebSocketUpgrade>().forEach { middleware ->
72+
val response = middleware.invoke(ctx, msg)
73+
if (response != null) {
74+
ctx.writeAndFlush(response)
75+
return
76+
}
77+
}
7478

7579
// Takes out Http Request Handler from the pipeline and replaces it with WebSocketHandler
7680
ctx.pipeline().replace(this, "websocketHandler", WebSocketHandler(server))
@@ -95,11 +99,7 @@ internal class HttpServerHandler(private val server: HttpServer) : ChannelInboun
9599
URLDecoder.decode(msg.uri(), Charsets.UTF_8),
96100
msg.headers().associate { it.key to it.value },
97101
)
98-
99-
if (server.middlewares.any {
100-
it is Middleware.OnRequestStart && !it.invoke(ctx, msg, requestContext)
101-
}) return
102-
102+
103103
localRequestContext.set(requestContext)
104104
}
105105
}
@@ -119,12 +119,17 @@ internal class HttpServerHandler(private val server: HttpServer) : ChannelInboun
119119
if (msg is LastHttpContent) {
120120
localRequestContext.remove()
121121

122-
var response = server.processRequestContext(requestContext)
123-
server.middlewares.forEach {
124-
if (it is Middleware.OnFullHttpResponse) {
125-
response = it.invoke(requestContext, response)
122+
server.middlewares.filterIsInstance<Middleware.OnRequest>().forEach { middleware ->
123+
val response = middleware.invoke(requestContext)
124+
if (response != null) {
125+
ctx.writeAndFlush(response)
126+
return
126127
}
127128
}
129+
var response = server.processRequestContext(requestContext)
130+
server.middlewares.filterIsInstance<Middleware.OnResponse>().forEach { middleware ->
131+
response = middleware.invoke(requestContext, response)
132+
}
128133
ctx.writeAndFlush(response)
129134
}
130135
}

src/main/kotlin/net/ccbluex/netty/http/middleware/CorsMiddleware.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class CorsMiddleware(
2424
listOf("GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS"),
2525
private val allowedHeaders: List<String> =
2626
listOf("Content-Type", "Content-Length", "Authorization", "Accept", "X-Requested-With")
27-
): Middleware.OnFullHttpResponse {
27+
): Middleware.OnResponse {
2828

2929
/**
3030
* Middleware to handle CORS requests.

src/main/kotlin/net/ccbluex/netty/http/middleware/Middleware.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,19 +27,19 @@ import net.ccbluex.netty.http.model.RequestContext
2727
sealed interface Middleware {
2828
fun interface OnWebSocketUpgrade : Middleware {
2929
/**
30-
* @return if it's accepted
30+
* @return null, when accepted.
3131
*/
32-
operator fun invoke(ctx: ChannelHandlerContext, request: HttpRequest): Boolean
32+
operator fun invoke(ctx: ChannelHandlerContext, request: HttpRequest): FullHttpResponse?
3333
}
3434

35-
fun interface OnRequestStart : Middleware {
35+
fun interface OnRequest : Middleware {
3636
/**
37-
* @return if it's accepted
37+
* @return null, to continue processing the request.
3838
*/
39-
operator fun invoke(ctx: ChannelHandlerContext, request: HttpRequest, requestContext: RequestContext): Boolean
39+
operator fun invoke(context: RequestContext): FullHttpResponse?
4040
}
4141

42-
fun interface OnFullHttpResponse : Middleware {
42+
fun interface OnResponse : Middleware {
4343
operator fun invoke(context: RequestContext, response: FullHttpResponse): FullHttpResponse
4444
}
4545
}

src/test/kotlin/HttpMiddlewareServerTest.kt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ class HttpMiddlewareServerTest {
6565
get("/", ::static)
6666
}
6767

68-
server.middleware(Middleware.OnFullHttpResponse { requestContext, fullHttpResponse ->
68+
server.middleware(Middleware.OnResponse { requestContext, fullHttpResponse ->
6969
// Add custom headers to the response
7070
fullHttpResponse.headers().add("X-Custom-Header", "Custom Value")
7171

@@ -77,11 +77,7 @@ class HttpMiddlewareServerTest {
7777

7878
fullHttpResponse
7979
}).middleware(Middleware.OnWebSocketUpgrade { context, _ ->
80-
context.writeAndFlush(
81-
httpBadRequest("WebSocket unsupported")
82-
)
83-
84-
false
80+
httpBadRequest("WebSocket unsupported")
8581
})
8682

8783
server.start(8080) // Start the server on port 8080

0 commit comments

Comments
 (0)