<?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();

			// Update our referrer info
			$rfo = $ro->referrer->where('referrer','=',$this->request()->referrer())->find();

			if (! $rfo->loaded()) {
				$rfo->redir_id = $ro->id;
				$rfo->referrer = $this->request()->referrer();
			}

			$rfo->count++;
			$rfo->date_last_refer = $ro->date_last_refer;
			$rfo->save();

			// Prepare the response object.
			$response = Response::factory();

			// Process our redirection options
			if (preg_match('/^http[s]?:\/\//',$ro->redirect)) {
				$response->status($ro->http_status ? $ro->http_status : 302);
				$response->headers('Location',$ro->redirect);

			} elseif (preg_match('/^file:\/\/(.*)$/',$ro->redirect,$matches) AND file_exists($matches[1])) {
				$response->status(200);
				$response->body(file_get_contents($matches[1]));

				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()));

			} else {
				$response->status(404);
				$response->body(View::factory('404'));

				HTTP::check_cache($this->request(),$response,sha1($response->body()));
			}

			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();
		}
	}
}
?>
