【发布时间】: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将产生三个段:一个空段、first和sec/ond。但是为什么你会认为sec/ond不是一个有效的段呢?对什么无效?被解释为文件系统中的文件(常规文件或目录)? -
@Mike - 谢谢,我已经更新了我的问题。
-
@Gumbo - 想想 CMS,其中不同的路径段解析为不同的 CMS 实体。我需要验证用户输入的路径段在语法上是否正确。
-
@mindas:那你认为路径段的正确语法是什么?