static function sendFile($path, $saveAs = null, $exit = true) { //Might potentially remove ".." from path, but it has already been removed by the time the request gets here by server or browser. Still removing for precaution $path = Files::removeRelative($path); if (is_file($path)) { $mime = Files::mime($path); header('Content-Type: ' . $mime); if ($saveAs) { header('Content-Description: File Transfer'); if (strlen($saveAs) > 1) { $fileName = $saveAs; } else { $fileName = array_pop(explode('/', $path)); } header('Content-Disposition: attachment; filename="' . self::escapeFilename($fileName) . '"'); } echo file_get_contents($path); } elseif ($_ENV['resourceNotFound']) { Config::loadUserFiles($_ENV['resourceNotFound'], 'control'); } else { Debug::toss('Request handler encountered unresolvable file. Searched at ' . $path); } if ($exit) { exit; } }
/** @param eLevel error level @param eStr error string @param eFile error file @param eLine error line */ static function handleError($eLevel, $eStr, $eFile, $eLine, $context = null, $bTrace = null, $type = 'ERROR') { if (ini_get('error_reporting') == 0) { # @ Error control operator used return; } $code = self::getLine($eFile, $eLine); $eFile = self::abbreviateFilePath($eFile); $eFile = preg_replace('@' . PR . '@', '', $eFile); $header = "+=+=+=+ " . date("Y-m-d H:i:s") . ' | ' . $_ENV['projectName'] . " | {$type} | " . self::abbreviateFilePath($eFile) . ":{$eLine} +=+=+=+\n{$eStr}\n"; $err = ''; if ($_ENV['errorDetail'] > 0) { if (!$bTrace) { $bTrace = debug_backtrace(); } //php has some odd backtracing so need various conditions to remove excessive data if ($bTrace[0]['file'] == '' && $bTrace[0]['class'] == 'Debug') { array_shift($bTrace); } //remove undesired stack points, and non-named points stemming from foreach ($bTrace as $k => &$v) { $v['shortName'] = self::abbreviateFilePath($v['file']); foreach ($_ENV['errorStackExclude'] as $exclusionPattern) { if (!$v['file']) { $unnamed++; } else { if ($found = preg_match($exclusionPattern, $v['shortName'])) { array_splice($bTrace, $k - $unnamed, 1 + $unnamed); } $unnamed = 0; } } } foreach ($bTrace as $v) { $err .= "\n" . '(-' . $v['line'] . '-) ' . $v['shortName'] . "\n"; $code = self::getLine($v['file'], $v['line']); if ($v['class']) { $err .= "\t" . 'Class: ' . $v['class'] . $v['type'] . "\n"; } $err .= "\t" . 'Function: ' . $v['function'] . "\n"; if ($code) { $err .= "\t" . 'Line: ' . $code . "\n"; } if ($v['args'] && $_ENV['errorDetail'] > 1) { $err .= "\t" . 'Arguments: ' . "\n"; $args = self::toString($v['args']); $err .= substr($args, 2, -2) . "\n"; /* $err .= preg_replace( array("@^array \(\n@","@\n\)$@","@\n@"), array("\t\t",'',"\n\t\t"), $args)."\n";*/ } } if ($_ENV['errorDetail'] > 2) { $err .= "\nServer Var:\n:" . self::toString($_SERVER); $err .= "\nRequest-----\nUri:" . $_SERVER['REQUEST_URI'] . "\nVar:" . self::toString($_REQUEST); $err .= "\n\nFile includes:\n" . self::toString(Files::getIncluded()); } $err .= "\n"; } //identify error $errorHash = sha1($err); $header = 'Error Id: ' . $errorHash . "\n" . $header; $err = $header . $err; $file = $_ENV['logLocation']; if (!file_exists($file) || filesize($file) > Tool::byteSize($_ENV['maxLogSize'])) { $mode = 'w'; } else { $mode = 'a+'; } $fh = fopen($file, $mode); fwrite($fh, $err); if (!$_ENV['inScript']) { if ($_ENV['errorPage']) { Config::loadUserFiles($_ENV['errorPage'], '.', null, ['error' => $err, 'errorId' => $errorHash]); exit; } if ($_ENV['errorMessage']) { if (is_array($_ENV['errorMessage'])) { $message = $_ENV['errorMessage'][rand(0, count($_ENV['errorMessage']) - 1)]; } else { $message = $_ENV['errorMessage']; } preg_replace('@\\$errorId@', $errorHash, $message); echo $message; } } if ($_ENV['displayErrors']) { self::sendout($err); } exit; }
<?php /// logic unrelated to a specific request /** @file */ #Tool, used by config require_once $_ENV['systemFolder'] . 'tool/Tool.php'; #used by autoloader require_once $_ENV['systemFolder'] . 'tool/Arrays.php'; require_once $_ENV['systemFolder'] . 'tool/Hook.php'; require_once $_ENV['systemFolder'] . 'tool/CommonTraits.php'; #Config setting require_once $_ENV['systemFolder'] . 'tool/Config.php'; Config::init(); #Autoloader require_once $_ENV['systemFolder'] . 'tool/Autoload.php'; $autoload = Autoload::init(null, $_ENV['autoloadIncludes']); spl_autoload_register(array($autoload, 'auto')); #composer autload if (is_file($_ENV['composerFolder'] . 'autoload.php')) { require_once $_ENV['composerFolder'] . 'autoload.php'; } set_error_handler($_ENV['errorHandler'], $_ENV['errorsHandled']); set_exception_handler($_ENV['exceptionHandler']); Config::loadUserFiles($_ENV['preRoute']); #pre session request handling; for file serving and such. require_once $_ENV['systemFolder'] . 'tool/control/Route.php'; \control\Route::handle($_SERVER['REQUEST_URI']);