2

現在、私は独自の php フレームワークを構築しており、PHP-FIG PSR-7 MessageInterface の実装を作成しています。具体的には withHeader メソッドです。このメソッドは、無効なヘッダー名または値の \InvalidArgumentException という例外をスローする可能性があると述べています。

それで、ヘッダーが有効または無効になるのはいつですか?値についても同じです。または、ヘッダーとヘッダー値を受け入れる必要がありますか? それは危険ですよね?

一般的に、ヘッダーに複数の値がある場合、それらはコンマで区切られていると言えます。しかし、それが常に当てはまるわけではありません。たとえば、ユーザー エージェント ヘッダーを見ると、値自体にカンマが含まれていることがあります。ただし、単一の値として扱う必要があります。

4

2 に答える 2

1

実際、ヘッダー名を の引数として渡すのは「危険」ですwithHeader()

  • NULL
  • 文字列ではありません
  • 空文字列です

同じことがヘッダー値引数にも当てはまります。配列または文字列である必要があります (コンマで区切られた値のリストではなく、1 つの値のみを表します!)。

メソッドの実装に関してはwithHeader

/**
 * Return an instance with the provided value replacing the specified header.
 *
 * ...
 *
 * @param string $name Case-insensitive header field name.
 * @param string|string[] $value Header value(s).
 * @return static
 * @throws \InvalidArgumentException for invalid header names or values.
 */
public function withHeader($name, $value) {
    $this
            ->validateHeaderName($name)
            ->validateHeaderValue($value)
    ;

    $clone = clone $this;

    $clone->replaceHeader($name, $value);

    return $clone;
}

/**
 * =================
 * Not part of PSR-7
 * =================
 * 
 * Validate header name.
 * 
 * @param string $name Case-insensitive header field name.
 * @return $this
 * @throws \InvalidArgumentException
 */
protected function validateHeaderName($name) {
    if (!isset($name)) {
        throw new \InvalidArgumentException('No header name provided!');
    }

    if (!is_string($name)) {
        throw new \InvalidArgumentException('The header name must be a string!');
    }

    if (empty($name)) {
        throw new \InvalidArgumentException('Empty header name provided!');
    }

    return $this;
}

/**
 * =================
 * Not part of PSR-7
 * =================
 * 
 * Validate header value.
 * 
 * @param string|string[] $value Header value(s).
 * @return $this
 * @throws \InvalidArgumentException
 */
protected function validateHeaderValue($value) {
    if (isset($value) && !is_array($value) && !is_string($value)) {
        throw new \InvalidArgumentException('The header value must be a string or an array!');
    }

    return $this;
}

/**
 * =================
 * Not part of PSR-7
 * =================
 * 
 * Replace a header item with a new one.
 * 
 * @param string $name Case-insensitive header field name.
 * @param string|string[] $value Header value(s).
 * @return $this
 * @done
 */
protected function replaceHeader($name, $value) {
    $this
            ->removeHeader($name)
            ->addHeader($name, $value)
    ;

    return $this;
}
于 2017-09-19T01:55:35.880 に答える