<?php
/*
 * Cached page handler
 *
 * Authors : Christian Reiniger <creinig@mayn.de>
 * License : GNU GPL V2 or later (http://www.fsf.org/copyleft/gpl.html)
 *
 * Last change by $Author$
 * on             $Date$
 * to             $Revision$
 */


require_once ('base/defaults.php');

require_once ('phpbase/phpbase.php');
require_once ('phpbase/database.php');
require_once ('phpbase/session.php');
require_once ('phpbase/db/pagecache.php');
require_once ('phpbase/util/http.php');



assert (defined ('PAGETYPE'));

$TheSession = new KSession ();
$TheSession->OpenLight ();

/*
 if ($pbSessionUser->IsRealUser () == false)
	$TheSession->Relogin ();
 */


list ($Page, $CTime) = GetPage ($REQUEST_URI);
if ($Page === false)
        pbHTTP_404 ();

HandleCacheHeaders ($CTime);

if (defined ('PAGE_HITCOUNTER') || defined ('PAGE_USERINFO'))
{
        $Page = Postprocess ($Page);
}

// There should be a zlib.output_compression = on in a config file!
print $Page;
//Output ($Page);


$TheSession->Close ();








function GetPage ($TheURI)
{
        $Usermode = GetUsermode ();
        $TheURI = FixURI ($TheURI);
        $Page = false;

        if (!defined ('PAGE_NOSERVERCACHE'))
        {
                $Cache = new pbPageCache (PAGETYPE);
                $Page  = $Cache->Get ($TheURI, $Usermode);
                $CTime = $Cache->GetCTime ();
        }

        if ($Page === false)
        {
                include ('ui/page_builder.php');

                $Builder = new PageBuilder (PAGETYPE);
                $Page = $Builder->Build ($TheURI, $Usermode);
                $CTime = time ();
        }

        return array ($Page, $CTime);
}


function FixURI ($TheURI)
{
        if (substr ($TheURI, -5) == '.html')
                return $TheURI;

        if (substr ($TheURI, -1) == '/')
                return $TheURI . 'index.html';
        else
                return $TheURI . '/index.html';
}


function HandleCacheHeaders ($CTime)
{
        if (defined ('PAGE_NOCACHE')) {
                pbHTTP_NoCache ();
                return;
        }

        $MS = pbHTTP_GetModifiedSince ();

        if ($CTime == -1) {
                pbHTTP_LastMod ();
                return;
        }

        if (($MS != -1) && ($CTime < $MS)) { // changed in the meantime
                pbHTTP_304 ();
        }
        else {
                pbHTTP_LastMod ($CTime);
        }
}


function GetUsermode ()
{
	global $pbSessionUser;

        if (isset ($pbSessionUser))
        {
                if ($pbSessionUser->CheckPerm (PAGETYPE, 'maintainer')) {
                        return 'maint';
                }
                elseif ($pbSessionUser->IsRealUser ()) {
                        return 'logged_in';
                }
        }

        return 'std';
}


function Postprocess ($Page)
{
        include ('ui/postprocess_page.php');
        return PostprocessPage ($Page, GetUsermode ());
}


function Output ($Page)
{
        global $HTTP_SERVER_VARS;

        if (strstr($HTTP_SERVER_VARS['HTTP_ACCEPT_ENCODING'], 'gzip')) {
                if (function_exists ('gzencode')) {
                        $Page = gzencode ($Page);
                        header("Content-Encoding: gzip");
                }
        }

        header ("Content-Length: " . strlen ($Page));
        print ($Page);
}



?>