From 87a3c063dac4516abafacc8167b14ee6b6a5b286 Mon Sep 17 00:00:00 2001 From: PJ Dietz Date: Mon, 1 Oct 2012 20:06:14 -0400 Subject: [PATCH] Added Response::getStatusLine() function. This makes it more extensible and compatible with PHP 5.3. --- Response.inc.php | 74 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 72 insertions(+), 2 deletions(-) diff --git a/Response.inc.php b/Response.inc.php index 7bc98fb..2c98dfa 100644 --- a/Response.inc.php +++ b/Response.inc.php @@ -30,6 +30,14 @@ class Response { */ protected $headers; + /** + * The protocol. Set this to the protocol you wish to use, such as + * "HTTP/1.1". If unset, the class uses $_SERVER['SERVER_PROTOCOL'] + * + * @var string + */ + public $protocol; + /** * HTTP status code * @var int @@ -168,8 +176,7 @@ class Response { public function respond($headersOnly = false) { // Output the HTTP status code. - // TODO: Available in 5.4+. PHP.net has a good alternative in the comments. - http_response_code($this->statusCode); + header($this->getStatusLine($this->statusCode)); // Output each header. foreach ($this->headers as $header => $value) { @@ -183,6 +190,69 @@ class Response { } // respond() + /** + * Return HTTP status line, e.g. HTTP/1.1 200 OK. + * + * @return string + * @throws \UnexpectedValueException + */ + protected function getStatusLine() { + + switch ($this->statusCode) { + case 100: $text = 'Continue'; break; + case 101: $text = 'Switching Protocols'; break; + case 200: $text = 'OK'; break; + case 201: $text = 'Created'; break; + case 202: $text = 'Accepted'; break; + case 203: $text = 'Non-Authoritative Information'; break; + case 204: $text = 'No Content'; break; + case 205: $text = 'Reset Content'; break; + case 206: $text = 'Partial Content'; break; + case 300: $text = 'Multiple Choices'; break; + case 301: $text = 'Moved Permanently'; break; + case 302: $text = 'Moved Temporarily'; break; + case 303: $text = 'See Other'; break; + case 304: $text = 'Not Modified'; break; + case 305: $text = 'Use Proxy'; break; + case 400: $text = 'Bad Request'; break; + case 401: $text = 'Unauthorized'; break; + case 402: $text = 'Payment Required'; break; + case 403: $text = 'Forbidden'; break; + case 404: $text = 'Not Found'; break; + case 405: $text = 'Method Not Allowed'; break; + case 406: $text = 'Not Acceptable'; break; + case 407: $text = 'Proxy Authentication Required'; break; + case 408: $text = 'Request Time-out'; break; + case 409: $text = 'Conflict'; break; + case 410: $text = 'Gone'; break; + case 411: $text = 'Length Required'; break; + case 412: $text = 'Precondition Failed'; break; + case 413: $text = 'Request Entity Too Large'; break; + case 414: $text = 'Request-URI Too Large'; break; + case 415: $text = 'Unsupported Media Type'; break; + case 500: $text = 'Internal Server Error'; break; + case 501: $text = 'Not Implemented'; break; + case 502: $text = 'Bad Gateway'; break; + case 503: $text = 'Service Unavailable'; break; + case 504: $text = 'Gateway Time-out'; break; + case 505: $text = 'HTTP Version not supported'; break; + default: + throw new \UnexpectedValueException('Unknown http status code "' . $this->statusCode . '"'); + break; + } + + if (isset($this->protocol)) { + $protocol = $this->protocol; + } elseif (isset($_SERVER['SERVER_PROTOCOL'])) { + $protocol = $_SERVER['SERVER_PROTOCOL']; + } else { + $protocol = 'HTTP/1.1'; + } + + return $protocol . ' ' . $this->statusCode . ' ' . $text; + + } + } // Response ?>