2

Unfiltered 0.6.8 (Jetty コネクタを使用) を使用していますが、パス セグメントが URL デコードされないという奇妙な動作に遭遇しました。

次のコードは、最小限のテスト ケースです。

import unfiltered.request._
import unfiltered.response._

object Test extends App with unfiltered.filter.Plan {
  def intent = {

    case reg @ Path(Seg(test :: Nil)) =>
      println(test)
      ResponseString(test)
  }

  unfiltered.jetty.Http.local(8080).filter(Test).run()
}

クエリを実行すると、クライアント側とサーバー側の両方でhttp://localhost:8080/some_string期待される結果が得られます。some_string

一方、期待していたよりも、クライアントとサーバーの両方でhttp://localhost:8080/some%20string利回りが得られます。some%20stringsome string

この問題を回避するのは簡単ですが ( java.net.URLDecoder#decode(String, String))、次の点について知りたいです。

  • 些細なことを忘れてバカにしてる。
  • unfiltered には、面倒な作業を自動的に処理するためのキットがあります。
  • 上記のいずれにも当てはまらない場合、この動作には特定の理由がありますか、それともバグ レポートを提出する必要がありますか?

補足として、unfilteredタグは存在せず、それを作成するのに十分な評判がありません。そのため、デフォルトでscala.

4

1 に答える 1

7

奇妙なことに、私もこの動作を見ています。オブジェクトにはSeg、パス セグメントを分割する前に何らかの URL デコードを行うものは何もありません。また、このフレームワークにも他に何もありません。次のように、カスタム エクストラクタを使用したソリューションの詳細を記載した投稿に出くわしました。

object Decode {
  import java.net.URLDecoder
  import java.nio.charset.Charset

  trait Extract {
    def charset: Charset
    def unapply(raw: String) = 
      Try(URLDecoder.decode(raw, charset.name())).toOption
  }

  object utf8 extends Extract {
    val charset = Charset.forName("utf8")
  }
}

次に、次のように使用できます。

case reg @ Path(Seg(Decode.utf8(test) :: Nil)) =>
  println(test)
  ResponseString(test)

または、パス全体をデコードしたい場合は、次のようにします。

case reg @ Path(Decode.utf8(Seg(test :: Nil))) =>
  println(test)
  ResponseString(test)

ありがたいことに、フレームワークは柔軟性があり、このように拡張できるので、確かに選択肢があります。

于 2013-08-06T17:35:09.283 に答える