Login   Register  
PHP Classes
elePHPant
Icontem

File: Header.php5

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Kai Dorschner  >  Header  >  Header.php5  
File: Header.php5
Role: Class source
Content type: text/plain
Description: Header modification class.
Class: Header
Compose and send HTTP response headers
 

Contents

Class file image Download
<?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);
    }
}