2016-09-11 12 views
1

現在、私は自分自身のPHPフレームワークを構築しており、PHP-FIG PSR-7 MessageInterfaceの実装を作成中です。具体的には、withHeaderメソッドです。このメソッドは、無効なヘッダー名または値の場合、\ InvalidArgumentExceptionという例外が発生する可能性があります。PHPでhttpヘッダーを解析/検証/処理する方法

私は疑問に思っています。ヘッダーが有効か無効かはいつですか?値と同じです。 また、私はどんなヘッダーとどんなヘッダー値も受け入れるべきですか?それは危険な権利でしょうか?

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

答えて

0

は確かに、それは、ヘッダ名を渡すために、 "危ない" だ -

  • NULL
  • ある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; 
} 
withHeaderメソッドの実装として

関連する問題