Main.scala 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. import zhttp.http._
  2. import zhttp.service.Server
  3. import zio.{App, ExitCode, URIO}
  4. import com.github.plokhotnyuk.jsoniter_scala.macros._
  5. import com.github.plokhotnyuk.jsoniter_scala.core._
  6. import zhttp.http.Response
  7. import java.time.format.DateTimeFormatter
  8. import java.time.{Instant, ZoneOffset}
  9. case class Message(message: String)
  10. object Main extends App {
  11. val message: String = "Hello, World!"
  12. implicit val codec: JsonValueCodec[Message] = JsonCodecMaker.make
  13. val app: Http[Any, HttpError, Request, Response] = Http.collect[Request] {
  14. case Method.GET -> Root / "plaintext" =>
  15. Response.http(
  16. content = HttpContent.Complete(message),
  17. headers = Header.contentTypeTextPlain :: headers(),
  18. )
  19. case Method.GET -> Root / "json" =>
  20. Response.http(
  21. content = HttpContent.Complete(writeToString(Message(message))),
  22. headers = Header.contentTypeJson :: headers(),
  23. )
  24. }
  25. override def run(args: List[String]): URIO[zio.ZEnv, ExitCode] = Server.start(8080, app).exitCode
  26. val formatter: DateTimeFormatter = DateTimeFormatter.RFC_1123_DATE_TIME.withZone(ZoneOffset.UTC)
  27. val constantHeaders: List[Header] = Header("server", "zio-http") :: Nil
  28. @volatile var lastHeaders: (Long, List[Header]) = (0, Nil)
  29. def headers(): List[Header] = {
  30. val t = System.currentTimeMillis()
  31. if (t - lastHeaders._1 >= 1000)
  32. lastHeaders = (t, Header("date", formatter.format(Instant.ofEpochMilli(t))) :: constantHeaders)
  33. lastHeaders._2
  34. }
  35. }