📖

[http4s] レスポンスを返したあとに処理をする

2024/09/06に公開

やりたいこと

環境

  • Scala: 3.4.2
  • http4s: 0.23.27

実装

Response[F]のbodyがfs2.io.Streamなので、onFinalizeで混ぜ込む

def route: HttpRoutes[IO] =
    HttpRoutes.of[IO] { case GET -> Root / "download-file" =>
      val file: java.io.File = ??? // ファイルを用意する
      val fs2Path = fs2.io.file.Path.fromNioPath(file.toPath)

      StaticFile
        .fromPath[IO](fs2Path)
        .getOrElseF(NotFound("ファイルが見つかりませんでした")) // fromPathでfileが見つからなかった場合の処理
        .map { response =>
          response.withBodyStream(
            response.body.onFinalize(IO(file.delete()).void) // bodyのStream処理が終わった後にファイルを削除する
          )
        }
    }

おわり

Discussion