【问题标题】:RFC2396 - what is valid path segment?RFC2396 - 什么是有效路径段?
【发布时间】:2011-07-26 06:04:01
【问题描述】:

问题领域

我需要定义特定的路径段是否对RFC2396有效。规范说:

path_segments = segment *( "/" segment )
segment       = *pchar *( ";" param )
param         = *pchar
pchar         = unreserved | escaped | ":" | "@" | "&" | "=" | "+" | "$" | ","
unreserved    = alphanum | mark
mark          = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"
escaped       = "%" hex hex
hex           = digit | "A" | "B" | "C" | "D" | "E" | "F" |
                        "a" | "b" | "c" | "d" | "e" | "f"

因此,例如,/foo 是一个有效的路径段,但/fo?o 不是因为未转义的?。为了更正上面的例子,路径段应该写成/fo%3Fo

然而,规范只定义到达服务器的 URI 的有效性(想想:在 URL 栏中输入)。

我真正需要验证的是 未转义 路径段是否有效。继续上面的示例,/fo?o 将是一个有效资源,因为 ? 是您在取消转义 %3F 时得到的。

这也意味着 URL http://foo.com/first/sec%2fond 将解析为两个未转义的路径段,/first/sec/ond,并且后者不仅必须被视为 单个 段而不是两个单独的,但在语法上也是有效的(作为未转义的路径段)。

问题

  • 我是否正确理解了规范?
  • 谁能为非转义路径段推荐一个Java验证器?
  • 谁能提出一个重要的失败案例?
  • U+00FF以上的字符,不能用在路径段中吗?我认为它们是受支持的,至少在域名方面是这样。

编辑:正如 Mike 正确指出的那样,RFC3986 已经过时了 RFC2396。无论如何,我相信新 RFC 处理的案例比旧 RFC 更多(并且不会使某些路径段成为非法),因此同样的问题也适用。

【问题讨论】:

  • 您确定要使用 RFC 2396 而不是淘汰 2396 的 RFC 3986?来自 RFC 3986:“过时:2732、2396、1808”
  • 你错了; /first/sec%2fond 将产生三个段:一个空段、firstsec/ond。但是为什么你会认为sec/ond 不是一个有效的段呢?对什么无效?被解释为文件系统中的文件(常规文件或目录)?
  • @Mike - 谢谢,我已经更新了我的问题。
  • @Gumbo - 想想 CMS,其中不同的路径段解析为不同的 CMS 实体。我需要验证用户输入的路径段在语法上是否正确。
  • @mindas:那你认为路径段的正确语法是什么?

标签: java http rfc


【解决方案1】:

我会以与您相同的方式解释规范;也就是说,sec%2Fond 是单个路径段。 (但是——任何使用这样的段创建 URI 的人都应该受到严厉的惩罚!)

您正在努力解决的问题是无法逃脱的过程是有损失的;您不能从转义的 URI 到未转义的 String 并返回到原始的转义 URI。没有办法解决这个问题。在任何“有用的”处理丢弃关键信息之前,您必须掌握转义的 URI。

您可以阅读 §2.1 以了解有关处理非 ASCII 字符的详细信息,但我的理解是 RFC 2396 中的转义规则适用于 在 URI 字符串之后的八位字节字符串(字节)已进行字符编码。如何进行字符编码可以由方案指定;没有通用的方法。

【讨论】:

  • 在有损转义后找到正确的资源来服务是一个不同的问题,我不想污染这个问题,这只涉及验证部分:)
【解决方案2】:

因此,例如,/foo 是有效的路径段,但 /fo?o 不是因为未转义的 ?。为了更正上面的例子,路径段应该写成/fo%3Fo。

正确

这也意味着 URL http://foo.com/first/sec%2fond 将解析为两个未转义的路径段,/first 和 /sec/ond,后者不仅必须被视为单个段而不是两个单独的段,而且在语法上也是有效(作为未转义的路径段)。

正确。但是有很多实现会出错。

U+00FF以上的字符,不能用在路径段中吗?我认为它们是受支持的,至少在域名方面。

URI 转义(% hex hex)编码字节。不是代码点。您需要知道 URL 的编码。例如,如果编码为 UTF-8,则代码点 U+1234 编码为%E1%88%B4

域名中不允许使用百分比转义。国际域名见RFC 3492

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多