2013-08-06 3 views
2

Unfiltered 0.6.8 (Jetty 커넥터 사용)과 관련하여 이상한 동작이 발생했습니다. 경로 세그먼트는 URL 디코딩되지 않습니다.필터링되지 않은 URL 디코딩

코드의 다음 비트가 내 최소한의 테스트 케이스이다 : 클라이언트와 서버 측에서 some_string 모두 :

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 쿼리가 예상 결과를 얻을 수 있습니다.

반면에 http://localhost:8080/some%20string은 예상했던 some string 대신 클라이언트와 서버 모두에서 이됩니다. 이 문제를 해결 근무

은 (java.net.URLDecoder#decode(String, String)) 사소한,하지만 난 알고 싶습니다 : 나는 사소한 일을 잊고 자신의 바보를 만들고있어

  • .
  • 필터링하지 않으면 번거 로움을 자동으로 처리하는 키트가 있습니다.
  • 위의 경우가 아니면이 동작에 대한 특별한 이유가 있습니까? 아니면 버그 보고서를 제출해야합니까? 보조 노트로

unfiltered 태그가 존재하지 않습니다와 나는 scala이 기본값 이유입니다, 그것을 만들 수있는 충분한 명성을 필요가 없습니다.

답변

6

이상하게도이 동작이 나타납니다. 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) 

감사하게도이 프레임 워크는 유연하고 확장 기능을 제공하므로 확실한 옵션이 있습니다.