Php PSR-7接口-具有百分比编码的无效组件
我一直在研究的实现,关于实现何时应该为某些组件抛出InvalidArgumentException的规范有点令人费解 例如,同一docblock指出,“用户可以提供编码和解码的路径字符”,因为“实现确保正确的编码。” 规范的其余部分都证明了实现负责管理编码 由于实现确保了正确的编码,因此实现的用户似乎可以将任意数量的无效字符传递到类似withPath的函数中,然后对该函数进行正确编码,而不是触发异常 我能想到的唯一一个可以证明InvalidArgumentException的情况是,如果withPath被传递了一个非字符串(不管它值多少,似乎是) 真正严格阅读似乎可以避免这种“严格类型”解释,但我不禁想知道PHP-FIG是否还有其他想法,特别是考虑到URI语法的复杂性Php PSR-7接口-具有百分比编码的无效组件,php,encoding,uri,psr-7,Php,Encoding,Uri,Psr 7,我一直在研究的实现,关于实现何时应该为某些组件抛出InvalidArgumentException的规范有点令人费解 例如,同一docblock指出,“用户可以提供编码和解码的路径字符”,因为“实现确保正确的编码。” 规范的其余部分都证明了实现负责管理编码 由于实现确保了正确的编码,因此实现的用户似乎可以将任意数量的无效字符传递到类似withPath的函数中,然后对该函数进行正确编码,而不是触发异常 我能想到的唯一一个可以证明InvalidArgumentException的情况是,如果with
是否有任何情况下,如果传递字符串,withPath等UriInterface方法应该引发异常?我知道,您的问题有点老了:-) 你的假设完全正确 关于该部分: 用户可以提供编码和解码的路径字符。
实现确保了getPath()中所述的正确编码 这与“无效路径”(在
@throws
标记中描述)无关。它只是声明——正如您正确地断言的那样,用户可以提供编码字符和解码字符,这些字符将被正确地编码——在意义上相应地编码百分比。例如,一些未编码的字符将采用百分比编码,而其他字符则不采用百分比编码。原则上,编码方案为:
Percent-encode all URI path characters, except:
- the unreserved characters,
- the reserved characters of the subset "gen-delims",
- the reserved characters of the subset "sub-delims",
- the already percent-encoded characters.
另一方面,在以下参数无效的情况下会引发异常-InvalidArgumentException
:
:不是字符串,也不是允许的字符串列表的一部分 方案李>withScheme
:不是字符串李>withHost
:不是数字(或整数?),不在范围[165535]内李>withPort
:不是字符串李>withPath
:不是字符串李>withQuery
:不是字符串李>withFragment
$URI
):
- 未设置
- 不是字符串
- 是空的
parse_url
的结果(这里抛出UnexpectedValueException
):
注意,我已经列出了UriInterface实现中的所有异常抛出情况
Percent-encode all URI path characters, except:
- the unreserved characters,
- the reserved characters of the subset "gen-delims",
- the reserved characters of the subset "sub-delims",
- the already percent-encoded characters.
$uriParts = parse_url($uri);
if ($uriParts === FALSE) {
throw new \UnexpectedValueException('URI could not be parsed!');
}