PSR-7 UriInterface - 包含百分比编码的无效组件

时间:2017-02-26 23:55:43

标签: php encoding uri psr-7

我一直在研究PSR-7 UriInterface的实现,以及关于何时实现应该为某些组件抛出InvalidArgumentException的规范有点令人费解。

例如,UriInterface::withPath specifies throwing such an exception given an invalid path,但同一个docblock指出,“用户可以提供编码和解码的路径字符”,因为“实现确保正确的编码。”

/**
 * ...
 *
 * Users can provide both encoded and decoded path characters.
 * Implementations ensure the correct encoding as outlined in getPath().
 *
 * @param string $path The path to use with the new instance.
 * @return static A new instance with the specified path.
 * @throws \InvalidArgumentException for invalid paths.
 */

负责管理编码的实现在整个规范的其余部分都得到了证实。

由于实现确保了正确的编码,因此似乎可以遵循实现的用户可以将任意数量的无效字符传递给像withPath这样的函数,然后对其进行正确编码而不是触发异常。

我能想到的唯一一个案例就是InvalidArgumentException,如果withPath传递了一个非字符串(无论它值多少,似乎都是Guzzle's interpretation of the specification)。

真正严格阅读PHP's brief introduction of InvalidArgumentException似乎可以避免这种“严格打字”的解释,但我不禁想知道PHP-FIG是否有任何其他想法,特别是考虑到复杂性一般的URI语法。

是否存在UriInterface方法(如withPath)在传递字符串时会抛出异常的情况?

1 个答案:

答案 0 :(得分:1)

我知道,你的问题有点陈旧: - )

你的假设是完全正确的!

关于部分:

  

用户可以提供编码和解码的路径字符。   
  实现确保了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:不是字符串;
  • withPort:不是数字(或整数?)且不在[1,65535]范围内;
  • withPath:不是字符串;
  • withQuery:不是字符串;
  • withFragment:不是字符串;

最后,特殊处理接收作为(可选NULL)构造函数参数传递的URI字符串($uri):

  • 未设置
  • 不是字符串
  • 是空的

...和URI部分数组,作为在URI字符串参数上调用parse_url的结果(此处为throw UnexpectedValueException):

$uriParts = parse_url($uri);

if ($uriParts === FALSE) {
    throw new \UnexpectedValueException('URI could not be parsed!');
}

请注意,我已在UriInterface实现中列出了所有异常抛出情况。