|
@@ -1,18 +1,20 @@
|
|
|
package http4s.techempower.benchmark
|
|
|
|
|
|
import org.http4s._
|
|
|
-import org.http4s.server._
|
|
|
+import org.http4s.circe._
|
|
|
import org.http4s.dsl._
|
|
|
-import org.http4s.argonaut._
|
|
|
+import org.http4s.server._
|
|
|
import org.http4s.server.blaze.BlazeBuilder
|
|
|
import org.http4s.twirl._
|
|
|
import headers._
|
|
|
|
|
|
-import _root_.argonaut._, Argonaut._, Shapeless._
|
|
|
-
|
|
|
import doobie.contrib.hikari.hikaritransactor._
|
|
|
import doobie.imports._
|
|
|
|
|
|
+import io.circe._
|
|
|
+import io.circe.generic.auto._
|
|
|
+import io.circe.syntax._
|
|
|
+
|
|
|
import scalaz._
|
|
|
import scalaz.concurrent.{Task, TaskApp}
|
|
|
import scalaz.std.list._
|
|
@@ -29,7 +31,6 @@ object Middleware {
|
|
|
Service.lift { req: Request =>
|
|
|
service.map { resp =>
|
|
|
resp.putHeaders(
|
|
|
- headers.Date(DateTime.now),
|
|
|
Header("Server", req.serverAddr)
|
|
|
)
|
|
|
}.apply(req)
|
|
@@ -54,8 +55,24 @@ object Queries extends OptionalValidatingQueryParamDecoderMatcher[Int]("queries"
|
|
|
}
|
|
|
|
|
|
object WebServer extends TaskApp {
|
|
|
- def xaTask(host: String) =
|
|
|
- HikariTransactor[Task]("org.postgresql.Driver", s"jdbc:postgresql://$host/hello_world", "benchmarkdbuser", "benchmarkdbpass")
|
|
|
+ implicit def jsonEncoder[A](implicit encoder: Encoder[A]) = jsonEncoderOf[A](encoder)
|
|
|
+
|
|
|
+ def xaTask(host: String) = {
|
|
|
+ val driver = "org.postgresql.Driver"
|
|
|
+ val url = s"jdbc:postgresql://$host/hello_world"
|
|
|
+ val user = "benchmarkdbuser"
|
|
|
+ val pass = "benchmarkdbpass"
|
|
|
+ val maxPoolSize = 256
|
|
|
+ val minIdle = 256
|
|
|
+
|
|
|
+ for {
|
|
|
+ xa <- HikariTransactor[Task](driver, url, user, pass)
|
|
|
+ _ <- xa.configure(ds => Task.delay {
|
|
|
+ ds.setMaximumPoolSize(maxPoolSize)
|
|
|
+ ds.setMinimumIdle(minIdle)
|
|
|
+ })
|
|
|
+ } yield xa
|
|
|
+ }
|
|
|
|
|
|
// Provide a random number between 1 and 10000 (inclusive)
|
|
|
val randomWorldId: Task[Int] = Task.delay(ThreadLocalRandom.current.nextInt(1, 10001))
|
|
@@ -112,14 +129,14 @@ object WebServer extends TaskApp {
|
|
|
// HTTP service definition
|
|
|
def service(xa: Transactor[Task]) = HttpService {
|
|
|
case GET -> Root / "json" =>
|
|
|
- Ok(Json("message" -> jString("Hello, World!")))
|
|
|
+ Ok(Json.obj("message" -> Json.string("Hello, World!")))
|
|
|
|
|
|
case GET -> Root / "db" =>
|
|
|
- Ok(selectRandomWorld(xa).map(_.asJson))
|
|
|
+ Ok(selectRandomWorld(xa))
|
|
|
|
|
|
case GET -> Root / "queries" :? Queries(rawQueries) =>
|
|
|
val numQueries = Queries.clampQueries(rawQueries)
|
|
|
- Ok(getWorlds(xa, numQueries).map(_.asJson))
|
|
|
+ Ok(getWorlds(xa, numQueries))
|
|
|
|
|
|
case GET -> Root / "fortunes" =>
|
|
|
val page = for {
|
|
@@ -138,7 +155,7 @@ object WebServer extends TaskApp {
|
|
|
_ <- updateWorlds(xa, newWorlds)
|
|
|
} yield newWorlds
|
|
|
|
|
|
- Ok(updated.map(_.asJson))
|
|
|
+ Ok(updated)
|
|
|
|
|
|
case GET -> Root / "plaintext" =>
|
|
|
Ok("Hello, World!")
|
|
@@ -156,10 +173,9 @@ object WebServer extends TaskApp {
|
|
|
}
|
|
|
|
|
|
// Entry point when starting service
|
|
|
- override val runc: Task[Unit] = {
|
|
|
+ override def runl(args: List[String]): Task[Unit] = {
|
|
|
for {
|
|
|
- dbHost <- Task.delay(System.getProperty("DBHOST", "localhost"))
|
|
|
- xa <- xaTask(dbHost)
|
|
|
+ xa <- xaTask(args.head)
|
|
|
server <- startServer(Middleware.addHeaders(service(xa)))
|
|
|
} yield ()
|
|
|
}
|