11package de.binarynoise.captiveportalautologin.portalproxy
22
3- import kotlin .coroutines.EmptyCoroutineContext
3+ import kotlinx .coroutines.Dispatchers
44import kotlinx.coroutines.launch
5- import de.binarynoise.captiveportalautologin.portalproxy.portal.portalHost
5+ import de.binarynoise.captiveportalautologin.portalproxy.portal.portalPort
66import de.binarynoise.captiveportalautologin.portalproxy.portal.portalRouter
77import de.binarynoise.captiveportalautologin.portalproxy.proxy.forward
88import de.binarynoise.captiveportalautologin.portalproxy.proxy.forwardConnect
9+ import de.binarynoise.captiveportalautologin.portalproxy.proxy.proxyPort
910import de.binarynoise.logger.Logger
1011import de.binarynoise.logger.Logger.log
1112import io.vertx.core.Vertx
@@ -14,26 +15,31 @@ import io.vertx.core.http.HttpServerRequest
1415import io.vertx.ext.web.Router
1516import io.vertx.kotlin.coroutines.CoroutineVerticle
1617import io.vertx.kotlin.coroutines.coAwait
17- import io.vertx.kotlin.coroutines.dispatcher
1818
1919class MainVerticle : CoroutineVerticle () {
2020 override suspend fun start () {
21- val router = Router .router(vertx)
2221
2322 // Portal routes
24- router.route().virtualHost(portalHost).handler { ctx ->
23+ val portalRouter = Router .router(vertx)
24+ portalRouter.route().handler { ctx ->
2525 log(" route portal" )
2626 ctx.next()
2727 }.subRouter(portalRouter(vertx))
2828
2929 // Proxy routes
30- router.route().handler { ctx ->
30+ val proxyRouter = Router .router(vertx)
31+ proxyRouter.route().handler { ctx ->
3132 log(" route /http" )
32- forward(ctx.request())
33+ val request = ctx.request()
34+ if (request.authority().port() == portalPort) {
35+ portalRouter.handle(request)
36+ } else {
37+ forward(request)
38+ }
3339 }
3440
35- val requestHandler : (HttpServerRequest ) -> Unit = { request ->
36- launch(vertx.dispatcher() + EmptyCoroutineContext ) {
41+ val proxyRequestHandler : (HttpServerRequest ) -> Unit = { request ->
42+ launch(Dispatchers . IO ) {
3743 log(buildString {
3844 append(" < " )
3945 append(request.method())
@@ -42,9 +48,9 @@ class MainVerticle : CoroutineVerticle() {
4248 append(" -> " )
4349 append(request.scheme())
4450 append(" " )
45- append(request.authority().host())
51+ append(request.authority()? .host())
4652 append(" : " )
47- append(request.authority().port())
53+ append(request.authority()? .port())
4854 append(" " )
4955 append(request.path())
5056 append(" from " )
@@ -56,7 +62,7 @@ class MainVerticle : CoroutineVerticle() {
5662 if (request.method() == HttpMethod .CONNECT ) {
5763 forwardConnect(request, vertx)
5864 } else {
59- router .handle(request)
65+ proxyRouter .handle(request)
6066 }
6167
6268 log(buildString {
@@ -71,26 +77,36 @@ class MainVerticle : CoroutineVerticle() {
7177 }
7278 }
7379
80+ val portalRequestHandler: (HttpServerRequest ) -> Unit = { request ->
81+ portalRouter.handle(request)
82+ }
83+
7484 val exceptionHandler = { t: Throwable ->
7585 log(" Unhandled exception during connection" , t)
7686 }
77- val invalidRequestHandler = { r: HttpServerRequest ->
78- log(" Invalid request: $r " )
79- }
8087
81- val server = vertx.createHttpServer()
82- .requestHandler(requestHandler )
88+ val proxyServer = vertx.createHttpServer()
89+ .requestHandler(proxyRequestHandler )
8390 .exceptionHandler(exceptionHandler)
84- .invalidRequestHandler(invalidRequestHandler)
85- .listen(8000 , " ::" )
91+ .listen(proxyPort, " 0.0.0.0" )
8692 .coAwait()
87- log(" Started server on port " + server.actualPort())
93+ log(" Started proxy server on port " + proxyServer.actualPort())
94+
95+ val portalServer = vertx.createHttpServer()
96+ .requestHandler(portalRequestHandler)
97+ .exceptionHandler(exceptionHandler)
98+ .listen(portalPort, " 0.0.0.0" )
99+ .coAwait()
100+ log(" Started portal server on port " + portalServer.actualPort())
88101 }
89102}
90103
91104fun main () {
92105 Logger .Config .debugDump = true
93106
107+ // disable ipv6 so entries in the portal database are deterministic for dual stack clients
108+ System .setProperty(" java.net.preferIPv4Stack" , " true" )
109+
94110 val vertx = Vertx .builder()/* .withTracer { o -> DebugTracer() }*/ .build()
95111 vertx.exceptionHandler { e ->
96112 log(" Unhandled exception" , e)
0 commit comments