<?php
/**
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* @author Kai Dorschner <the-kernel32@web.de>
* @copyright Copyright 2008, Kai Dorschner
* @license http://www.gnu.org/licenses/lgpl.html LGPLv3
*/
/**
* Modifies HTTP Header
*
*/
class Header {
protected $statuscodes = array(
100 => 'Continue',
101 => 'Switching Protocols',
200 => 'OK',
201 => 'Created',
202 => 'Accepted',
203 => 'Non-Authoritative Information',
204 => 'No Content',
205 => 'Reset Content',
206 => 'Partial Content',
300 => 'Multiple Choices',
301 => 'Moved Permanently',
302 => 'Found',
303 => 'See Other',
304 => 'Not Modified',
305 => 'Use Proxy',
307 => 'Temporary Redirect',
400 => 'Bad Request',
401 => 'Unauthorized',
402 => 'Payment Required',
403 => 'Forbidden',
404 => 'Not Found',
405 => 'Method Not Allowed',
406 => 'Not Acceptable',
407 => 'Proxy Authentication Required',
408 => 'Request Timeout',
409 => 'Conflict',
410 => 'Gone',
411 => 'Length Required',
412 => 'Precondition Failed',
413 => 'Request Entity Too Large',
414 => 'Request-URI Too Long',
415 => 'Unsupported Media Type',
416 => 'Requested Range Not Satisfiable',
417 => 'Expectation Failed',
500 => 'Internal Server Error',
501 => 'Not Implemented',
502 => 'Bad Gateway',
503 => 'Service Unavailable',
504 => 'Gateway Timeout',
505 => 'HTTP Version Not Supported'
);
/**
*
*/
protected static $instance;
/**
* Flag which indicated wether the header has already been sent.
*
* @access private
*/
protected $sent = false;
/**
* Internal header buffer.
*
* Saves all header strings.
*
* @access protected
*/
protected $buffer = array();
protected $cookiesBuffer = array();
/**
* Singleton-pattern constructor set protected to deny direct access.
*/
protected function __construct() {
$this->sent = headers_sent();
}
public function __destruct() {return $this->sendHeader();}
/**
* Singleton-pattern method to get instance.
*/
public static function getInstance() {
if(!isset($instance))
self::$instance = new Header();
return self::$instance;
}
public function sendHeader() {
if(!$this->sent & !headers_sent()) {
foreach($this->buffer as $part)
if(strlen($part[1]) > 0)
header($part[0] . ': ' . $part[1]);
else
header($part[0]);
$this->sendCookies();
return true;
}
$this->sent = true;
return false;
}
public function sendCookies() {
$return = true;
foreach($this->cookiesBuffer as $cookie)
$return &= setcookie($cookie['name'], $cookie['value'], $cookie['expire']);
return $return;
}
public function addCookie($name, $value, $expire) {
$this->cookiesBuffer[] = array(
'name' => $name,
'value' => $value,
'expire' => $expire
);
}
protected function add($type, $value = '') {
$this->sent = headers_sent();
if(!$this->sent) {
$type[0] = strtoupper($type[0]);
$this->buffer[] = array($type, $value);
} else
throw new MvcException('Cannot add a buffer. Header already sent.');
}
public function location($location) {
$this->add('Location', $location);
}
public function contentType($media, $charset = '') {
$this->add('Content-Type', $media . (empty($charset) ? '': '; charset=' . $charset));
}
public function contentDisposition($filename, $disposition = 'inline') {
$this->add('Content-Disposition', $disposition . '; filename="' . $filename . '"');
}
public function status($statuscode) {
$this->add('HTTP/1.1 ' . $statuscode . ' ' . $this->statuscodes[$statuscode]);
}
public function lastModified($date) {
$this->add('Last-Modified', $date);
}
public function etag($etag) {
$this->add('Etag', $etag);
}
}
|