Skip to content

Commit 4a58c04

Browse files
committed
release: 2.5.0
update netty to 4.2.7
1 parent be24eb9 commit 4a58c04

File tree

7 files changed

+132
-134
lines changed

7 files changed

+132
-134
lines changed

build.gradle.kts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ val authorName = "ccbluex"
1111
val projectUrl = "https://github.com/ccbluex/netty-httpserver"
1212

1313
group = "net.ccbluex"
14-
version = "2.4.4"
14+
version = "2.5.0"
1515

1616
repositories {
1717
mavenCentral()
@@ -35,8 +35,9 @@ dependencies {
3535

3636
testImplementation(kotlin("test"))
3737
testImplementation(libs.coroutines.test)
38-
testImplementation("com.squareup.retrofit2:retrofit:2.9.0")
39-
testImplementation("com.squareup.retrofit2:converter-gson:2.9.0")
38+
testImplementation(libs.okhttp)
39+
testImplementation(libs.retrofit.core)
40+
testImplementation(libs.retrofit.gson)
4041
}
4142

4243
tasks.test {

gradle/libs.versions.toml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,17 @@
22
# https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core
33
log4j = "2.23.1"
44
# https://mvnrepository.com/artifact/io.netty/netty-all
5-
netty = "4.1.118.Final"
5+
netty = "4.2.7.Final" # 1.21.11+
66
# https://mvnrepository.com/artifact/com.google.code.gson/gson
77
gson = "2.10.1"
88
# https://mvnrepository.com/artifact/org.apache.tika/tika-core
99
tika = "3.2.3"
1010
# https://central.sonatype.com/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-test/overview
1111
kotlinx_coroutines_version = "1.10.2"
12+
# https://mvnrepository.com/artifact/com.squareup.retrofit2/retrofit
13+
retrofit = "2.12.0"
14+
# https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp
15+
okhttp = "4.12.0"
1216

1317
[libraries]
1418
coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinx_coroutines_version" }
@@ -20,6 +24,10 @@ netty-epoll-classes = { module = "io.netty:netty-transport-classes-epoll", versi
2024
gson = { module = "com.google.code.gson:gson", version.ref = "gson" }
2125
tika-core = { module = "org.apache.tika:tika-core", version.ref = "tika" }
2226

27+
retrofit-core = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" }
28+
okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" }
29+
retrofit-gson = { module = "com.squareup.retrofit2:converter-gson", version.ref = "retrofit" }
30+
2331
[bundles]
2432
netty = [
2533
"netty-codec-http",

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ import net.ccbluex.netty.http.coroutines.syncSuspend
3333
import net.ccbluex.netty.http.middleware.Middleware
3434
import net.ccbluex.netty.http.rest.Node
3535
import net.ccbluex.netty.http.rest.RouteController
36-
import net.ccbluex.netty.http.util.TransportType
36+
import net.ccbluex.netty.http.util.setup
3737
import net.ccbluex.netty.http.websocket.WebSocketController
3838
import org.apache.logging.log4j.LogManager
3939
import java.net.InetSocketAddress
@@ -81,7 +81,7 @@ class HttpServer {
8181
suspend fun start(port: Int, useNativeTransport: Boolean = true): Int = lock.withLock {
8282
val b = ServerBootstrap()
8383

84-
val groups = TransportType.apply(b, useNativeTransport)
84+
val groups = b.setup(useNativeTransport)
8585
bossGroup = groups.first
8686
workerGroup = groups.second
8787

src/main/kotlin/net/ccbluex/netty/http/util/TransportDetector.kt

Lines changed: 0 additions & 99 deletions
This file was deleted.
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
/*
2+
* This file is part of Netty-Rest (https://github.com/CCBlueX/netty-rest)
3+
*
4+
* Copyright (c) 2024 CCBlueX
5+
*
6+
* LiquidBounce is free software: you can redistribute it and/or modify
7+
* it under the terms of the GNU General Public License as published by
8+
* the Free Software Foundation, either version 3 of the License, or
9+
* (at your option) any later version.
10+
*
11+
* Netty-Rest is distributed in the hope that it will be useful,
12+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
* GNU General Public License for more details.
15+
*
16+
* You should have received a copy of the GNU General Public License
17+
* along with Netty-Rest. If not, see <https://www.gnu.org/licenses/>.
18+
*
19+
*/
20+
package net.ccbluex.netty.http.util
21+
22+
import io.netty.bootstrap.ServerBootstrap
23+
import io.netty.channel.ChannelFactory
24+
import io.netty.channel.EventLoopGroup
25+
import io.netty.channel.IoHandlerFactory
26+
import io.netty.channel.MultiThreadIoEventLoopGroup
27+
import io.netty.channel.ServerChannel
28+
import io.netty.channel.epoll.Epoll
29+
import io.netty.channel.epoll.EpollIoHandler
30+
import io.netty.channel.epoll.EpollServerSocketChannel
31+
import io.netty.channel.kqueue.KQueue
32+
import io.netty.channel.kqueue.KQueueIoHandler
33+
import io.netty.channel.kqueue.KQueueServerSocketChannel
34+
import io.netty.channel.nio.NioIoHandler
35+
import io.netty.channel.socket.nio.NioServerSocketChannel
36+
import net.ccbluex.netty.http.util.TransportType.EPOLL
37+
import net.ccbluex.netty.http.util.TransportType.KQUEUE
38+
import net.ccbluex.netty.http.util.TransportType.NIO
39+
40+
internal enum class TransportType(
41+
val serverChannelFactory: ChannelFactory<out ServerChannel>,
42+
) {
43+
NIO(::NioServerSocketChannel) {
44+
override val isAvailable get() = true
45+
override val ioHandlerFactory: IoHandlerFactory = NioIoHandler.newFactory()
46+
},
47+
48+
EPOLL(::EpollServerSocketChannel) {
49+
override val isAvailable get() = try {
50+
Epoll.isAvailable()
51+
} catch (_: Throwable) { false }
52+
override val ioHandlerFactory: IoHandlerFactory get() = EpollIoHandler.newFactory()
53+
},
54+
55+
KQUEUE(::KQueueServerSocketChannel) {
56+
override val isAvailable get() = try {
57+
KQueue.isAvailable()
58+
} catch (_: Throwable) { false }
59+
override val ioHandlerFactory: IoHandlerFactory get() = KQueueIoHandler.newFactory()
60+
};
61+
62+
abstract val isAvailable: Boolean
63+
64+
abstract val ioHandlerFactory: IoHandlerFactory
65+
}
66+
67+
private val available by lazy {
68+
arrayOf(EPOLL, KQUEUE, NIO).first { it.isAvailable }
69+
}
70+
71+
/**
72+
* Set the channel factory and event loop groups for the given server bootstrap.
73+
*
74+
* @receiver The server bootstrap to configure.
75+
* @param useNativeTransport Whether to use native transport (Epoll or KQueue).
76+
*
77+
* @return Parent and child group.
78+
*/
79+
@JvmOverloads
80+
fun ServerBootstrap.setup(useNativeTransport: Boolean = true): Pair<EventLoopGroup, EventLoopGroup> {
81+
val type = if (useNativeTransport) available else NIO
82+
83+
val parentGroup = MultiThreadIoEventLoopGroup(1, type.ioHandlerFactory)
84+
val childGroup = MultiThreadIoEventLoopGroup(type.ioHandlerFactory)
85+
group(parentGroup, childGroup)
86+
.channelFactory(type.serverChannelFactory)
87+
return parentGroup to childGroup
88+
}

src/test/kotlin/HttpMiddlewareServerTest.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,9 @@ class HttpMiddlewareServerTest {
112112
@Test
113113
fun testRootEndpoint() {
114114
val response = makeRequest("/")
115-
assertEquals(200, response.code(), "Expected status code 200")
115+
assertEquals(200, response.code, "Expected status code 200")
116116

117-
val responseBody = response.body()?.string()
117+
val responseBody = response.body?.string()
118118
assertNotNull(responseBody, "Response body should not be null")
119119

120120
assertTrue(responseBody.contains("Hello, World!"), "Response should contain 'Hello, World!'")
@@ -127,9 +127,9 @@ class HttpMiddlewareServerTest {
127127
@Test
128128
fun testRootEndpointWithQueryParam() {
129129
val response = makeRequest("/?param1=value1&param2=value2")
130-
assertEquals(200, response.code(), "Expected status code 200")
130+
assertEquals(200, response.code, "Expected status code 200")
131131

132-
val responseBody = response.body()?.string()
132+
val responseBody = response.body?.string()
133133
assertNotNull(responseBody, "Response body should not be null")
134134

135135
assertTrue(responseBody.contains("Hello, World!"), "Response should contain 'Hello, World!'")
@@ -150,13 +150,13 @@ class HttpMiddlewareServerTest {
150150
override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
151151
assertIs<ProtocolException>(t)
152152
assertNotNull(response)
153-
assertEquals(HttpResponseStatus.BAD_REQUEST.code(), response.code())
153+
assertEquals(HttpResponseStatus.BAD_REQUEST.code(), response.code)
154154
val exceptedResponseBody = httpBadRequest("WebSocket unsupported")
155155
val buffer = Buffer()
156156
buffer.write(exceptedResponseBody.content().nioBuffer())
157157
assertEquals(
158158
buffer.readUtf8(),
159-
response.body()!!.string()
159+
response.body!!.string()
160160
)
161161
future.complete(true)
162162
}

0 commit comments

Comments
 (0)