Main.scala 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import java.time.format.DateTimeFormatter
  2. import java.time.{Instant, ZoneOffset}
  3. import com.twitter.io.Buf
  4. import com.twitter.finagle.http.Response
  5. import com.twitter.finagle.Http
  6. import com.twitter.finagle.stats.NullStatsReceiver
  7. import com.twitter.finagle.tracing.NullTracer
  8. import com.twitter.util.Await
  9. import io.circe.Json
  10. import io.finch._
  11. import io.finch.circe._
  12. object Main extends App {
  13. val timeFormatter: DateTimeFormatter =
  14. DateTimeFormatter.RFC_1123_DATE_TIME.withZone(ZoneOffset.UTC)
  15. val helloWorld: Buf = Buf.Utf8("Hello, World!")
  16. val json: Endpoint[Json] = get("json") {
  17. Ok(Json.obj("message" -> Json.fromString("Hello, World!")))
  18. .withHeader("Server" -> "Finch")
  19. .withHeader("Date" -> timeFormatter.format(Instant.now()))
  20. }
  21. // Downgrade a text/plain endpoint to `Endpoint[Response]` as per
  22. // https://github.com/finagle/finch/blob/master/docs/cookbook.md#serving-multiple-content-types
  23. val plaintext: Endpoint[Response] = get("plaintext") {
  24. val rep = Response()
  25. rep.content = helloWorld
  26. rep.contentType = "text/plain"
  27. rep.headerMap.set("Server", "Finch")
  28. rep.headerMap.set("Date", timeFormatter.format(Instant.now()))
  29. Ok(rep)
  30. }
  31. Await.ready(Http.server
  32. .withCompressionLevel(0)
  33. .withStatsReceiver(NullStatsReceiver)
  34. .withTracer(NullTracer)
  35. .serve(":9000", (json :+: plaintext).toServiceAs[Application.Json])
  36. )
  37. }