RFC2396 - 什么是有效的路径段?

时间:2011-03-30 16:46:11

标签: java http rfc

问题区域

我需要定义特定的路径段是否对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

但是,

Spec仅定义了到达服务器的URI的有效性(想想:在URL栏中输入)。

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

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

问题

  • 我是否正确理解规范?
  • 有人可以为未转义的路径段建议一个Java验证器吗?
  • 任何人都可以建议一个非平凡的失败案例吗?
  • U + 00FF以上的字符怎么样,它们不能用在路径段中吗?我认为他们得到了支持,至少在域名中得到了支持。
编辑:正如迈克正确指出的那样,RFC3986废弃了RFC2396。无论如何,我相信新的RFC处理的案件比旧的更多(并且不会使某些路径段非法)因此同样的问题也适用。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分: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