This repository has been archived on 2024-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
redir/application/classes/HTTP/Exception/404.php
2013-04-13 17:53:50 +10:00

69 lines
2.1 KiB
PHP

<?php defined('SYSPATH') or die('No direct access allowed.');
/**
* This class overrides Kohana's 404 Exception
*
* @package Redir/Modifications
* @category Classes
* @author Deon George
* @copyright (c) 2010-2013 Deon George
* @license http://dev.leenooks.net/license.html
*/
class HTTP_Exception_404 extends Kohana_HTTP_Exception_404 {
/**
* Before returning our file not found, lets see if we are redirecting this URI
*/
public function get_response() {
try {
// Try and find the path
$ro = ORM::factory('Redir',array('servername'=>$_SERVER['SERVER_NAME'],'path'=>$this->request()->uri()));
if (! $ro->loaded()) {
$ro = ORM::factory('Redir',array('servername'=>$_SERVER['SERVER_NAME'],'path'=>NULL));
if (! $ro->loaded())
$ro = ORM::factory('Redir',0);
}
$ro->count++;
$ro->date_last_refer = time();
$ro->save();
// Prepare the response object.
$response = Response::factory();
$redirect = $ro->redirect ? trim($ro->redirect) : Kohana::$config->load('config')->defaultfile;
// Process our redirection options
if (is_null($redirect) OR ! trim($redirect)) {
return parent::get_response();
} elseif (preg_match('/^http[s]?:\/\//',$redirect)) {
$response->status(302);
$response->headers('Location',$redirect);
} elseif (preg_match('/^file:\/\/(.*)$/',$redirect,$matches) AND file_exists($matches[1])) {
$response->status(200);
$response->body(file_get_contents($redirect));
HTTP::check_cache($this->request(),$response,sha1($response->body()));
$response->headers('Content-Type',File::mime_by_ext(pathinfo($matches[1],PATHINFO_EXTENSION)));
$response->headers('Content-Length',(string)$response->content_length());
$response->headers('Last-Modified',date('r',$matches[1] ? filemtime($matches[1]) : time()));
}
return $response;
} catch (Exception $e) {
// Incase we are thrown in this exception.
if ($e instanceof HTTP_Exception AND $e->getCode() != 404) {
$x = new $e;
return $x->get_response();
}
return parent::get_response();
}
}
}
?>