0

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" => ???

だから、私の質問は次のとおりです。

  1. 0.18でPass使用する場合とパススルーの概念はありますか?lift
  2. を使用するにはどうすればよいNooopCacheStretegyですliftか?
  3. 最終的に、上記のコードを 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.liftnotを使用しようとしていることに注意してくださいOptionT.liftF(推奨)。ほとんどの場合、方法がわからないためです。

4

2 に答える 2

0

コメントとしてフォーマットできないようですので、新しい回答として投稿してください...

これはどう?

  def apply(): HttpService[IO] = Kleisli.apply(request => {
    val basepath = ...
    val target = location + request.uri.path

    StaticFile.fromString[IO](target, Some(request))
  })
于 2018-02-02T14:15:01.180 に答える