Http4s 0.16.6a では、以下のサービスがありました。
import org.http4s.server.staticcontent._
import org.http4s._
object StaticFiles {
val basepath = ...
def apply(): HttpService = Service.lift(request => {
val file = basepath + request.uri.path
StaticFile.fromString(file, Some(request)).fold {
Pass.now // aka fallthrough
} {
NoopCacheStrategy.cache(request.pathInfo, _)
}
})
}
URL からパスを取得し、静的ファイルを提供できるかどうかを判断しようとします。したがって、GET リクエスト/index.html
はそれをロードしようとし、fromFile
見つからない場合はフォールスルーまたは「パス」します。を使用して他のサービス||
と組み合わせた場合、合計関数 ( からlift
) が部分関数 ( から ) のように扱われることを意味していましたapply
。
これを Http4s 0.18.x に変換できないようです。
Http4s ドキュメントでは、次のことが提案されています。
import cats.effect._
import org.http4s._
import org.http4s.dsl.io._
import java.io.File
val service = HttpService[IO] {
case request @ GET -> Root / "index.html" =>
StaticFile.fromFile(new File("relative/path/to/index.html"), Some(request))
.getOrElseF(NotFound()) // In case the file doesn't exist
}
これは私がやろうとしていることの基本的な形ですが、それを少しだけ一般化して、提供したいすべてのファイルに対して部分的な関数を作成したくありません。つまり、これを避けてください:
case request @ GET -> Root / "index.html" => ???
case request @ GET -> Root / "fileA.html" => ???
case request @ GET -> Root / "fileB.html" => ???
だから、私の質問は次のとおりです。
- 0.18で
Pass
使用する場合とパススルーの概念はありますか?lift
- を使用するにはどうすればよい
NooopCacheStretegy
ですlift
か? - 最終的に、上記のコードを 0.18 に変換するにはどうすればよいですか?
これまでの私の努力は、この忌まわしきものにつながりました(obvsはコンパイルしません):
def apply(): HttpService[IO] = HttpService.lift(request => {
val target = basepath + request.uri.path
StaticFile.fromString[IO](target, Some(request)).fold {
// passthrough
IO.pure(???)
} {
// process request
response => NoopCacheStrategy[IO].cache(request.pathInfo, response).unsafeRunSync()
}
})
HttpService.lift
notを使用しようとしていることに注意してくださいOptionT.liftF
(推奨)。ほとんどの場合、方法がわからないためです。