Code: Select all
<?php
class A_Http_ResponseChild {
var $name = '';
var $children = array();
var $renderer = null;
var $headers = array();
var $redirect = null;
var $content = '';
var $sent = false;
function A_Http_ResponseChild ($name='') {
$this->name = $name;
}
function setHeader($field, $param=null) {
if (is_array($param)) {
foreach ($param as $prm) {
$this->headers[$field][] = $prm;
}
} else {
$this->headers[$field][] = $param;
}
}
function getHeaders() {
return $this->headers;
}
function setRedirect($url) {
$this->redirect = $url;
}
function getRedirect() {
return $this->redirect;
}
function setContent($content) {
$this->content = $content;
}
function getContent() {
return $this->content;
}
function setRenderer(&$renderer) {
$this->renderer =& $renderer;
}
function set($name, $var) {
$this->children[$name] = $var;
}
function addChild(&$child) {
$this->children[$child->name] =& $child;
}
function run(&$locator) {
if ($this->children) {
$names = array_keys($this->children);
//get headers and redirect from children if set
foreach ($names as $name) {
if (is_a($this->children[$name], 'A_Http_ResponseChild')) {
if ($this->children[$name]->headers) {
foreach ($this->children[$name]->headers as $field => $value) {
$this->setHeaders($field, $value);
}
}
if ($this->children[$name]->redirect) {
$this->redirect = $this->children[$name]->redirect;
}
}
}
// only render if no content and has render
if (! $this->content && $this->renderer) {
foreach ($names as $name) {
if (is_a($this->children[$name], 'A_Http_ResponseChild')) {
$this->renderer->set($name, $this->children[$name]->run($locator));
} else {
$this->renderer->set($name, $this->children[$name]);
}
}
$this->content = $this->renderer->render();
}
}
if (method_exists($this->renderer, 'render')) {
$this->content = $this->renderer->render();
}
return $this->content;
}
}
class A_Http_Response extends A_Http_ResponseChild {
function A_Http_Response ($name='') {
$this->A_Http_ResponseChild($name);
}
function render() {
if ($this->redirect) {
$base = $_SERVER['SERVER_NAME'] . dirname($_SERVER['SCRIPT_NAME']);
if (strpos($this->redirect, $base) === false) {
if (isset($_SERVER["HTTPS"]) && ($_SERVER["HTTPS"] == 'on')) {
$protocol = 'https://';
} else {
$protocol = 'http://';
}
if (substr($base, -1, 1) != '/') {
$base .= '/';
}
$this->redirect = $protocol . $base . preg_replace('/^[\/\.]*/', '', $this->redirect);
}
header('Location: ' . $this->redirect);
} else {
foreach ($this->headers as $field => $params) {
if (! is_null($params)) {
header($field . ': ' . implode(', ', $params));
}
}
return $this->content;
}
}
function out() {
if(!$this->sent){
echo $this->render();
$this->sent = true;
}
}
}
?>