2016-09-11 64 views
1

目前我正在構建自己的php框架,現在我正在創建PHP-FIG PSR-7 MessageInterface的實現。在具體的withHeader方法中。它聲明該方法可以爲無效的頭名稱或值拋出一個exeption:\ InvalidArgumentException。如何解析/驗證/處理PHP中的http標頭

所以我想知道,什麼時候頭是有效的或無效的?值相同。 或者我應該接受任何標題和任何標題值?這可能是危險的權利?

我現在可以一般地說,如果標題有多個值,它們是逗號分隔的。但那並不總是適用。例如,如果我查看用戶代理標題,則該值本身有時包含逗號。但你應該把它當作一個單一的價值。

回答

0

事實上,它是 「危險的」 傳遞一個頭名 - 作爲withHeader()的說法,這

  • 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; 
}