diff --git a/build.sbt b/build.sbt index 376a76ff..2d9057ac 100644 --- a/build.sbt +++ b/build.sbt @@ -802,6 +802,7 @@ val joex = project Dependencies.http4sDsl ++ Dependencies.circe ++ Dependencies.pureconfig ++ + Dependencies.pureconfigIp4s ++ Dependencies.emilTnef ++ Dependencies.poi ++ Dependencies.emilMarkdown ++ @@ -859,6 +860,7 @@ val restserver = project Dependencies.http4sDsl ++ Dependencies.circe ++ Dependencies.pureconfig ++ + Dependencies.pureconfigIp4s ++ Dependencies.yamusca ++ Dependencies.kittens ++ Dependencies.webjars, diff --git a/modules/joex/src/main/scala/docspell/joex/Config.scala b/modules/joex/src/main/scala/docspell/joex/Config.scala index 4601f9a0..5e3922ba 100644 --- a/modules/joex/src/main/scala/docspell/joex/Config.scala +++ b/modules/joex/src/main/scala/docspell/joex/Config.scala @@ -27,6 +27,8 @@ import docspell.pubsub.naive.PubSubConfig import docspell.scheduler.{PeriodicSchedulerConfig, SchedulerConfig} import docspell.store.{JdbcConfig, SchemaMigrateConfig} +import com.comcast.ip4s.{Host, Port} + case class Config( appId: Ident, baseUrl: LenientUri, @@ -59,7 +61,7 @@ case class Config( } object Config { - case class Bind(address: String, port: Int) + case class Bind(address: Host, port: Port) case class ScanMailbox(maxFolders: Int, mailChunkSize: Int, maxMails: Int) { def mailBatchSize: Int = diff --git a/modules/joex/src/main/scala/docspell/joex/ConfigFile.scala b/modules/joex/src/main/scala/docspell/joex/ConfigFile.scala index ac4c1b8a..f32378bb 100644 --- a/modules/joex/src/main/scala/docspell/joex/ConfigFile.scala +++ b/modules/joex/src/main/scala/docspell/joex/ConfigFile.scala @@ -18,6 +18,7 @@ import emil.MailAddress import emil.javamail.syntax._ import pureconfig._ import pureconfig.generic.auto._ +import pureconfig.module.ip4s._ import yamusca.imports._ object ConfigFile { diff --git a/modules/joex/src/main/scala/docspell/joex/JoexServer.scala b/modules/joex/src/main/scala/docspell/joex/JoexServer.scala index 36568b9f..e138ba38 100644 --- a/modules/joex/src/main/scala/docspell/joex/JoexServer.scala +++ b/modules/joex/src/main/scala/docspell/joex/JoexServer.scala @@ -6,7 +6,6 @@ package docspell.joex -import cats.effect.Ref import cats.effect._ import fs2.Stream import fs2.concurrent.SignallingRef @@ -19,8 +18,8 @@ import docspell.store.Store import docspell.store.records.RInternalSetting import org.http4s.HttpApp -import org.http4s.blaze.server.BlazeServerBuilder import org.http4s.ember.client.EmberClientBuilder +import org.http4s.ember.server.EmberServerBuilder import org.http4s.implicits._ import org.http4s.server.Router import org.http4s.server.middleware.Logger @@ -70,13 +69,15 @@ object JoexServer { Stream .resource(app) - .flatMap(app => - BlazeServerBuilder[F] - .bindHttp(cfg.bind.port, cfg.bind.address) - .withHttpApp(app.httpApp) - .withoutBanner - .serveWhile(app.termSig, app.exitRef) - ) - + .flatMap { app => + Stream.resource { + EmberServerBuilder + .default[F] + .withHost(cfg.bind.address) + .withPort(cfg.bind.port) + .withHttpApp(app.httpApp) + .build + } + } }.drain } diff --git a/modules/restserver/src/main/scala/docspell/restserver/Config.scala b/modules/restserver/src/main/scala/docspell/restserver/Config.scala index 799acf9b..0bb5fd06 100644 --- a/modules/restserver/src/main/scala/docspell/restserver/Config.scala +++ b/modules/restserver/src/main/scala/docspell/restserver/Config.scala @@ -18,7 +18,7 @@ import docspell.restserver.Config.{DownloadAllCfg, OpenIdConfig, ServerOptions} import docspell.restserver.auth.OpenId import docspell.restserver.http4s.InternalHeader -import com.comcast.ip4s.IpAddress +import com.comcast.ip4s.{Host, IpAddress, Port} case class Config( appName: String, @@ -63,7 +63,7 @@ object Config { enableHttp2: Boolean, maxConnections: Int ) - case class Bind(address: String, port: Int) + case class Bind(address: Host, port: Port) case class AdminEndpoint(secret: String) diff --git a/modules/restserver/src/main/scala/docspell/restserver/ConfigFile.scala b/modules/restserver/src/main/scala/docspell/restserver/ConfigFile.scala index 081b34bc..58d3b9ca 100644 --- a/modules/restserver/src/main/scala/docspell/restserver/ConfigFile.scala +++ b/modules/restserver/src/main/scala/docspell/restserver/ConfigFile.scala @@ -21,6 +21,7 @@ import docspell.store.Db import pureconfig._ import pureconfig.generic.auto._ +import pureconfig.module.ip4s._ import scodec.bits.ByteVector object ConfigFile { diff --git a/modules/restserver/src/main/scala/docspell/restserver/RestServer.scala b/modules/restserver/src/main/scala/docspell/restserver/RestServer.scala index 5727be0d..3b3a8755 100644 --- a/modules/restserver/src/main/scala/docspell/restserver/RestServer.scala +++ b/modules/restserver/src/main/scala/docspell/restserver/RestServer.scala @@ -24,9 +24,9 @@ import docspell.store.Store import docspell.store.records.RInternalSetting import org.http4s._ -import org.http4s.blaze.server.BlazeServerBuilder import org.http4s.dsl.Http4sDsl import org.http4s.ember.client.EmberClientBuilder +import org.http4s.ember.server.EmberServerBuilder import org.http4s.headers.Location import org.http4s.implicits._ import org.http4s.server.Router @@ -56,20 +56,27 @@ object RestServer { Stream( restApp.subscriptions, restApp.eventConsume(2), - BlazeServerBuilder[F] - .bindHttp(cfg.bind.port, cfg.bind.address) - .withoutBanner - .withResponseHeaderTimeout(cfg.serverOptions.responseTimeout.toScala) - .enableHttp2(cfg.serverOptions.enableHttp2) - .withMaxConnections(cfg.serverOptions.maxConnections) - .withHttpWebSocketApp( - createHttpApp(setting, pubSub, restApp) - ) - .serve - .drain + Stream.resource { + if (cfg.serverOptions.enableHttp2) + EmberServerBuilder + .default[F] + .withHost(cfg.bind.address) + .withPort(cfg.bind.port) + .withMaxConnections(cfg.serverOptions.maxConnections) + .withHttpWebSocketApp(createHttpApp(setting, pubSub, restApp)) + .withHttp2 + .build + else + EmberServerBuilder + .default[F] + .withHost(cfg.bind.address) + .withPort(cfg.bind.port) + .withMaxConnections(cfg.serverOptions.maxConnections) + .withHttpWebSocketApp(createHttpApp(setting, pubSub, restApp)) + .build + } ) } - exit <- (server ++ Stream(keepAlive)).parJoinUnbounded.compile.drain.as(ExitCode.Success) } yield exit diff --git a/modules/restserver/src/main/scala/docspell/restserver/http4s/ClientRequestInfo.scala b/modules/restserver/src/main/scala/docspell/restserver/http4s/ClientRequestInfo.scala index 8d962b78..5fe55ea5 100644 --- a/modules/restserver/src/main/scala/docspell/restserver/http4s/ClientRequestInfo.scala +++ b/modules/restserver/src/main/scala/docspell/restserver/http4s/ClientRequestInfo.scala @@ -20,7 +20,7 @@ import org.typelevel.ci.CIString object ClientRequestInfo { def getBaseUrl[F[_]](cfg: Config, req: Request[F]): LenientUri = - if (cfg.baseUrl.isLocal) getBaseUrl(req, cfg.bind.port).getOrElse(cfg.baseUrl) + if (cfg.baseUrl.isLocal) getBaseUrl(req, cfg.bind.port.value).getOrElse(cfg.baseUrl) else cfg.baseUrl private def getBaseUrl[F[_]](req: Request[F], serverPort: Int): Option[LenientUri] = diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 302497a9..daed5e41 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -251,7 +251,7 @@ object Dependencies { ) val http4sServer = Seq( - "org.http4s" %% "http4s-blaze-server" % "0.23.14" + "org.http4s" %% "http4s-ember-server" % Http4sVersion ) val circeCore = Seq( @@ -277,6 +277,10 @@ object Dependencies { "com.github.pureconfig" %% "pureconfig" % PureConfigVersion ) + val pureconfigIp4s = Seq( + "com.github.pureconfig" %% "pureconfig-ip4s" % PureConfigVersion + ) + // https://github.com/h2database/h2database // MPL 2.0 or EPL 1.0 val h2 = Seq(