15     private static $phrases = [
 
   17         101 => 
'Switching Protocols',
 
   22         203 => 
'Non-Authoritative Information',
 
   24         205 => 
'Reset Content',
 
   25         206 => 
'Partial Content',
 
   26         207 => 
'Multi-status',
 
   27         208 => 
'Already Reported',
 
   28         300 => 
'Multiple Choices',
 
   29         301 => 
'Moved Permanently',
 
   32         304 => 
'Not Modified',
 
   34         306 => 
'Switch Proxy',
 
   35         307 => 
'Temporary Redirect',
 
   37         401 => 
'Unauthorized',
 
   38         402 => 
'Payment Required',
 
   41         405 => 
'Method Not Allowed',
 
   42         406 => 
'Not Acceptable',
 
   43         407 => 
'Proxy Authentication Required',
 
   44         408 => 
'Request Time-out',
 
   47         411 => 
'Length Required',
 
   48         412 => 
'Precondition Failed',
 
   49         413 => 
'Request Entity Too Large',
 
   50         414 => 
'Request-URI Too Large',
 
   51         415 => 
'Unsupported Media Type',
 
   52         416 => 
'Requested range not satisfiable',
 
   53         417 => 
'Expectation Failed',
 
   54         418 => 
'I\'m a teapot',
 
   55         422 => 
'Unprocessable Entity',
 
   57         424 => 
'Failed Dependency',
 
   58         425 => 
'Unordered Collection',
 
   59         426 => 
'Upgrade Required',
 
   60         428 => 
'Precondition Required',
 
   61         429 => 
'Too Many Requests',
 
   62         431 => 
'Request Header Fields Too Large',
 
   63         451 => 
'Unavailable For Legal Reasons',
 
   64         500 => 
'Internal Server Error',
 
   65         501 => 
'Not Implemented',
 
   67         503 => 
'Service Unavailable',
 
   68         504 => 
'Gateway Time-out',
 
   69         505 => 
'HTTP Version not supported',
 
   70         506 => 
'Variant Also Negotiates',
 
   71         507 => 
'Insufficient Storage',
 
   72         508 => 
'Loop Detected',
 
   73         511 => 
'Network Authentication Required',
 
   77     private $reasonPhrase = 
'';
 
   80     private $statusCode = 200;
 
   96         $this->assertStatusCodeIsInteger($status);
 
   97         $status = (int) $status;
 
   98         $this->assertStatusCodeRange($status);
 
  100         $this->statusCode = $status;
 
  102         if ($body !== 
'' && $body !== 
null) {
 
  106         $this->setHeaders($headers);
 
  107         if ($reason == 
'' && isset(self::$phrases[$this->statusCode])) {
 
  108             $this->reasonPhrase = self::$phrases[$this->statusCode];
 
  110             $this->reasonPhrase = (string) $reason;
 
  113         $this->protocol = $version;
 
  118         return $this->statusCode;
 
  123         return $this->reasonPhrase;
 
  126     public function withStatus($code, $reasonPhrase = 
'')
 
  128         $this->assertStatusCodeIsInteger($code);
 
  130         $this->assertStatusCodeRange($code);
 
  133         $new->statusCode = $code;
 
  134         if ($reasonPhrase == 
'' && isset(self::$phrases[$new->statusCode])) {
 
  135             $reasonPhrase = self::$phrases[$new->statusCode];
 
  137         $new->reasonPhrase = $reasonPhrase;
 
  141     private function assertStatusCodeIsInteger($statusCode)
 
  143         if (filter_var($statusCode, FILTER_VALIDATE_INT) === 
false) {
 
  144             throw new \InvalidArgumentException(
'Status code must be an integer value.');
 
  148     private function assertStatusCodeRange($statusCode)
 
  150         if ($statusCode < 100 || $statusCode >= 600) {
 
  151             throw new \InvalidArgumentException(
'Status code must be an integer value between 1xx and 5xx.');