Hello 👋
I'd like to report a behavior. It might not be considered as a bug but it makes developer life a bit more complicated.
To summarize, if I use this kind of code:
fun main(){
val server = Server.builder().apply {
service("/foo") { ctx, req -> HttpResponse.of("Hello foo")}
}
.http(0)
.build()
server.closeOnJvmShutdown()
server.start().join()
}
It works perfectly and reports a specific port used at startup, like this:
SLF4J(I): Connected with provider of type [ch.qos.logback.classic.spi.LogbackServiceProvider]
08:13:50.854 [armeria-boss-http-*:51313] INFO -- Serving HTTP at /[0:0:0:0:0:0:0:0]:51313 - http://127.0.0.1:51313/
And if I use multiple ports:
SLF4J(I): Connected with provider of type [ch.qos.logback.classic.spi.LogbackServiceProvider]
08:18:39.446 [armeria-boss-http-*:51461] INFO -- Serving HTTP at /[0:0:0:0:0:0:0:0]:51461 - http://127.0.0.1:51461/
08:18:39.448 [armeria-boss-http-*:51462] INFO -- Serving HTTP at /[0:0:0:0:0:0:0:0]:51462 - http://127.0.0.1:51462/
This is very handy, especially in test setup when I want to avoid conflicting port usage in CI.
But, my business case led me to a situation where I have to consider per-port service. For that, we used the VirtualHost feature, but this one is incompatible with random port selection if set to 0.
See, the following code works:
val isRandomPort = System.getenv("IS_RANDOM_PORT").toBooleanStrict()
fun main(){
val firstHost = if (isRandomPort) 0 else 8080
val secondHost = if (isRandomPort) 0 else 8081
val server = Server.builder().apply {
http(firstHost)
virtualHost(firstHost).apply {
service("/foo") { ctx, req -> HttpResponse.of("Hello, foo!")}
}
http(secondHost)
virtualHost(secondHost).apply {
service("/bar") { ctx, req -> HttpResponse.of("Hello, bar!")}
}
}
.build()
server.closeOnJvmShutdown()
server.start().join()
}
But I can't anymore use the random port feature. because they'll both be with 0 and the virtualHost mechanism won't work, with the following error:
> Task :server:run FAILED
SLF4J(I): Connected with provider of type [ch.qos.logback.classic.spi.LogbackServiceProvider]
Exception in thread "main" java.lang.IllegalArgumentException: port: 0 (expected: 1-65535)
at com.linecorp.armeria.internal.shaded.guava.base.Preconditions.checkArgument(Preconditions.java:191)
at com.linecorp.armeria.server.ServerBuilder.virtualHost(ServerBuilder.java:1734)
at com.gitlab.davinkevin.experimentations.armeria.grpc.MainKt.main(Main.kt:15)
at com.gitlab.davinkevin.experimentations.armeria.grpc.MainKt.main(Main.kt)
FAILURE: Build failed with an exception.
Is there a solution to still leverage the random port feature, almost crucial in CI and being compatible with virtualHost? Maybe something like virtualHost(ServerPort s) where s should be the exact same object provided to the port(…) method.
Thank you for your help,
Hello 👋
I'd like to report a behavior. It might not be considered as a bug but it makes developer life a bit more complicated.
To summarize, if I use this kind of code:
It works perfectly and reports a specific port used at startup, like this:
And if I use multiple ports:
This is very handy, especially in test setup when I want to avoid conflicting port usage in CI.
But, my business case led me to a situation where I have to consider per-port service. For that, we used the
VirtualHostfeature, but this one is incompatible withrandomport selection if set to 0.See, the following code works:
But I can't anymore use the
randomport feature. because they'll both be with0and thevirtualHostmechanism won't work, with the following error:Is there a solution to still leverage the random port feature, almost crucial in CI and being compatible with
virtualHost? Maybe something likevirtualHost(ServerPort s)wheresshould be the exact same object provided to theport(…)method.Thank you for your help,