diff options
| author | Philipp Schüttlöffel <schuettloeffel@zqs.uni-hannover.de> | 2024-09-24 10:53:31 +0200 |
|---|---|---|
| committer | Philipp Schüttlöffel <schuettloeffel@zqs.uni-hannover.de> | 2024-09-24 10:53:31 +0200 |
| commit | 4459dd7917f4d1c34f40bb68f0e991e9c3d53e4c (patch) | |
| tree | 5c07151ae61276d334e88f6309c30d439a85c12e /vendor/trails | |
| parent | da0022e5c1abbf9825ae76debaabdff7e8623bb4 (diff) | |
| parent | 97a188592c679890a25c37ab78463add76a52ff7 (diff) | |
Merge branch 'main' into issue-3911issue-3911
Diffstat (limited to 'vendor/trails')
| -rw-r--r-- | vendor/trails/extras/tramp.php | 55 | ||||
| -rw-r--r-- | vendor/trails/src/HEADER.php | 27 | ||||
| -rw-r--r-- | vendor/trails/src/controller.php | 438 | ||||
| -rw-r--r-- | vendor/trails/src/dispatcher.php | 271 | ||||
| -rw-r--r-- | vendor/trails/src/exception.php | 101 | ||||
| -rw-r--r-- | vendor/trails/src/flash.php | 241 | ||||
| -rw-r--r-- | vendor/trails/src/inflector.php | 49 | ||||
| -rw-r--r-- | vendor/trails/src/response.php | 166 | ||||
| -rw-r--r-- | vendor/trails/src/trails.php | 16 | ||||
| -rw-r--r-- | vendor/trails/trails-abridged.php | 2 | ||||
| -rw-r--r-- | vendor/trails/trails.php | 1297 |
11 files changed, 0 insertions, 2663 deletions
diff --git a/vendor/trails/extras/tramp.php b/vendor/trails/extras/tramp.php deleted file mode 100644 index 9292a96..0000000 --- a/vendor/trails/extras/tramp.php +++ /dev/null @@ -1,55 +0,0 @@ -<?php - -# Copyright (c) 2007 - Marcus Lunzenauer <mlunzena@uos.de> -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - - -class Tramp_Controller extends Trails_Controller { - - /** - * Extracts action and args from a string. - * - * @param string the processed string - * - * @return arraye an array with two elements - a string containing the - * action and an array of strings representing the args - */ - protected function extract_action_and_args($string) { - return array($this->get_verb(), explode('/', $string)); - } - - - protected function map_action($action) { - return strtolower($action); - } - - - protected function get_verb() { - - $verb = strtoupper(isset($_REQUEST['_method']) - ? $_REQUEST['_method'] : @$_SERVER['REQUEST_METHOD']); - - if (!preg_match('/^DELETE|GET|POST|PUT|HEAD|OPTIONS$/', $verb)) { - throw new Trails_Exception(405); - } - - return $verb; - } -} diff --git a/vendor/trails/src/HEADER.php b/vendor/trails/src/HEADER.php deleted file mode 100644 index 75bb516..0000000 --- a/vendor/trails/src/HEADER.php +++ /dev/null @@ -1,27 +0,0 @@ -<? - -# Copyright (c) 2007 - Marcus Lunzenauer <mlunzena@uos.de> -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - - -/** - * The version of the trails library. - */ -define('TRAILS_VERSION', '0.6.9'); diff --git a/vendor/trails/src/controller.php b/vendor/trails/src/controller.php deleted file mode 100644 index c8e7b8e..0000000 --- a/vendor/trails/src/controller.php +++ /dev/null @@ -1,438 +0,0 @@ -<?php - -/** - * A Trails_Controller is responsible for matching the unconsumed part of an URI - * to an action using the left over words as arguments for that action. The - * action is then mapped to method of the controller instance which is called - * with the just mentioned arguments. That method can send the #render_action, - * #render_template, #render_text, #render_nothing or #redirect method. - * Otherwise the #render_action is called with the current action as argument. - * If the action method sets instance variables during performing, they will be - * be used as attributes for the flexi-template opened by #render_action or - * #render_template. A controller's response's body is populated with the output - * of the #render_* methods. The action methods can add additional headers or - * change the status of that response. - * - * @package trails - * - * @author mlunzena - * @copyright (c) Authors - * @version $Id: trails.php 7001 2008-04-04 11:20:27Z mlunzena $ - */ - -class Trails_Controller { - - - /** - * @ignore - */ - protected - $dispatcher, - $response, - $performed, - $layout; - - - /** - * Constructor. - * - * @param mixed the dispatcher who creates this instance - * - * @return void - */ - function __construct($dispatcher) { - $this->dispatcher = $dispatcher; - $this->erase_response(); - } - - - /** - * Resets the response of the controller - * - * @return void - */ - function erase_response() { - $this->performed = FALSE; - $this->response = new Trails_Response(); - } - - - /** - * Return this controller's response - * - * @return mixed the controller's response - */ - function get_response() { - return $this->response; - } - - - /** - * This method extracts an action string and further arguments from it's - * parameter. The action string is mapped to a method being called afterwards - * using the said arguments. That method is called and a response object is - * generated, populated and sent back to the dispatcher. - * - * @param type <description> - * - * @return type <description> - */ - function perform($unconsumed) { - - list($action, $args, $format) = $this->extract_action_and_args($unconsumed); - - $this->format = isset($format) ? $format : 'html'; - - $before_filter_result = $this->before_filter($action, $args); - - # send action to controller - # TODO (mlunzena) shouldn't the after filter be triggered too? - if (!(FALSE === $before_filter_result || $this->performed)) { - - $callable = $this->map_action($action); - - if (is_callable($callable)) { - call_user_func_array($callable, $args); - } - else { - $this->does_not_understand($action, $args); - } - - if (!$this->performed) { - $this->render_action($action); - } - - $this->after_filter($action, $args); - } - - return $this->response; - } - - - /** - * Extracts action and args from a string. - * - * @param string the processed string - * - * @return array an array with two elements - a string containing the - * action and an array of strings representing the args - */ - function extract_action_and_args($string) { - - if ('' === $string) { - return $this->default_action_and_args(); - } - - // find optional file extension - $format = NULL; - if (preg_match('/^(.*[^\/.])\.(\w+)$/', $string, $matches)) { - list($_, $string, $format) = $matches; - } - - // TODO this should possibly remove empty tokens - $args = explode('/', $string); - $action = array_shift($args); - return array($action, $args, $format); - } - - /** - * Return the default action and arguments - * - * @return an array containing the action, an array of args and the format - * - */ - function default_action_and_args() { - return array('index', array(), NULL); - } - - /** - * Maps the action to an actual method name. - * - * @param string the action - * - * @return string the mapped method name - */ - function map_action($action) { - return array(&$this, $action . '_action'); - } - - - /** - * Callback function being called before an action is executed. If this - * function does not return FALSE, the action will be called, otherwise - * an error will be generated and processing will be aborted. If this function - * already #rendered or #redirected, further processing of the action is - * withheld. - * - * @param string Name of the action to perform. - * @param array An array of arguments to the action. - * - * @return bool - */ - function before_filter(&$action, &$args) { - } - - - /** - * Callback function being called after an action is executed. - * - * @param string Name of the action to perform. - * @param array An array of arguments to the action. - * - * @return void - */ - function after_filter($action, $args) { - } - - - /** - * <MethodDescription> - * - * @param type <description> - * @param type <description> - * - * @return void - */ - function does_not_understand($action, $args) { - throw new Trails_UnknownAction("No action responded to '$action'."); - } - - - /** - * <MethodDescription> - * - * @param string <description> - * - * @return void - */ - function redirect($to) { - - if ($this->performed) { - throw new Trails_DoubleRenderError(); - } - - $this->performed = TRUE; - - # get uri; keep absolute URIs - $url = preg_match('#^(/|\w+://)#', $to) - ? $to - : $this->url_for($to); - - $this->response->add_header('Location', $url)->set_status(302); - } - - - /** - * Renders the given text as the body of the response. - * - * @param string the text to be rendered - * - * @return void - */ - function render_text($text = ' ') { - - if ($this->performed) { - throw new Trails_DoubleRenderError(); - } - - $this->performed = TRUE; - - $this->response->set_body($text); - } - - - /** - * Renders the empty string as the response's body. - * - * @return void - */ - function render_nothing() { - $this->render_text(''); - } - - - /** - * Renders the template of the given action as the response's body. - * - * @param string the action - * - * @return void - */ - function render_action($action) { - $this->render_template($this->get_default_template($action), $this->layout); - } - - - function get_default_template($action) - { - $class = get_class($this); - $controller_name = - Trails_Inflector::underscore(substr($class, 0, -10)); - return $controller_name.'/'.$action; - } - - - /** - * Renders a template using an optional layout template. - * - * @param mixed a flexi template - * @param mixes a flexi template which is used as layout - * - * @return void - */ - function render_template($template_name, $layout = NULL) { - - # open template - $factory = $this->get_template_factory(); - $template = $factory->open($template_name); - - # template requires setup ? - switch (get_class($template)) { - case 'Flexi_JsTemplate': - $this->set_content_type('text/javascript'); - break; - } - - $template->set_attributes($this->get_assigned_variables()); - - if (isset($layout)) { - $template->set_layout($layout); - } - - $this->render_text($template->render()); - } - - - /** - * Create and return a template factory for this controller. - * - * @return a Flexi_TemplateFactory - */ - function get_template_factory() { - return new Flexi_TemplateFactory($this->dispatcher->trails_root . - '/views/'); - } - - - /** - * This method returns all the set instance variables to be used as attributes - * for a template. This controller is returned too as value for - * key 'controller'. - * - * @return array an associative array of variables for the template - */ - function get_assigned_variables() { - - $assigns = array(); - $protected = get_class_vars(get_class($this)); - - foreach (get_object_vars($this) as $var => $value) { - if (!array_key_exists($var, $protected)) { - $assigns[$var] =& $this->$var; - } - } - - $assigns['controller'] = $this; - - return $assigns; - } - - - /** - * Sets the layout to be used by this controller per default. - * - * @param mixed a flexi template to be used as layout - * - * @return void - */ - function set_layout($layout) { - $this->layout = $layout; - } - - - /** - * Returns a URL to a specified route to your Trails application. - * - * Example: - * Your Trails application is located at 'http://example.com/dispatch.php'. - * So your dispatcher's trails_uri is set to 'http://example.com/dispatch.php' - * If you want the URL to your 'wiki' controller with action 'show' and - * parameter 'page' you should send: - * - * $url = $controller->url_for('wiki/show', 'page'); - * - * $url should then contain 'http://example.com/dispatch.php/wiki/show/page'. - * - * The first parameter is a string containing the controller and optionally an - * action: - * - * - "{controller}/{action}" - * - "path/to/controller/action" - * - "controller" - * - * This "controller/action" string is not url encoded. You may provide - * additional parameter which will be urlencoded and concatenated with - * slashes: - * - * $controller->url_for('wiki/show', 'page'); - * -> 'wiki/show/page' - * - * $controller->url_for('wiki/show', 'page', 'one and a half'); - * -> 'wiki/show/page/one+and+a+half' - * - * @param string a string containing a controller and optionally an action - * @param strings optional arguments - * - * @return string a URL to this route - */ - function url_for($to/*, ...*/) { - - # urlencode all but the first argument - $args = func_get_args(); - $args = array_map('urlencode', $args); - $args[0] = $to; - - return $this->dispatcher->trails_uri . '/' . join('/', $args); - } - - - /** - * <MethodDescription> - * - * @param type <description> - * - * @return type <description> - */ - function set_status($status, $reason_phrase = NULL) { - $this->response->set_status($status, $reason_phrase); - } - - - /** - * Sets the content type of the controller's response. - * - * @param string the content type - * - * @return void - */ - function set_content_type($type) { - $this->response->add_header('Content-Type', $type); - } - - - /** - * Exception handler called when the performance of an action raises an - * exception. - * - * @param object the thrown exception - * - * @return object a response object - */ - function rescue($exception) { - return $this->dispatcher->trails_error($exception); - } - - function respond_to($ext) { - return $this->format === $ext; - } -} diff --git a/vendor/trails/src/dispatcher.php b/vendor/trails/src/dispatcher.php deleted file mode 100644 index 59bf8d9..0000000 --- a/vendor/trails/src/dispatcher.php +++ /dev/null @@ -1,271 +0,0 @@ -<?php - -/** - * The Dispatcher is used to map an incoming HTTP request to a Controller - * producing a response which is then rendered. To initialize an instance of - * class Trails_Dispatcher you have to give three configuration settings: - * - * trails_root - the absolute file path to a directory containing the - * applications controllers, views etc. - * trails_uri - the URI to which routes to mapped Controller/Actions - * are appended - * default_controller - the route to a controller, that is used if no - * controller is given, that is the route is equal to '/' - * - * After instantiation of a dispatcher you have to call method #dispatch with - * the request uri to be mapped to a controller/action pair. - * - * @package trails - * - * @author mlunzena - * @copyright (c) Authors - * @version $Id: trails.php 7001 2008-04-04 11:20:27Z mlunzena $ - */ - -class Trails_Dispatcher { - - # TODO (mlunzena) Konfiguration muss anders geschehen - - /** - * This is the absolute file path to the trails application directory. - * - * @access public - * @var string - */ - public $trails_root; - - - /** - * This is the URI to which routes to controller/actions are appended. - * - * @access public - * @var string - */ - public $trails_uri; - - - /** - * This variable contains the route to the default controller. - * - * @access public - * @var string - */ - public $default_controller; - - - /** - * Constructor. - * - * @param string absolute file path to a directory containing the - * applications controllers, views etc. - * @param string the URI to which routes to mapped Controller/Actions - * are appended - * @param string the route to a controller, that is used if no - * controller is given, that is the route is equal to '/' - * - * @return void - */ - function __construct($trails_root, - $trails_uri, - $default_controller) { - - $this->trails_root = $trails_root; - $this->trails_uri = $trails_uri; - $this->default_controller = $default_controller; - } - - - /** - * Maps a string to a response which is then rendered. - * - * @param string The requested URI. - * - * @return void - */ - function dispatch($uri) { - - # E_USER_ERROR|E_USER_WARNING|E_USER_NOTICE|E_RECOVERABLE_ERROR = 5888 - $old_handler = set_error_handler(array($this, 'error_handler'), 5888); - - ob_start(); - $level = ob_get_level(); - - $this->map_uri_to_response($this->clean_request_uri((string) $uri))->output(); - - while (ob_get_level() >= $level) { - ob_end_flush(); - } - - if (isset($old_handler)) { - set_error_handler($old_handler); - } - } - - - /** - * Maps an URI to a response by figuring out first what controller to - * instantiate, then delegating the unconsumed part of the URI to the - * controller who returns an appropriate response object or throws a - * Trails_Exception. - * - * @param string the URI string - * - * @return mixed a response object - */ - function map_uri_to_response($uri) { - - try { - - list($controller_path, $unconsumed) = - '' === $uri - ? $this->default_route() - : $this->parse($uri); - - $controller = $this->load_controller($controller_path); - - $response = $controller->perform($unconsumed); - - } catch (Exception $e) { - - $response = isset($controller) ? $controller->rescue($e) - : $this->trails_error($e); - } - - return $response; - } - - - /** - * - * @return array an array containing the default controller and an - * empty unconsumed route - */ - function default_route() { - if (!$this->file_exists($this->default_controller . '.php')) { - throw new Trails_MissingFile( - "Default controller '{$this->default_controller}' not found'"); - } - return array($this->default_controller, ''); - } - - - function trails_error($exception) { - ob_clean(); - - # show details for local requests - $detailed = @$_SERVER['REMOTE_ADDR'] === '127.0.0.1'; - - $body = sprintf('<html><head><title>Trails Error</title></head>'. - '<body><h1>%s</h1><pre>%s</pre></body></html>', - htmlentities($exception->__toString()), - $detailed - ? htmlentities($exception->getTraceAsString()) - : ''); - - if ($exception instanceof Trails_Exception) { - $response = new Trails_Response($body, - $exception->headers, - $exception->getCode(), - $exception->getMessage()); - } - else { - $response = new Trails_Response($body, array(), 500, - $exception->getMessage()); - } - - return $response; - } - - - /** - * Clean up URI string by removing the query part and leading slashes. - * - * @param string an URI string - * - * @return string the cleaned string - */ - function clean_request_uri($uri) { - if (FALSE !== ($pos = strpos($uri, '?'))) { - $uri = substr($uri, 0, $pos); - } - return ltrim($uri, '/'); - } - - - /** - * <MethodDescription> - * - * @param type <description> - * @param type <description> - * - * @return type <description> - */ - function parse($unconsumed, $controller = NULL) { - list($head, $tail) = $this->split_on_first_slash($unconsumed); - - if (!preg_match('/^\w+$/', $head)) { - throw new Trails_RoutingError("No route matches '$head'"); - } - - $controller = (isset($controller) ? $controller . '/' : '') . $head; - - if ($this->file_exists($controller . '.php')) { - return array($controller, $tail); - } - else if ($this->file_exists($controller)) { - return $this->parse($tail, $controller); - } - - throw new Trails_RoutingError("No route matches '$head'"); - } - - function split_on_first_slash($str) { - preg_match(":([^/]*)(/+)?(.*):", $str, $matches); - return array($matches[1], $matches[3]); - } - - function file_exists($path) { - return file_exists("{$this->trails_root}/controllers/$path"); - } - - /** - * Loads the controller file for a given controller path and return an - * instance of that controller. If an error occures, an exception will be - * thrown. - * - * @param string the relative controller path - * - * @return TrailsController an instance of that controller - */ - function load_controller($controller) { - require_once "{$this->trails_root}/controllers/{$controller}.php"; - $class = Trails_Inflector::camelize($controller) . 'Controller'; - if (!class_exists($class)) { - throw new Trails_UnknownController("Controller missing: '$class'"); - } - return new $class($this); - } - - - /** - * This method transforms E_USER_* and E_RECOVERABLE_ERROR to - * Trails_Exceptions. - * - * @param integer the level of the error raised - * @param string the error message - * @param string the filename that the error was raised in - * @param integer the line number the error was raised at - * @param array an array of every variable that existed in the scope the - * error was triggered in - * - * @throws Trails_Exception - * - * @return void - */ - function error_handler($errno, $string, $file, $line, $context) { - if (!(5888 & $errno)) { - return false; - } - throw new Trails_Exception(500, $string); - } -} diff --git a/vendor/trails/src/exception.php b/vendor/trails/src/exception.php deleted file mode 100644 index 4c21831..0000000 --- a/vendor/trails/src/exception.php +++ /dev/null @@ -1,101 +0,0 @@ -<?php - -/** - * TODO - * - * @package trails - * - * @author mlunzena - * @copyright (c) Authors - * @version $Id: trails.php 7001 2008-04-04 11:20:27Z mlunzena $ - */ - -class Trails_Exception extends Exception { - - /** - * <FieldDescription> - * - * @access private - * @var <type> - */ - public $headers; - - - /** - * @param int the status code to be set in the response - * @param string a human readable presentation of the status code - * @param array a hash of additional headers to be set in the response - * - * @return void - */ - function __construct($status = 500, $reason = NULL, $headers = array()) { - if ($reason === NULL) { - $reason = Trails_Response::get_reason($status); - } - parent::__construct($reason, $status); - $this->headers = $headers; - } - - - /** - * <MethodDescription> - * - * @param type <description> - * - * @return type <description> - */ - function __toString() { - return "{$this->code} {$this->message}"; - } -} - - -class Trails_DoubleRenderError extends Trails_Exception { - - function __construct() { - $message = - "Render and/or redirect were called multiple times in this action. ". - "Please note that you may only call render OR redirect, and at most ". - "once per action."; - parent::__construct(500, $message); - } -} - - -class Trails_MissingFile extends Trails_Exception { - function __construct($message) { - parent::__construct(500, $message); - } -} - - -class Trails_RoutingError extends Trails_Exception { - - function __construct($message) { - parent::__construct(400, $message); - } -} - - -class Trails_UnknownAction extends Trails_Exception { - - function __construct($message) { - parent::__construct(404, $message); - } -} - - -class Trails_UnknownController extends Trails_Exception { - - function __construct($message) { - parent::__construct(404, $message); - } -} - - -class Trails_SessionRequiredException extends Trails_Exception { - function __construct() { - $message = "Tried to access a non existing session."; - parent::__construct(500, $message); - } -} diff --git a/vendor/trails/src/flash.php b/vendor/trails/src/flash.php deleted file mode 100644 index cee08e5..0000000 --- a/vendor/trails/src/flash.php +++ /dev/null @@ -1,241 +0,0 @@ -<?php - -/** - * The flash provides a way to pass temporary objects between actions. - * Anything you place in the flash will be exposed to the very next action and - * then cleared out. This is a great way of doing notices and alerts, such as - * a create action that sets - * <tt>$flash->set('notice', "Successfully created")</tt> - * before redirecting to a display action that can then expose the flash to its - * template. - * - * @package trails - * - * @author mlunzena - * @copyright (c) Authors - * @version $Id: trails.php 7001 2008-04-04 11:20:27Z mlunzena $ - */ - -class Trails_Flash implements ArrayAccess { - - - /** - * @ignore - */ - public - $flash = array(), $used = array(); - - - /** - * <MethodDescription> - * - * @return type <description> - */ - static function instance() { - - if (!isset($_SESSION)) { - throw new Trails_SessionRequiredException(); - } - - - if (!isset($_SESSION['trails_flash'])) { - $_SESSION['trails_flash'] = new Trails_Flash(); - } - return $_SESSION['trails_flash']; - } - - - function offsetExists($offset) { - return isset($this->flash[$offset]); - } - - - function offsetGet($offset) { - return $this->get($offset); - } - - - function offsetSet($offset, $value) { - $this->set($offset, $value); - } - - - function offsetUnset($offset) { - unset($this->flash[$offset], $this->used[$offset]); - } - - - /** - * Used internally by the <tt>keep</tt> and <tt>discard</tt> methods - * use() # marks the entire flash as used - * use('msg') # marks the "msg" entry as used - * use(null, false) # marks the entire flash as unused - * # (keeps it around for one more action) - * use('msg', false) # marks the "msg" entry as unused - * # (keeps it around for one more action) - * - * @param mixed a key. - * @param bool used flag. - * - * @return void - */ - function _use($k = NULL, $v = TRUE) { - if ($k) { - $this->used[$k] = $v; - } - else { - foreach ($this->used as $k => $value) { - $this->_use($k, $v); - } - } - } - - - /** - * Marks the entire flash or a single flash entry to be discarded by the end - * of the current action. - * - * $flash->discard() # discards entire flash - * # (it'll still be available for the - * # current action) - * $flash->discard('warning') # discard the "warning" entry - * # (it'll still be available for the - * # current action) - * - * @param mixed a key. - * - * @return void - */ - function discard($k = NULL) { - $this->_use($k); - } - - - /** - * Returns the value to the specified key. - * - * @param mixed a key. - * - * @return mixed the key's value. - */ - function &get($k) { - $return = NULL; - if (isset($this->flash[$k])) { - $return =& $this->flash[$k]; - } - return $return; - } - - - /** - * Keeps either the entire current flash or a specific flash entry available - * for the next action: - * - * $flash->keep() # keeps the entire flash - * $flash->keep('notice') # keeps only the "notice" entry, the rest of - * # the flash is discarded - * - * @param mixed a key. - * - * @return void - */ - function keep($k = NULL) { - $this->_use($k, FALSE); - } - - - /** - * Sets a key's value. - * - * @param mixed a key. - * @param mixed its value. - * - * @return void - */ - function set($k, $v) { - $this->keep($k); - $this->flash[$k] = $v; - } - - - /** - * Sets a key's value by reference. - * - * @param mixed a key. - * @param mixed its value. - * - * @return void - */ - function set_ref($k, &$v) { - $this->keep($k); - $this->flash[$k] =& $v; - } - - - - /** - * <MethodDescription> - * - * @return type <description> - */ - function sweep() { - - # remove used values - foreach (array_keys($this->flash) as $k) { - if ($this->used[$k]) { - unset($this->flash[$k], $this->used[$k]); - } else { - $this->_use($k); - } - } - - # cleanup if someone meddled with flash or used - $fkeys = array_keys($this->flash); - $ukeys = array_keys($this->used); - foreach (array_diff($fkeys, $ukeys) as $k => $v) { - unset($this->used[$k]); - } - } - - - /** - * <MethodDescription> - * - * @return type <description> - */ - function __toString() { - $values = array(); - foreach ($this->flash as $k => $v) { - $values[] = sprintf("'%s': [%s, '%s']", - $k, var_export($v, TRUE), - $this->used[$k] ? "used" : "unused"); - } - return "{" . join(", ", $values) . "}\n"; - } - - - /** - * <MethodDescription> - * - * @param type <description> - * - * @return type <description> - */ - function __sleep() { - $this->sweep(); - return array('flash', 'used'); - } - - - /** - * <MethodDescription> - * - * @param type <description> - * - * @return type <description> - */ - function __wakeUp() { - $this->discard(); - } -} - diff --git a/vendor/trails/src/inflector.php b/vendor/trails/src/inflector.php deleted file mode 100644 index 6646eee..0000000 --- a/vendor/trails/src/inflector.php +++ /dev/null @@ -1,49 +0,0 @@ -<?php - -/** - * The Inflector class is a namespace for inflections methods. - * - * @package trails - * - * @author mlunzena - * @copyright (c) Authors - * @version $Id: trails.php 7001 2008-04-04 11:20:27Z mlunzena $ - */ - -class Trails_Inflector { - - - /** - * Returns a camelized string from a lower case and underscored string by - * replacing slash with underscore and upper-casing each letter preceded - * by an underscore. TODO - * - * @param string String to camelize. - * - * @return string Camelized string. - */ - static function camelize($word) { - $parts = explode('/', $word); - foreach ($parts as $key => $part) { - $parts[$key] = str_replace(' ', '', - ucwords(str_replace('_', ' ', $part))); - } - return join('_', $parts); - } - - - /** - * <MethodDescription> - * - * @param type <description> - * - * @return type <description> - */ - static function underscore($word) { - $parts = explode('_', $word); - foreach ($parts as $key => $part) { - $parts[$key] = preg_replace('/(?<=\w)([A-Z])/', '_\\1', $part); - } - return strtolower(join('/', $parts)); - } -} diff --git a/vendor/trails/src/response.php b/vendor/trails/src/response.php deleted file mode 100644 index 474bfc1..0000000 --- a/vendor/trails/src/response.php +++ /dev/null @@ -1,166 +0,0 @@ -<?php - -/** - * This class represents a response returned by a controller that was asked to - * perform for a given request. A Trails_Response contains the body, status and - * additional headers which can be renderer back to the client. - * - * @package trails - * - * @author mlunzena - * @copyright (c) Authors - * @version $Id: trails.php 7001 2008-04-04 11:20:27Z mlunzena $ - */ - -class Trails_Response { - - - /** - * @ignore - */ - public - $body = '', - $status, - $reason, - $headers = array(); - - - /** - * Constructor. - * - * @param string the body of the response defaulting to '' - * @param array an array of additional headers defaulting to an - * empty array - * @param integer the status code of the response defaulting to a - * regular 200 - * @param string the descriptional reason for a status code defaulting to - * the standard reason phrases defined in RFC 2616 - * - * @return void - */ - function __construct($body = '', $headers = array(), - $status = NULL, $reason = NULL) { - - $this->set_body($body); - - $this->headers = $headers; - - if (isset($status)) { - $this->set_status($status, $reason); - } - } - - - /** - * Sets the body of the response. - * - * @param string the body - * - * @return mixed this response object. Useful for cascading method calls. - */ - function set_body($body) { - $this->body = $body; - return $this; - } - - - /** - * Sets the status code and an optional custom reason. If none is given, the - * standard reason phrase as of RFC 2616 is used. - * - * @param integer the status code - * @param string the custom reason, defaulting to the one given in RFC 2616 - * - * @return mixed this response object. Useful for cascading method calls. - */ - function set_status($status, $reason = NULL) { - $this->status = $status; - $this->reason = isset($reason) ? $reason : self::get_reason($status); - return $this; - } - - - /** - * Returns the reason phrase of this response according to RFC2616. - * - * @param int the response's status - * - * @return string the reason phrase for this response's status - */ - public static function get_reason($status) { - $reason = array( - 100 => 'Continue', 'Switching Protocols', - 200 => 'OK', 'Created', 'Accepted', 'Non-Authoritative Information', - 'No Content', 'Reset Content', 'Partial Content', - 300 => 'Multiple Choices', 'Moved Permanently', 'Found', 'See Other', - 'Not Modified', 'Use Proxy', '(Unused)', 'Temporary Redirect', - 400 => 'Bad Request', 'Unauthorized', 'Payment Required','Forbidden', - 'Not Found', 'Method Not Allowed', 'Not Acceptable', - 'Proxy Authentication Required', 'Request Timeout', 'Conflict', - 'Gone', 'Length Required', 'Precondition Failed', - 'Request Entity Too Large', 'Request-URI Too Long', - 'Unsupported Media Type', 'Requested Range Not Satisfiable', - 'Expectation Failed', - 500 => 'Internal Server Error', 'Not Implemented', 'Bad Gateway', - 'Service Unavailable', 'Gateway Timeout', - 'HTTP Version Not Supported'); - - return isset($reason[$status]) ? $reason[$status] : ''; - } - - - /** - * Adds an additional header to the response. - * - * @param string the left hand key part - * @param string the right hand value part - * - * @return mixed this response object. Useful for cascading method calls. - */ - function add_header($key, $value) { - $this->headers[$key] = $value; - return $this; - } - - - /** - * Outputs this response to the client using "echo" and "header". - * - * @return void - */ - function output() { - if (isset($this->status)) { - $this->send_header(sprintf('HTTP/1.1 %d %s', - $this->status, $this->reason), - TRUE, - $this->status); - } - - foreach ($this->headers as $k => $v) { - $this->send_header("$k: $v"); - } - - echo $this->body; - } - - - /** - * Internally used function to actually send headers - * - * @param string the HTTP header - * @param bool optional; TRUE if previously sent header should be - * replaced - FALSE otherwise (default) - * @param integer optional; the HTTP response code - * - * @return void - */ - function send_header($header, $replace = FALSE, $status = NULL) { - if (isset($status)) { - header($header, $replace, $status); - } - else { - header($header, $replace); - } - } -} - diff --git a/vendor/trails/src/trails.php b/vendor/trails/src/trails.php deleted file mode 100644 index 2e9e8e2..0000000 --- a/vendor/trails/src/trails.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php -function fgc($files/*, ... */) { - $result = ''; - $files = func_get_args(); - foreach ($files as $file) { - $string = file_get_contents(dirname(__FILE__)."/$file.php"); - $result .= preg_replace("/^(<\?(php)?)|(\?>)\s*\v+$/", "", $string); - } - return $result; -} -?> -<?= "<?php" ?> -<?= fgc("HEADER") ?> - -<?= fgc("dispatcher", "response", "controller", - "inflector", "flash", "exception") ?> diff --git a/vendor/trails/trails-abridged.php b/vendor/trails/trails-abridged.php deleted file mode 100644 index 812c1f1..0000000 --- a/vendor/trails/trails-abridged.php +++ /dev/null @@ -1,2 +0,0 @@ -<?php - define('TRAILS_VERSION','0.6.9');class Trails_Dispatcher{public$trails_root;public$trails_uri;public$default_controller;function __construct($trails_root,$trails_uri,$default_controller){$this->trails_root=$trails_root;$this->trails_uri=$trails_uri;$this->default_controller=$default_controller;}function dispatch($uri){$old_handler=set_error_handler(array($this,'error_handler'),5888);ob_start();$level=ob_get_level();$this->map_uri_to_response($this->clean_request_uri((string)$uri))->output();while(ob_get_level()>=$level){ob_end_flush();}if(isset($old_handler)){set_error_handler($old_handler);}}function map_uri_to_response($uri){try{list($controller_path,$unconsumed)=''===$uri?$this->default_route():$this->parse($uri);$controller=$this->load_controller($controller_path);$response=$controller->perform($unconsumed);}catch(Exception$e){$response=isset($controller)?$controller->rescue($e):$this->trails_error($e);}return$response;}function default_route(){if(!$this->file_exists($this->default_controller.'.php')){throw new Trails_MissingFile("Default controller '{$this->default_controller}' not found'");}return array($this->default_controller,'');}function trails_error($exception){ob_clean();$detailed=@$_SERVER['REMOTE_ADDR']==='127.0.0.1';$body=sprintf('<html><head><title>Trails Error</title></head>'.'<body><h1>%s</h1><pre>%s</pre></body></html>',htmlentities($exception->__toString()),$detailed?htmlentities($exception->getTraceAsString()):'');if($exception instanceof Trails_Exception){$response=new Trails_Response($body,$exception->headers,$exception->getCode(),$exception->getMessage());}else{$response=new Trails_Response($body,array(),500,$exception->getMessage());}return$response;}function clean_request_uri($uri){if(FALSE!==($pos=strpos($uri,'?'))){$uri=substr($uri,0,$pos);}return ltrim($uri,'/');}function parse($unconsumed,$controller=NULL){list($head,$tail)=$this->split_on_first_slash($unconsumed);if(!preg_match('/^\w+$/',$head)){throw new Trails_RoutingError("No route matches '$head'");}$controller=(isset($controller)?$controller.'/':'').$head;if($this->file_exists($controller.'.php')){return array($controller,$tail);}else if($this->file_exists($controller)){return$this->parse($tail,$controller);}throw new Trails_RoutingError("No route matches '$head'");}function split_on_first_slash($str){preg_match(":([^/]*)(/+)?(.*):",$str,$matches);return array($matches[1],$matches[3]);}function file_exists($path){return file_exists("{$this->trails_root}/controllers/$path");}function load_controller($controller){require_once"{$this->trails_root}/controllers/{$controller}.php";$class=Trails_Inflector::camelize($controller).'Controller';if(!class_exists($class)){throw new Trails_UnknownController("Controller missing: '$class'");}return new$class($this);}function error_handler($errno,$string,$file,$line,$context){if(!(5888&$errno))return false;throw new Trails_Exception(500,$string);}}class Trails_Response{public$body='',$status,$reason,$headers=array();function __construct($body='',$headers=array(),$status=NULL,$reason=NULL){$this->set_body($body);$this->headers=$headers;if(isset($status)){$this->set_status($status,$reason);}}function set_body($body){$this->body=$body;return$this;}function set_status($status,$reason=NULL){$this->status=$status;$this->reason=isset($reason)?$reason:$this->get_reason($status);return$this;}function get_reason($status){$reason=array(100=>'Continue','Switching Protocols',200=>'OK','Created','Accepted','Non-Authoritative Information','No Content','Reset Content','Partial Content',300=>'Multiple Choices','Moved Permanently','Found','See Other','Not Modified','Use Proxy','(Unused)','Temporary Redirect',400=>'Bad Request','Unauthorized','Payment Required','Forbidden','Not Found','Method Not Allowed','Not Acceptable','Proxy Authentication Required','Request Timeout','Conflict','Gone','Length Required','Precondition Failed','Request Entity Too Large','Request-URI Too Long','Unsupported Media Type','Requested Range Not Satisfiable','Expectation Failed',500=>'Internal Server Error','Not Implemented','Bad Gateway','Service Unavailable','Gateway Timeout','HTTP Version Not Supported');return isset($reason[$status])?$reason[$status]:'';}function add_header($key,$value){$this->headers[$key]=$value;return$this;}function output(){if(isset($this->status)){$this->send_header(sprintf('HTTP/1.1 %d %s',$this->status,$this->reason),TRUE,$this->status);}foreach($this->headers as$k=>$v){$this->send_header("$k: $v");}echo$this->body;}function send_header($header,$replace=FALSE,$status=NULL){if(isset($status)){header($header,$replace,$status);}else{header($header,$replace);}}}class Trails_Controller{protected$dispatcher,$response,$performed,$layout;function __construct($dispatcher){$this->dispatcher=$dispatcher;$this->erase_response();}function erase_response(){$this->performed=FALSE;$this->response=new Trails_Response();}function get_response(){return$this->response;}function perform($unconsumed){list($action,$args,$format)=$this->extract_action_and_args($unconsumed);$this->format=isset($format)?$format:'html';$before_filter_result=$this->before_filter($action,$args);if(!(FALSE===$before_filter_result||$this->performed)){$callable=$this->map_action($action);if(is_callable($callable)){call_user_func_array($callable,$args);}else{$this->does_not_understand($action,$args);}if(!$this->performed){$this->render_action($action);}$this->after_filter($action,$args);}return$this->response;}function extract_action_and_args($string){if(''===$string){return$this->default_action_and_args();}$format=NULL;if(preg_match('/^(.*[^\/.])\.(\w+)$/',$string,$matches)){list($_,$string,$format)=$matches;}$args=explode('/',$string);$action=array_shift($args);return array($action,$args,$format);}function default_action_and_args(){return array('index',array(),NULL);}function map_action($action){return array(&$this,$action.'_action');}function before_filter(&$action,&$args){}function after_filter($action,$args){}function does_not_understand($action,$args){throw new Trails_UnknownAction("No action responded to '$action'.");}function redirect($to){if($this->performed){throw new Trails_DoubleRenderError();}$this->performed=TRUE;$url=preg_match('#^(/|\w+://)#',$to)?$to:$this->url_for($to);$this->response->add_header('Location',$url)->set_status(302);}function render_text($text=' '){if($this->performed){throw new Trails_DoubleRenderError();}$this->performed=TRUE;$this->response->set_body($text);}function render_nothing(){$this->render_text('');}function render_action($action){$this->render_template($this->get_default_template($action),$this->layout);}function get_default_template($action){$class=get_class($this);$controller_name=Trails_Inflector::underscore(substr($class,0,-10));return$controller_name.'/'.$action;}function render_template($template_name,$layout=NULL){$factory=$this->get_template_factory();$template=$factory->open($template_name);switch(get_class($template)){case'Flexi_JsTemplate':$this->set_content_type('text/javascript');break;}$template->set_attributes($this->get_assigned_variables());if(isset($layout)){$template->set_layout($layout);}$this->render_text($template->render());}function get_template_factory(){return new Flexi_TemplateFactory($this->dispatcher->trails_root.'/views/');}function get_assigned_variables(){$assigns=array();$protected=get_class_vars(get_class($this));foreach(get_object_vars($this)as$var=>$value){if(!array_key_exists($var,$protected)){$assigns[$var]=&$this->$var;}}$assigns['controller']=$this;return$assigns;}function set_layout($layout){$this->layout=$layout;}function url_for($to){$args=func_get_args();$args=array_map('urlencode',$args);$args[0]=$to;return$this->dispatcher->trails_uri.'/'.join('/',$args);}function set_status($status,$reason_phrase=NULL){$this->response->set_status($status,$reason_phrase);}function set_content_type($type){$this->response->add_header('Content-Type',$type);}function rescue($exception){return$this->dispatcher->trails_error($exception);}function respond_to($ext){return$this->format===$ext;}}class Trails_Inflector{static function camelize($word){$parts=explode('/',$word);foreach($parts as$key=>$part){$parts[$key]=str_replace(' ','',ucwords(str_replace('_',' ',$part)));}return join('_',$parts);}static function underscore($word){$parts=explode('_',$word);foreach($parts as$key=>$part){$parts[$key]=preg_replace('/(?<=\w)([A-Z])/','_\\1',$part);}return strtolower(join('/',$parts));}}class Trails_Flash implements ArrayAccess{public$flash=array(),$used=array();static function instance(){if(!isset($_SESSION)){throw new Trails_SessionRequiredException();}if(!isset($_SESSION['trails_flash'])){$_SESSION['trails_flash']=new Trails_Flash();}return$_SESSION['trails_flash'];}function offsetExists($offset){return isset($this->flash[$offset]);}function offsetGet($offset){return$this->get($offset);}function offsetSet($offset,$value){$this->set($offset,$value);}function offsetUnset($offset){unset($this->flash[$offset],$this->used[$offset]);}function _use($k=NULL,$v=TRUE){if($k){$this->used[$k]=$v;}else{foreach($this->used as$k=>$value){$this->_use($k,$v);}}}function discard($k=NULL){$this->_use($k);}function&get($k){$return=NULL;if(isset($this->flash[$k])){$return=&$this->flash[$k];}return$return;}function keep($k=NULL){$this->_use($k,FALSE);}function set($k,$v){$this->keep($k);$this->flash[$k]=$v;}function set_ref($k,&$v){$this->keep($k);$this->flash[$k]=&$v;}function sweep(){foreach(array_keys($this->flash)as$k){if($this->used[$k]){unset($this->flash[$k],$this->used[$k]);}else{$this->_use($k);}}$fkeys=array_keys($this->flash);$ukeys=array_keys($this->used);foreach(array_diff($fkeys,$ukeys)as$k=>$v){unset($this->used[$k]);}}function __toString(){$values=array();foreach($this->flash as$k=>$v){$values[]=sprintf("'%s': [%s, '%s']",$k,var_export($v,TRUE),$this->used[$k]?"used":"unused");}return"{".join(", ",$values)."}\n";}function __sleep(){$this->sweep();return array('flash','used');}function __wakeUp(){$this->discard();}}class Trails_Exception extends Exception{public$headers;function __construct($status=500,$reason=NULL,$headers=array()){if($reason===NULL){$reason=Trails_Response::get_reason($status);}parent::__construct($reason,$status);$this->headers=$headers;}function __toString(){return"{$this->code} {$this->message}";}}class Trails_DoubleRenderError extends Trails_Exception{function __construct(){$message="Render and/or redirect were called multiple times in this action. "."Please note that you may only call render OR redirect, and at most "."once per action.";parent::__construct(500,$message);}}class Trails_MissingFile extends Trails_Exception{function __construct($message){parent::__construct(500,$message);}}class Trails_RoutingError extends Trails_Exception{function __construct($message){parent::__construct(400,$message);}}class Trails_UnknownAction extends Trails_Exception{function __construct($message){parent::__construct(404,$message);}}class Trails_UnknownController extends Trails_Exception{function __construct($message){parent::__construct(404,$message);}}class Trails_SessionRequiredException extends Trails_Exception{function __construct(){$message="Tried to access a non existing session.";parent::__construct(500,$message);}} diff --git a/vendor/trails/trails.php b/vendor/trails/trails.php deleted file mode 100644 index b88a4a9..0000000 --- a/vendor/trails/trails.php +++ /dev/null @@ -1,1297 +0,0 @@ -<?php - -# Copyright (c) 2007 - Marcus Lunzenauer <mlunzena@uos.de> -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - - -/** - * The version of the trails library. - */ -define('TRAILS_VERSION', '0.6.9'); - - - -/** - * The Dispatcher is used to map an incoming HTTP request to a Controller - * producing a response which is then rendered. To initialize an instance of - * class Trails_Dispatcher you have to give three configuration settings: - * - * trails_root - the absolute file path to a directory containing the - * applications controllers, views etc. - * trails_uri - the URI to which routes to mapped Controller/Actions - * are appended - * default_controller - the route to a controller, that is used if no - * controller is given, that is the route is equal to '/' - * - * After instantiation of a dispatcher you have to call method #dispatch with - * the request uri to be mapped to a controller/action pair. - * - * @package trails - * - * @author mlunzena - * @copyright (c) Authors - * @version $Id: trails.php 7001 2008-04-04 11:20:27Z mlunzena $ - */ - -class Trails_Dispatcher { - - # TODO (mlunzena) Konfiguration muss anders geschehen - - /** - * This is the absolute file path to the trails application directory. - * - * @access public - * @var string - */ - public $trails_root; - - - /** - * This is the URI to which routes to controller/actions are appended. - * - * @access public - * @var string - */ - public $trails_uri; - - - /** - * This variable contains the route to the default controller. - * - * @access public - * @var string - */ - public $default_controller; - - - /** - * Constructor. - * - * @param string absolute file path to a directory containing the - * applications controllers, views etc. - * @param string the URI to which routes to mapped Controller/Actions - * are appended - * @param string the route to a controller, that is used if no - * controller is given, that is the route is equal to '/' - * - * @return void - */ - function __construct($trails_root, - $trails_uri, - $default_controller) { - - $this->trails_root = $trails_root; - $this->trails_uri = $trails_uri; - $this->default_controller = $default_controller; - } - - - /** - * Maps a string to a response which is then rendered. - * - * @param string The requested URI. - * - * @return void - */ - function dispatch($uri) { - - # E_USER_ERROR|E_USER_WARNING|E_USER_NOTICE|E_RECOVERABLE_ERROR = 5888 - $old_handler = set_error_handler(array($this, 'error_handler'), 5888); - - ob_start(); - $level = ob_get_level(); - - $this->map_uri_to_response($this->clean_request_uri((string) $uri))->output(); - - while (ob_get_level() >= $level) { - ob_end_flush(); - } - - if (isset($old_handler)) { - set_error_handler($old_handler); - } - } - - - /** - * Maps an URI to a response by figuring out first what controller to - * instantiate, then delegating the unconsumed part of the URI to the - * controller who returns an appropriate response object or throws a - * Trails_Exception. - * - * @param string the URI string - * - * @return mixed a response object - */ - function map_uri_to_response($uri) { - - try { - - list($controller_path, $unconsumed) = - '' === $uri - ? $this->default_route() - : $this->parse($uri); - - $controller = $this->load_controller($controller_path); - - $response = $controller->perform($unconsumed); - - } catch (Exception $e) { - - $response = isset($controller) ? $controller->rescue($e) - : $this->trails_error($e); - } - - return $response; - } - - - /** - * - * @return array an array containing the default controller and an - * empty unconsumed route - */ - function default_route() { - if (!$this->file_exists($this->default_controller . '.php')) { - throw new Trails_MissingFile( - "Default controller '{$this->default_controller}' not found'"); - } - return array($this->default_controller, ''); - } - - - function trails_error($exception) { - ob_clean(); - - # show details for local requests - $detailed = @$_SERVER['REMOTE_ADDR'] === '127.0.0.1'; - - $body = sprintf('<html><head><title>Trails Error</title></head>'. - '<body><h1>%s</h1><pre>%s</pre></body></html>', - htmlentities($exception->__toString()), - $detailed - ? htmlentities($exception->getTraceAsString()) - : ''); - - if ($exception instanceof Trails_Exception) { - $response = new Trails_Response($body, - $exception->headers, - $exception->getCode(), - $exception->getMessage()); - } - else { - $response = new Trails_Response($body, array(), 500, - $exception->getMessage()); - } - - return $response; - } - - - /** - * Clean up URI string by removing the query part and leading slashes. - * - * @param string an URI string - * - * @return string the cleaned string - */ - function clean_request_uri($uri) { - if (FALSE !== ($pos = strpos($uri, '?'))) { - $uri = substr($uri, 0, $pos); - } - return ltrim($uri, '/'); - } - - - /** - * <MethodDescription> - * - * @param type <description> - * @param type <description> - * - * @return type <description> - */ - function parse($unconsumed, $controller = NULL) { - list($head, $tail) = $this->split_on_first_slash($unconsumed); - - if (!preg_match('/^\w+$/', $head)) { - throw new Trails_RoutingError("No route matches '$head'"); - } - - $controller = (isset($controller) ? $controller . '/' : '') . $head; - - if ($this->file_exists($controller . '.php')) { - return array($controller, $tail); - } - else if ($this->file_exists($controller)) { - return $this->parse($tail, $controller); - } - - throw new Trails_RoutingError("No route matches '$head'"); - } - - function split_on_first_slash($str) { - preg_match(":([^/]*)(/+)?(.*):", $str, $matches); - return array($matches[1], $matches[3]); - } - - function file_exists($path) { - return file_exists("{$this->trails_root}/controllers/$path"); - } - - /** - * Loads the controller file for a given controller path and return an - * instance of that controller. If an error occures, an exception will be - * thrown. - * - * @param string the relative controller path - * - * @return TrailsController an instance of that controller - */ - function load_controller($controller) { - require_once "{$this->trails_root}/controllers/{$controller}.php"; - $class = Trails_Inflector::camelize($controller) . 'Controller'; - if (!class_exists($class)) { - throw new Trails_UnknownController("Controller missing: '$class'"); - } - return new $class($this); - } - - - /** - * This method transforms E_USER_* and E_RECOVERABLE_ERROR to - * Trails_Exceptions. - * - * @param integer the level of the error raised - * @param string the error message - * @param string the filename that the error was raised in - * @param integer the line number the error was raised at - * @param array an array of every variable that existed in the scope the - * error was triggered in - * - * @throws Trails_Exception - * - * @return void - */ - function error_handler($errno, $string, $file, $line, $context) { - if (!(5888 & $errno)) { - return false; - } - throw new Trails_Exception(500, $string); - } -} - - -/** - * This class represents a response returned by a controller that was asked to - * perform for a given request. A Trails_Response contains the body, status and - * additional headers which can be renderer back to the client. - * - * @package trails - * - * @author mlunzena - * @copyright (c) Authors - * @version $Id: trails.php 7001 2008-04-04 11:20:27Z mlunzena $ - */ - -class Trails_Response { - - - /** - * @ignore - */ - public - $body = '', - $status, - $reason, - $headers = array(); - - - /** - * Constructor. - * - * @param string the body of the response defaulting to '' - * @param array an array of additional headers defaulting to an - * empty array - * @param integer the status code of the response defaulting to a - * regular 200 - * @param string the descriptional reason for a status code defaulting to - * the standard reason phrases defined in RFC 2616 - * - * @return void - */ - function __construct($body = '', $headers = array(), - $status = NULL, $reason = NULL) { - - $this->set_body($body); - - $this->headers = $headers; - - if (isset($status)) { - $this->set_status($status, $reason); - } - } - - - /** - * Sets the body of the response. - * - * @param string the body - * - * @return mixed this response object. Useful for cascading method calls. - */ - function set_body($body) { - $this->body = $body; - return $this; - } - - - /** - * Sets the status code and an optional custom reason. If none is given, the - * standard reason phrase as of RFC 2616 is used. - * - * @param integer the status code - * @param string the custom reason, defaulting to the one given in RFC 2616 - * - * @return mixed this response object. Useful for cascading method calls. - */ - function set_status($status, $reason = NULL) { - $this->status = $status; - $this->reason = isset($reason) ? $reason : self::get_reason($status); - return $this; - } - - - /** - * Returns the reason phrase of this response according to RFC2616. - * - * @param int the response's status - * - * @return string the reason phrase for this response's status - */ - public static function get_reason($status) { - $reason = array( - 100 => 'Continue', 'Switching Protocols', - 200 => 'OK', 'Created', 'Accepted', 'Non-Authoritative Information', - 'No Content', 'Reset Content', 'Partial Content', - 300 => 'Multiple Choices', 'Moved Permanently', 'Found', 'See Other', - 'Not Modified', 'Use Proxy', '(Unused)', 'Temporary Redirect', - 400 => 'Bad Request', 'Unauthorized', 'Payment Required','Forbidden', - 'Not Found', 'Method Not Allowed', 'Not Acceptable', - 'Proxy Authentication Required', 'Request Timeout', 'Conflict', - 'Gone', 'Length Required', 'Precondition Failed', - 'Request Entity Too Large', 'Request-URI Too Long', - 'Unsupported Media Type', 'Requested Range Not Satisfiable', - 'Expectation Failed', - 500 => 'Internal Server Error', 'Not Implemented', 'Bad Gateway', - 'Service Unavailable', 'Gateway Timeout', - 'HTTP Version Not Supported'); - - return isset($reason[$status]) ? $reason[$status] : ''; - } - - - /** - * Adds an additional header to the response. - * - * @param string the left hand key part - * @param string the right hand value part - * - * @return mixed this response object. Useful for cascading method calls. - */ - function add_header($key, $value) { - $this->headers[$key] = $value; - return $this; - } - - - /** - * Outputs this response to the client using "echo" and "header". - * - * @return void - */ - function output() { - if (isset($this->status)) { - $this->send_header(sprintf('HTTP/1.1 %d %s', - $this->status, $this->reason), - TRUE, - $this->status); - } - - foreach ($this->headers as $k => $v) { - $this->send_header("$k: $v"); - } - - echo $this->body; - } - - - /** - * Internally used function to actually send headers - * - * @param string the HTTP header - * @param bool optional; TRUE if previously sent header should be - * replaced - FALSE otherwise (default) - * @param integer optional; the HTTP response code - * - * @return void - */ - function send_header($header, $replace = FALSE, $status = NULL) { - if (isset($status)) { - header($header, $replace, $status); - } - else { - header($header, $replace); - } - } -} - - - -/** - * A Trails_Controller is responsible for matching the unconsumed part of an URI - * to an action using the left over words as arguments for that action. The - * action is then mapped to method of the controller instance which is called - * with the just mentioned arguments. That method can send the #render_action, - * #render_template, #render_text, #render_nothing or #redirect method. - * Otherwise the #render_action is called with the current action as argument. - * If the action method sets instance variables during performing, they will be - * be used as attributes for the flexi-template opened by #render_action or - * #render_template. A controller's response's body is populated with the output - * of the #render_* methods. The action methods can add additional headers or - * change the status of that response. - * - * @package trails - * - * @author mlunzena - * @copyright (c) Authors - * @version $Id: trails.php 7001 2008-04-04 11:20:27Z mlunzena $ - */ - -class Trails_Controller { - - - /** - * @ignore - */ - protected - $dispatcher, - $response, - $performed, - $layout; - - - /** - * Constructor. - * - * @param mixed the dispatcher who creates this instance - * - * @return void - */ - function __construct($dispatcher) { - $this->dispatcher = $dispatcher; - $this->erase_response(); - } - - - /** - * Resets the response of the controller - * - * @return void - */ - function erase_response() { - $this->performed = FALSE; - $this->response = new Trails_Response(); - } - - - /** - * Return this controller's response - * - * @return mixed the controller's response - */ - function get_response() { - return $this->response; - } - - - /** - * This method extracts an action string and further arguments from it's - * parameter. The action string is mapped to a method being called afterwards - * using the said arguments. That method is called and a response object is - * generated, populated and sent back to the dispatcher. - * - * @param type <description> - * - * @return type <description> - */ - function perform($unconsumed) { - - list($action, $args, $format) = $this->extract_action_and_args($unconsumed); - - $this->format = isset($format) ? $format : 'html'; - - $before_filter_result = $this->before_filter($action, $args); - - # send action to controller - # TODO (mlunzena) shouldn't the after filter be triggered too? - if (!(FALSE === $before_filter_result || $this->performed)) { - - $callable = $this->map_action($action); - - if (is_callable($callable)) { - call_user_func_array($callable, $args); - } - else { - $this->does_not_understand($action, $args); - } - - if (!$this->performed) { - $this->render_action($action); - } - - $this->after_filter($action, $args); - } - - return $this->response; - } - - - /** - * Extracts action and args from a string. - * - * @param string the processed string - * - * @return array an array with two elements - a string containing the - * action and an array of strings representing the args - */ - function extract_action_and_args($string) { - - if ('' === $string) { - return $this->default_action_and_args(); - } - - // find optional file extension - $format = NULL; - if (preg_match('/^(.*[^\/.])\.(\w+)$/', $string, $matches)) { - list($_, $string, $format) = $matches; - } - - // TODO this should possibly remove empty tokens - $args = explode('/', $string); - $action = array_shift($args); - return array($action, $args, $format); - } - - /** - * Return the default action and arguments - * - * @return an array containing the action, an array of args and the format - * - */ - function default_action_and_args() { - return array('index', array(), NULL); - } - - /** - * Maps the action to an actual method name. - * - * @param string the action - * - * @return string the mapped method name - */ - function map_action($action) { - return array(&$this, $action . '_action'); - } - - - /** - * Callback function being called before an action is executed. If this - * function does not return FALSE, the action will be called, otherwise - * an error will be generated and processing will be aborted. If this function - * already #rendered or #redirected, further processing of the action is - * withheld. - * - * @param string Name of the action to perform. - * @param array An array of arguments to the action. - * - * @return bool - */ - function before_filter(&$action, &$args) { - } - - - /** - * Callback function being called after an action is executed. - * - * @param string Name of the action to perform. - * @param array An array of arguments to the action. - * - * @return void - */ - function after_filter($action, $args) { - } - - - /** - * <MethodDescription> - * - * @param type <description> - * @param type <description> - * - * @return void - */ - function does_not_understand($action, $args) { - throw new Trails_UnknownAction("No action responded to '$action'."); - } - - - /** - * <MethodDescription> - * - * @param string <description> - * - * @return void - */ - function redirect($to) { - - if ($this->performed) { - throw new Trails_DoubleRenderError(); - } - - $this->performed = TRUE; - - # get uri; keep absolute URIs - $url = preg_match('#^(/|\w+://)#', $to) - ? $to - : $this->url_for($to); - - $this->response->add_header('Location', $url)->set_status(302); - } - - - /** - * Renders the given text as the body of the response. - * - * @param string the text to be rendered - * - * @return void - */ - function render_text($text = ' ') { - - if ($this->performed) { - throw new Trails_DoubleRenderError(); - } - - $this->performed = TRUE; - - $this->response->set_body($text); - } - - - /** - * Renders the empty string as the response's body. - * - * @return void - */ - function render_nothing() { - $this->render_text(''); - } - - - /** - * Renders the template of the given action as the response's body. - * - * @param string the action - * - * @return void - */ - function render_action($action) { - $this->render_template($this->get_default_template($action), $this->layout); - } - - - function get_default_template($action) - { - $class = get_class($this); - $controller_name = - Trails_Inflector::underscore(substr($class, 0, -10)); - return $controller_name.'/'.$action; - } - - - /** - * Renders a template using an optional layout template. - * - * @param mixed a flexi template - * @param mixes a flexi template which is used as layout - * - * @return void - */ - function render_template($template_name, $layout = NULL) { - - # open template - $factory = $this->get_template_factory(); - $template = $factory->open($template_name); - - # template requires setup ? - switch (get_class($template)) { - case 'Flexi_JsTemplate': - $this->set_content_type('text/javascript'); - break; - } - - $template->set_attributes($this->get_assigned_variables()); - - if (isset($layout)) { - $template->set_layout($layout); - } - - $this->render_text($template->render()); - } - - - /** - * Create and return a template factory for this controller. - * - * @return a Flexi_TemplateFactory - */ - function get_template_factory() { - return new Flexi_TemplateFactory($this->dispatcher->trails_root . - '/views/'); - } - - - /** - * This method returns all the set instance variables to be used as attributes - * for a template. This controller is returned too as value for - * key 'controller'. - * - * @return array an associative array of variables for the template - */ - function get_assigned_variables() { - - $assigns = array(); - $protected = get_class_vars(get_class($this)); - - foreach (get_object_vars($this) as $var => $value) { - if (!array_key_exists($var, $protected)) { - $assigns[$var] =& $this->$var; - } - } - - $assigns['controller'] = $this; - - return $assigns; - } - - - /** - * Sets the layout to be used by this controller per default. - * - * @param mixed a flexi template to be used as layout - * - * @return void - */ - function set_layout($layout) { - $this->layout = $layout; - } - - - /** - * Returns a URL to a specified route to your Trails application. - * - * Example: - * Your Trails application is located at 'http://example.com/dispatch.php'. - * So your dispatcher's trails_uri is set to 'http://example.com/dispatch.php' - * If you want the URL to your 'wiki' controller with action 'show' and - * parameter 'page' you should send: - * - * $url = $controller->url_for('wiki/show', 'page'); - * - * $url should then contain 'http://example.com/dispatch.php/wiki/show/page'. - * - * The first parameter is a string containing the controller and optionally an - * action: - * - * - "{controller}/{action}" - * - "path/to/controller/action" - * - "controller" - * - * This "controller/action" string is not url encoded. You may provide - * additional parameter which will be urlencoded and concatenated with - * slashes: - * - * $controller->url_for('wiki/show', 'page'); - * -> 'wiki/show/page' - * - * $controller->url_for('wiki/show', 'page', 'one and a half'); - * -> 'wiki/show/page/one+and+a+half' - * - * @param string a string containing a controller and optionally an action - * @param strings optional arguments - * - * @return string a URL to this route - */ - function url_for($to/*, ...*/) { - - # urlencode all but the first argument - $args = func_get_args(); - $args = array_map('urlencode', $args); - $args[0] = $to; - - return $this->dispatcher->trails_uri . '/' . join('/', $args); - } - - - /** - * <MethodDescription> - * - * @param type <description> - * - * @return type <description> - */ - function set_status($status, $reason_phrase = NULL) { - $this->response->set_status($status, $reason_phrase); - } - - - /** - * Sets the content type of the controller's response. - * - * @param string the content type - * - * @return void - */ - function set_content_type($type) { - $this->response->add_header('Content-Type', $type); - } - - - /** - * Exception handler called when the performance of an action raises an - * exception. - * - * @param object the thrown exception - * - * @return object a response object - */ - function rescue($exception) { - return $this->dispatcher->trails_error($exception); - } - - function respond_to($ext) { - return $this->format === $ext; - } -} - - -/** - * The Inflector class is a namespace for inflections methods. - * - * @package trails - * - * @author mlunzena - * @copyright (c) Authors - * @version $Id: trails.php 7001 2008-04-04 11:20:27Z mlunzena $ - */ - -class Trails_Inflector { - - - /** - * Returns a camelized string from a lower case and underscored string by - * replacing slash with underscore and upper-casing each letter preceded - * by an underscore. TODO - * - * @param string String to camelize. - * - * @return string Camelized string. - */ - static function camelize($word) { - $parts = explode('/', $word); - foreach ($parts as $key => $part) { - $parts[$key] = str_replace(' ', '', - ucwords(str_replace('_', ' ', $part))); - } - return join('_', $parts); - } - - - /** - * <MethodDescription> - * - * @param type <description> - * - * @return type <description> - */ - static function underscore($word) { - $parts = explode('_', $word); - foreach ($parts as $key => $part) { - $parts[$key] = preg_replace('/(?<=\w)([A-Z])/', '_\\1', $part); - } - return strtolower(join('/', $parts)); - } -} - - -/** - * The flash provides a way to pass temporary objects between actions. - * Anything you place in the flash will be exposed to the very next action and - * then cleared out. This is a great way of doing notices and alerts, such as - * a create action that sets - * <tt>$flash->set('notice', "Successfully created")</tt> - * before redirecting to a display action that can then expose the flash to its - * template. - * - * @package trails - * - * @author mlunzena - * @copyright (c) Authors - * @version $Id: trails.php 7001 2008-04-04 11:20:27Z mlunzena $ - */ - -class Trails_Flash implements ArrayAccess { - - - /** - * @ignore - */ - public - $flash = array(), $used = array(); - - - /** - * <MethodDescription> - * - * @return type <description> - */ - static function instance() { - - if (!isset($_SESSION)) { - throw new Trails_SessionRequiredException(); - } - - - if (!isset($_SESSION['trails_flash'])) { - $_SESSION['trails_flash'] = new Trails_Flash(); - } - return $_SESSION['trails_flash']; - } - - - #[ReturnTypeWillChange] - function offsetExists($offset) { - return isset($this->flash[$offset]); - } - - - #[ReturnTypeWillChange] - function offsetGet($offset) { - return $this->get($offset); - } - - - function offsetSet($offset, $value) { - $this->set($offset, $value); - } - - - #[ReturnTypeWillChange] - function offsetUnset($offset) { - unset($this->flash[$offset], $this->used[$offset]); - } - - - /** - * Used internally by the <tt>keep</tt> and <tt>discard</tt> methods - * use() # marks the entire flash as used - * use('msg') # marks the "msg" entry as used - * use(null, false) # marks the entire flash as unused - * # (keeps it around for one more action) - * use('msg', false) # marks the "msg" entry as unused - * # (keeps it around for one more action) - * - * @param mixed a key. - * @param bool used flag. - * - * @return void - */ - function _use($k = NULL, $v = TRUE) { - if ($k) { - $this->used[$k] = $v; - } - else { - foreach ($this->used as $k => $value) { - $this->_use($k, $v); - } - } - } - - - /** - * Marks the entire flash or a single flash entry to be discarded by the end - * of the current action. - * - * $flash->discard() # discards entire flash - * # (it'll still be available for the - * # current action) - * $flash->discard('warning') # discard the "warning" entry - * # (it'll still be available for the - * # current action) - * - * @param mixed a key. - * - * @return void - */ - function discard($k = NULL) { - $this->_use($k); - } - - - /** - * Returns the value to the specified key. - * - * @param mixed a key. - * - * @return mixed the key's value. - */ - function &get($k) { - $return = NULL; - if (isset($this->flash[$k])) { - $return =& $this->flash[$k]; - } - return $return; - } - - - /** - * Keeps either the entire current flash or a specific flash entry available - * for the next action: - * - * $flash->keep() # keeps the entire flash - * $flash->keep('notice') # keeps only the "notice" entry, the rest of - * # the flash is discarded - * - * @param mixed a key. - * - * @return void - */ - function keep($k = NULL) { - $this->_use($k, FALSE); - } - - - /** - * Sets a key's value. - * - * @param mixed a key. - * @param mixed its value. - * - * @return void - */ - function set($k, $v) { - $this->keep($k); - $this->flash[$k] = $v; - } - - - /** - * Sets a key's value by reference. - * - * @param mixed a key. - * @param mixed its value. - * - * @return void - */ - function set_ref($k, &$v) { - $this->keep($k); - $this->flash[$k] =& $v; - } - - - - /** - * <MethodDescription> - * - * @return type <description> - */ - function sweep() { - - # remove used values - foreach (array_keys($this->flash) as $k) { - if ($this->used[$k]) { - unset($this->flash[$k], $this->used[$k]); - } else { - $this->_use($k); - } - } - - # cleanup if someone meddled with flash or used - $fkeys = array_keys($this->flash); - $ukeys = array_keys($this->used); - foreach (array_diff($fkeys, $ukeys) as $k => $v) { - unset($this->used[$k]); - } - } - - - /** - * <MethodDescription> - * - * @return type <description> - */ - function __toString() { - $values = array(); - foreach ($this->flash as $k => $v) { - $values[] = sprintf("'%s': [%s, '%s']", - $k, var_export($v, TRUE), - $this->used[$k] ? "used" : "unused"); - } - return "{" . join(", ", $values) . "}\n"; - } - - - /** - * <MethodDescription> - * - * @param type <description> - * - * @return type <description> - */ - function __sleep() { - $this->sweep(); - return array('flash', 'used'); - } - - - /** - * <MethodDescription> - * - * @param type <description> - * - * @return type <description> - */ - function __wakeUp() { - $this->discard(); - } -} - - - -/** - * TODO - * - * @package trails - * - * @author mlunzena - * @copyright (c) Authors - * @version $Id: trails.php 7001 2008-04-04 11:20:27Z mlunzena $ - */ - -class Trails_Exception extends Exception { - - /** - * <FieldDescription> - * - * @access private - * @var <type> - */ - public $headers; - - - /** - * @param int the status code to be set in the response - * @param string a human readable presentation of the status code - * @param array a hash of additional headers to be set in the response - * - * @return void - */ - function __construct($status = 500, $reason = NULL, $headers = array()) { - if ($reason === NULL) { - $reason = Trails_Response::get_reason($status); - } - parent::__construct($reason, $status); - $this->headers = $headers; - } - - - /** - * <MethodDescription> - * - * @param type <description> - * - * @return type <description> - */ - function __toString() { - return "{$this->code} {$this->message}"; - } -} - - -class Trails_DoubleRenderError extends Trails_Exception { - - function __construct() { - $message = - "Render and/or redirect were called multiple times in this action. ". - "Please note that you may only call render OR redirect, and at most ". - "once per action."; - parent::__construct(500, $message); - } -} - - -class Trails_MissingFile extends Trails_Exception { - function __construct($message) { - parent::__construct(500, $message); - } -} - - -class Trails_RoutingError extends Trails_Exception { - - function __construct($message) { - parent::__construct(400, $message); - } -} - - -class Trails_UnknownAction extends Trails_Exception { - - function __construct($message) { - parent::__construct(404, $message); - } -} - - -class Trails_UnknownController extends Trails_Exception { - - function __construct($message) { - parent::__construct(404, $message); - } -} - - -class Trails_SessionRequiredException extends Trails_Exception { - function __construct() { - $message = "Tried to access a non existing session."; - parent::__construct(500, $message); - } -} |
