问题领域
我需要定义一个特定的路径段是否对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
时获得的资源。这也意味着url
http://foo.com/first/sec%2fond
将解析为两个未转换的路径段/first
和/sec/ond
,后者不仅必须被视为单个段而不是两个单独的段,而且在语法上也是有效的(作为未转换的路径段)。问题
我是否正确理解规范?
有人能为未转换的路径段建议一个java验证器吗?
有人能提出一个不平凡的失败案例吗?
U+00FF以上的字符可以不在路径段中使用吗?我以为他们得到了支持,至少在域名方面。
编辑:正如迈克正确指出的,RFC3986淘汰了RFC2396。无论如何,我相信新的rfc比旧的rfc处理更多的情况(并且不会使一些路径段不合法),因此同样的问题也适用。
最佳答案
我将以与您相同的方式解释规范;也就是说,sec%2Fond
是单个路径段。(但是,任何创建具有这样一个段的uri的人都应该受到严厉的惩罚!)
您要解决的问题是,不转义过程是lossey;您不能从转义uri往返到un escapedString
并返回到原始的转义uri。没有办法解决这个问题;在任何“有用的”处理丢弃关键信息之前,您必须获得转义的uri。
您可以阅读第2.1节了解非ascii字符处理的详细信息,但我的理解是rfc 2396中的转义规则适用于uri字符串经过字符编码后的八进制字符串(字节)。如何执行字符编码可以由方案指定;没有通用方法。
关于java - RFC2396-什么是有效路径段?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5489379/