gpt4 book ai didi

scala - 未经过滤的 URL 解码

转载 作者:行者123 更新时间:2023-12-03 20:51:51 24 4
gpt4 key购买 nike

我正在使用 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%20string在客户端和服务器上,而不是 some string我在期待。

解决这个问题很简单 ( java.net.URLDecoder#decode(String, String) ),但我想知道是否:

  • 我忘记了一些琐碎的事情,让自己出丑。
  • unfiltered 有一个工具包可以自动处理这些麻烦。
  • 如果以上都不是,这种行为是否有特殊原因,或者我应该提交错误报告?

作为旁注,unfiltered标签不存在,我没有足够的声誉来创建它,这就是我默认为 scala 的原因.

最佳答案

奇怪,我也看到了这种行为。 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)

值得庆幸的是,该框架非常灵活并且可以像这样进行扩展,因此您当然有多种选择。

关于scala - 未经过滤的 URL 解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18083311/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com