* Copyright (C) 2024 Frédéric France */ // phpcs:disable PEAR.Commenting,Generic.NamingConventions,PEAR.NamingConventions,Squiz.Scope.MethodScope.Missing namespace Luracast\Restler { /** * Interface for the cache system that manages caching of given data * * @category Framework * @package Restler * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ interface iCache { /** * store data in the cache * * @abstract * * @param string $name * @param mixed $data * * @return boolean true if successful */ public function set($name, $data); /** * retrieve data from the cache * * @abstract * * @param string $name * @param bool $ignoreErrors * * @return mixed */ public function get($name, $ignoreErrors = false); /** * delete data from the cache * * @abstract * * @param string $name * @param bool $ignoreErrors * * @return boolean true if successful */ public function clear($name, $ignoreErrors = false); /** * check if the given name is cached * * @abstract * * @param string $name * * @return boolean true if cached */ public function isCached($name); } /** * Class ApcCache provides an APC based cache for Restler * * @category Framework * @package Restler * @author Joel R. Simpson * @copyright 2013 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class ApcCache implements \Luracast\Restler\iCache { /** * The namespace that all of the cached entries will be stored under. This allows multiple APIs to run concurrently. * * @var string */ public static $namespace = 'restler'; /** * store data in the cache * * * @param string $name * @param mixed $data * * @return boolean true if successful */ public function set($name, $data) { } /** * retrieve data from the cache * * * @param string $name * @param bool $ignoreErrors * * @throws \Exception * @return mixed */ public function get($name, $ignoreErrors = false) { } /** * delete data from the cache * * * @param string $name * @param bool $ignoreErrors * * @throws \Exception * @return boolean true if successful */ public function clear($name, $ignoreErrors = false) { } /** * check if the given name is cached * * * @param string $name * * @return boolean true if cached */ public function isCached($name) { } } /** * Class that implements spl_autoload facilities and multiple * conventions support. * Supports composer libraries and 100% PSR-0 compliant. * In addition we enable namespace prefixing and class aliases. * * @category Framework * @package Restler * @subpackage Helper * @author Nick Lombard * @copyright 2012 Luracast * */ class AutoLoader { protected static $instance; protected static $perfectLoaders; protected static $rogueLoaders = array(); protected static $classMap = array(); protected static $aliases = array( // aliases and prefixes instead of null list aliases 'Luracast\\Restler' => null, 'Luracast\\Restler\\Format' => null, 'Luracast\\Restler\\Data' => null, 'Luracast\\Restler\\Filter' => null, ); /** * Singleton instance facility. * * @static * @return AutoLoader the current instance or new instance if none exists. */ public static function instance() { } /** * Helper function to add a path to the include path. * AutoLoader uses the include path to discover classes. * * @static * * @param $path string absolute or relative path. * * @return bool false if the path cannot be resolved * or the resolved absolute path. */ public static function addPath($path) { } /** * Other autoLoaders interfere and cause duplicate class loading. * AutoLoader is capable enough to handle all standards so no need * for others stumbling about. * * @return callable the one true auto loader. */ public static function thereCanBeOnlyOne() { } /** * Seen this before cache handler. * Facilitates both lookup and persist operations as well as convenience, * load complete map functionality. The key can only be given a non falsy * value once, this will be truthy for life. * * @param $key mixed class name considered or a collection of * classMap entries * @param $value mixed optional not required when doing a query on * key. Default is false we haven't seen this * class. Most of the time it will be the filename * for include and is set to true if we are unable * to load this class iow true == it does not exist. * value may also be a callable auto loader function. * * @return mixed The known value for the key or false if key has no value */ public static function seen($key, $value = false) { } /** * Protected constructor to enforce singleton pattern. * Populate a default include path. * All possible includes cant possibly be catered for and if you * require another path then simply add it calling set_include_path. */ protected function __construct() { } /** * Auto loader callback through __invoke object as function. * * @param $className string class/interface name to auto load * * @return mixed|null the reference from the include or null */ public function __invoke($className) { } } /** * Parses the PHPDoc comments for metadata. Inspired by `Documentor` code base. * * @category Framework * @package Restler * @subpackage Helper * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class CommentParser { /** * name for the embedded data * * @var string */ public static $embeddedDataName = 'properties'; /** * Regular Expression pattern for finding the embedded data and extract * the inner information. It is used with preg_match. * * @var string */ public static $embeddedDataPattern = '/```(\\w*)[\\s]*(([^`]*`{0,2}[^`]+)*)```/ms'; /** * Pattern will have groups for the inner details of embedded data * this index is used to locate the data portion. * * @var int */ public static $embeddedDataIndex = 2; /** * Delimiter used to split the array data. * * When the name portion is of the embedded data is blank auto detection * will be used and if URLEncodedFormat is detected as the data format * the character specified will be used as the delimiter to find split * array data. * * @var string */ public static $arrayDelimiter = ','; /** * @var array annotations that support array value */ public static $allowsArrayValue = array('choice' => true, 'select' => true, 'properties' => true); /** * character sequence used to escape \@ */ const escapedAtChar = '\\@'; /** * character sequence used to escape end of comment */ const escapedCommendEnd = '{@*}'; /** * Instance of Restler class injected at runtime. * * @var Restler */ public $restler; /** * Parse the comment and extract the data. * * @static * * @param $comment * @param bool $isPhpDoc * * @return array associative array with the extracted values */ public static function parse($comment, $isPhpDoc = true) { } /** * Removes the comment tags from each line of the comment. * * @static * * @param string $comment PhpDoc style comment * * @return string comments with out the tags */ public static function removeCommentTags($comment) { } } } namespace { /** * Interface iAuthenticate only exists for compatibility mode for Restler 2 and below, it should * not be used otherwise. */ interface iAuthenticate { public function __isAuthenticated(); } } namespace Luracast\Restler { /** * Interface for composing response * * @category Framework * @package Restler * @subpackage result * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ interface iCompose { /** * Result of an api call is passed to this method * to create a standard structure for the data * * @param mixed $result can be a primitive or array or object */ public function response($result); /** * When the api call results in RestException this method * will be called to return the error message * * @param RestException $exception exception that has reasons for failure * * @return */ public function message(\Luracast\Restler\RestException $exception); } /** * Default Composer to provide standard structure for all HTTP responses * * @category Framework * @package Restler * @subpackage result * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class Compose implements \Luracast\Restler\iCompose { /** * @var bool When restler is not running in production mode, this value will * be checked to include the debug information on error response */ public static $includeDebugInfo = true; /** * Current Restler instance * Injected at runtime * * @var Restler */ public $restler; /** * Result of an api call is passed to this method * to create a standard structure for the data * * @param mixed $result can be a primitive or array or object * * @return mixed */ public function response($result) { } /** * When the api call results in RestException this method * will be called to return the error message * * @param RestException $exception exception that has reasons for failure * * @return array */ public function message(\Luracast\Restler\RestException $exception) { } } } namespace Luracast\Restler\Data { /** * Restler is using many ValueObjects across to make it easy for the developers * to use them with the help of code hinting etc., * * @category Framework * @package Restler * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ interface iValueObject { /** * This static method is called for creating an instance of the class by * passing the initiation values as an array. * * @static * @abstract * * @param array $properties * * @return iValueObject */ public static function __set_state(array $properties); /** * This method provides a string representation for the instance * * @return string */ public function __toString(); } /** * ValueObject base class, you may use this class to create your * iValueObjects quickly * * @category Framework * @package Restler * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class ValueObject implements \Luracast\Restler\Data\iValueObject { public function __toString() { } public static function __set_state(array $properties) { } public function __toArray() { } } /** * ValueObject for api method info. All needed information about a api method * is stored here * * @category Framework * @package Restler * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class ApiMethodInfo extends \Luracast\Restler\Data\ValueObject { /** * @var string target url */ public $url; /** * @var string */ public $className; /** * @var string */ public $methodName; /** * @var array parameters to be passed to the api method */ public $parameters = array(); /** * @var array information on parameters in the form of array(name => index) */ public $arguments = array(); /** * @var array default values for parameters if any * in the form of array(index => value) */ public $defaults = array(); /** * @var array key => value pair of method meta information */ public $metadata = array(); /** * @var int access level * 0 - @public - available for all * 1 - @hybrid - both public and protected (enhanced info for authorized) * 2 - @protected comment - only for authenticated users * 3 - protected method - only for authenticated users */ public $accessLevel = 0; } /** * Convenience class for Array manipulation * * @category Framework * @package Restler * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class Arr { /** * Deep copy given array * * @param array $arr * * @return array */ public static function copy(array $arr) { } } /** * Invalid Exception * * @category Framework * @package Restler * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class Invalid extends \Exception { } /** * Validation classes should implement this interface * * @category Framework * @package Restler * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ interface iValidate { /** * method used for validation. * * @param mixed $input * data that needs to be validated * @param ValidationInfo $info * information to be used for validation * @return boolean false in case of failure or fixed value in the expected * type * @throws \Luracast\Restler\RestException 400 with information about the * failed * validation */ public static function validate($input, \Luracast\Restler\Data\ValidationInfo $info); } /** * Convenience class that converts the given object * in to associative array * * @category Framework * @package Restler * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class Obj { /** * @var bool|string|callable */ public static $stringEncoderFunction = false; /** * @var bool|string|callable */ public static $numberEncoderFunction = false; /** * @var array key value pairs for fixing value types using functions. * For example * * 'id'=>'intval' will make sure all values of the id properties * will be converted to integers intval function * 'password'=> null will remove all the password entries */ public static $fix = array(); /** * @var string character that is used to identify sub objects * * For example * * when Object::$separatorChar = '.'; * * array('my.object'=>true) will result in * * array( * 'my'=>array('object'=>true) * ); */ public static $separatorChar = null; /** * @var bool set it to true when empty arrays, blank strings, null values * to be automatically removed from response */ public static $removeEmpty = false; /** * @var bool set it to true to remove all null values from the result */ public static $removeNull = false; /** * Convenience function that converts the given object * in to associative array * * @static * * @param mixed $object that needs to be converted * * @param bool $forceObjectTypeWhenEmpty when set to true outputs * actual type (array or * object) rather than * always an array when the * array/object is empty * * @return array */ public static function toArray($object, $forceObjectTypeWhenEmpty = false) { } public function __get($name) { } public function __set($name, $function) { } public function __isset($name) { } public function __unset($name) { } } /** * Convenience class for String manipulation * * @category Framework * @package Restler * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class Text { /** * Given haystack contains the needle or not? * * @param string $haystack * @param string $needle * @param bool $caseSensitive * * @return bool */ public static function contains($haystack, $needle, $caseSensitive = true) { } /** * Given haystack begins with the needle or not? * * @param string $haystack * @param string $needle * * @return bool */ public static function beginsWith($haystack, $needle) { } /** * Given haystack ends with the needle or not? * * @param string $haystack * @param string $needle * * @return bool */ public static function endsWith($haystack, $needle) { } /** * Convert camelCased or underscored string in to a title * * @param string $name * * @return string */ public static function title($name) { } /** * Convert given string to be used as a slug or css class * * @param string $name * @return string */ public static function slug($name) { } } /** * ValueObject for validation information. An instance is created and * populated by Restler to pass it to iValidate implementing classes for * validation * * @category Framework * @package Restler * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class ValidationInfo implements \Luracast\Restler\Data\iValueObject { /** * @var mixed given value for the parameter */ public $value; /** * @var string proper name for given parameter */ public $label; /** * @var string html element that can be used to represent the parameter for * input */ public $field; /** * @var mixed default value for the parameter */ public $default; /** * Name of the variable being validated * * @var string variable name */ public $name; /** * @var bool is it required or not */ public $required; /** * @var string body or header or query where this parameter is coming from * in the http request */ public $from; /** * Data type of the variable being validated. * It will be mostly string * * @var string|array multiple types are specified it will be of * type array otherwise it will be a string */ public $type; /** * When the type is array, this field is used to define the type of the * contents of the array * * @var string|null when all the items in an array are of certain type, we * can set this property. It will be null if the items can be of any type */ public $contentType; /** * Should we attempt to fix the value? * When set to false validation class should throw * an exception or return false for the validate call. * When set to true it will attempt to fix the value if possible * or throw an exception or return false when it cant be fixed. * * @var boolean true or false */ public $fix = false; /** * @var array of children to be validated */ public $children = null; // ================================================================== // // VALUE RANGE // // ------------------------------------------------------------------ /** * Given value should match one of the values in the array * * @var array of choices to match to */ public $choice; /** * If the type is string it will set the lower limit for length * else will specify the lower limit for the value * * @var number minimum value */ public $min; /** * If the type is string it will set the upper limit limit for length * else will specify the upper limit for the value * * @var number maximum value */ public $max; // ================================================================== // // REGEX VALIDATION // // ------------------------------------------------------------------ /** * RegEx pattern to match the value * * @var string regular expression */ public $pattern; // ================================================================== // // CUSTOM VALIDATION // // ------------------------------------------------------------------ /** * Rules specified for the parameter in the php doc comment. * It is passed to the validation method as the second parameter * * @var array custom rule set */ public $rules; /** * Specifying a custom error message will override the standard error * message return by the validator class * * @var string custom error response */ public $message; // ================================================================== // // METHODS // // ------------------------------------------------------------------ /** * Name of the method to be used for validation. * It will be receiving two parameters $input, $rules (array) * * @var string validation method name */ public $method; /** * Instance of the API class currently being called. It will be null most of * the time. Only when method is defined it will contain an instance. * This behavior is for lazy loading of the API class * * @var null|object will be null or api class instance */ public $apiClassInstance = null; public static function numericValue($value) { } public static function arrayValue($value) { } public static function stringValue($value, $glue = ',') { } public static function booleanValue($value) { } public static function filterArray(array $data, $keepNumericKeys) { } public function __toString() { } public function __construct(array $info) { } /** * Magic Method used for creating instance at run time */ public static function __set_state(array $info) { } } /** * Default Validator class used by Restler. It can be replaced by any * iValidate implementing class by setting Defaults::$validatorClass * * @category Framework * @package Restler * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class Validator implements \Luracast\Restler\Data\iValidate { public static $holdException = false; public static $exceptions = array(); public static $preFilters = array( //'*' => 'some_global_filter', //applied to all parameters 'string' => 'trim', ); /** * Validate alphabetic characters. * * Check that given value contains only alphabetic characters. * * @param $input * @param ValidationInfo $info * * @return string * * @throws Invalid */ public static function alpha($input, \Luracast\Restler\Data\ValidationInfo $info = null) { } /** * Validate UUID strings. * * Check that given value contains only alpha numeric characters and the length is 36 chars. * * @param $input * @param ValidationInfo $info * * @return string * * @throws Invalid */ public static function uuid($input, \Luracast\Restler\Data\ValidationInfo $info = null) { } /** * Validate alpha numeric characters. * * Check that given value contains only alpha numeric characters. * * @param $input * @param ValidationInfo $info * * @return string * * @throws Invalid */ public static function alphanumeric($input, \Luracast\Restler\Data\ValidationInfo $info = null) { } /** * Validate printable characters. * * Check that given value contains only printable characters. * * @param $input * @param ValidationInfo $info * * @return string * * @throws Invalid */ public static function printable($input, \Luracast\Restler\Data\ValidationInfo $info = null) { } /** * Validate hexadecimal digits. * * Check that given value contains only hexadecimal digits. * * @param $input * @param ValidationInfo $info * * @return string * * @throws Invalid */ public static function hex($input, \Luracast\Restler\Data\ValidationInfo $info = null) { } /** * Color specified as hexadecimals * * Check that given value contains only color. * * @param $input * @param ValidationInfo|null $info * * @return string * @throws Invalid */ public static function color($input, \Luracast\Restler\Data\ValidationInfo $info = null) { } /** * Validate Telephone number * * Check if the given value is numeric with or without a `+` prefix * * @param $input * @param ValidationInfo $info * * @return string * * @throws Invalid */ public static function tel($input, \Luracast\Restler\Data\ValidationInfo $info = null) { } /** * Validate Email * * Check if the given string is a valid email * * @param String $input * @param ValidationInfo $info * * @return string * @throws Invalid */ public static function email($input, \Luracast\Restler\Data\ValidationInfo $info = null) { } /** * Validate IP Address * * Check if the given string is a valid ip address * * @param String $input * @param ValidationInfo $info * * @return string * @throws Invalid */ public static function ip($input, \Luracast\Restler\Data\ValidationInfo $info = null) { } /** * Validate Url * * Check if the given string is a valid url * * @param String $input * @param ValidationInfo $info * * @return string * @throws Invalid */ public static function url($input, \Luracast\Restler\Data\ValidationInfo $info = null) { } /** * MySQL Date * * Check if the given string is a valid date in YYYY-MM-DD format * * @param String $input * @param ValidationInfo $info * * @return string * @throws Invalid */ public static function date($input, \Luracast\Restler\Data\ValidationInfo $info = null) { } /** * MySQL DateTime * * Check if the given string is a valid date and time in YYY-MM-DD HH:MM:SS format * * @param String $input * @param ValidationInfo $info * * @return string * @throws Invalid */ public static function datetime($input, \Luracast\Restler\Data\ValidationInfo $info = null) { } /** * Alias for Time * * Check if the given string is a valid time in HH:MM:SS format * * @param String $input * @param ValidationInfo $info * * @return string * @throws Invalid */ public static function time24($input, \Luracast\Restler\Data\ValidationInfo $info = null) { } /** * Time * * Check if the given string is a valid time in HH:MM:SS format * * @param String $input * @param ValidationInfo $info * * @return string * @throws Invalid */ public static function time($input, \Luracast\Restler\Data\ValidationInfo $info = null) { } /** * Time in 12 hour format * * Check if the given string is a valid time 12 hour format * * @param String $input * @param ValidationInfo $info * * @return string * @throws Invalid */ public static function time12($input, \Luracast\Restler\Data\ValidationInfo $info = null) { } /** * Unix Timestamp * * Check if the given value is a valid timestamp * * @param String $input * @param ValidationInfo $info * * @return int * @throws Invalid */ public static function timestamp($input, \Luracast\Restler\Data\ValidationInfo $info = null) { } /** * Validate the given input * * Validates the input and attempts to fix it when fix is requested * * @param mixed $input * @param ValidationInfo $info * @param null $full * * @throws \Exception * @return array|bool|float|int|mixed|null|number|string */ public static function validate($input, \Luracast\Restler\Data\ValidationInfo $info, $full = null) { } } } namespace Luracast\Restler { /** * Static class to hold all restler defaults, change the values to suit your * needs in the gateway file (index.php), you may also allow the api users to * change them per request by adding the properties to Defaults::$overridables * * @category Framework * @package Restler * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class Defaults { // ================================================================== // // Class Mappings // // ------------------------------------------------------------------ /** * @var string of name of the class that implements * \Luracast\Restler\iCache the cache class to be used */ public static $cacheClass = 'Luracast\\Restler\\HumanReadableCache'; /** * @var string full path of the directory where all the generated files will * be kept. When set to null (default) it will use the cache folder that is * in the same folder as index.php (gateway) */ public static $cacheDirectory; /** * @var string of name of the class that implements * \Luracast\Restler\Data\iValidate the validator class to be used */ public static $validatorClass = 'Luracast\\Restler\\Data\\Validator'; /** * @var string name of the class that implements \Luracast\Restler\iCompose * the class to be used to compose the response */ public static $composeClass = 'Luracast\\Restler\\Compose'; // ================================================================== // // Routing // // ------------------------------------------------------------------ /** * @var bool should auto routing for public and protected api methods * should be enabled by default or not. Set this to false to get * Restler 1.0 style behavior */ public static $autoRoutingEnabled = true; /** * @var boolean avoids creating multiple routes that can increase the * ambiguity when set to true. when a method parameter is optional it is * not mapped to the url and should only be used in request body or as * query string `/resource?id=value`. When a parameter is required and is * scalar, it will be mapped as part of the url `/resource/{id}` */ public static $smartAutoRouting = true; /** * @var boolean enables more ways of finding the parameter data in the request. * If you need backward compatibility with Restler 2 or below turn this off */ public static $smartParameterParsing = true; // ================================================================== // // API Version Management // // ------------------------------------------------------------------ /** * @var null|string name that is used for vendor specific media type and * api version using the Accept Header for example * application/vnd.{vendor}-v1+json * * Keep this null if you do not want to use vendor MIME for specifying api version */ public static $apiVendor = null; /** * @var bool set it to true to force vendor specific MIME for versioning. * It will be automatically set to true when Defaults::$vendor is not * null and client is requesting for the custom MIME type */ public static $useVendorMIMEVersioning = false; /** * @var bool set it to true to use enableUrl based versioning */ public static $useUrlBasedVersioning = false; // ================================================================== // // Request // // ------------------------------------------------------------------ /** * @var string name to be used for the method parameter to capture the * entire request data */ public static $fullRequestDataName = 'request_data'; /** * @var string name of the property that can sent through $_GET or $_POST to * override the http method of the request. Set it to null or * blank string to disable http method override through request * parameters. */ public static $httpMethodOverrideProperty = 'http_method'; /** * @var bool should auto validating api parameters should be enabled by * default or not. Set this to false to avoid validation. */ public static $autoValidationEnabled = true; /** * @var string name of the class that implements iUser interface to identify * the user for caching purposes */ public static $userIdentifierClass = 'Luracast\\Restler\\User'; // ================================================================== // // Response // // ------------------------------------------------------------------ /** * @var bool HTTP status codes are set on all responses by default. * Some clients (like flash, mobile) have trouble dealing with non-200 * status codes on error responses. * * You can set it to true to force a HTTP 200 status code on all responses, * even when errors occur. If you suppress status codes, look for an error * response to determine if an error occurred. */ public static $suppressResponseCode = false; public static $supportedCharsets = array('utf-8', 'iso-8859-1'); public static $supportedLanguages = array('en', 'en-US'); public static $charset = 'utf-8'; public static $language = 'en'; /** * @var bool when set to true, it will exclude the response body */ public static $emptyBodyForNullResponse = true; /** * @var bool when set to true, the response will not be outputted directly into the buffer. * If set, Restler::handle() will return the response as a string. */ public static $returnResponse = false; /** * @var bool enables CORS support */ public static $crossOriginResourceSharing = false; public static $accessControlAllowOrigin = '*'; public static $accessControlAllowMethods = 'GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD'; // ================================================================== // // Header // // ------------------------------------------------------------------ /** * @var array default Cache-Control template that used to set the * Cache-Control header and has two values, first one is used when * Defaults::$headerExpires is 0 and second one when it has some time * value specified. When only one value is specified it will be used for * both cases */ public static $headerCacheControl = array( 'no-cache, must-revalidate', /* "public, " or "private, " will be prepended based on api method * called (public or protected) */ 'max-age={expires}, must-revalidate', ); /** * @var int sets the content to expire immediately when set to zero * alternatively you can specify the number of seconds the content will * expire. This setting can be altered at api level using php doc comment * with @expires numOfSeconds */ public static $headerExpires = 0; // ================================================================== // // Access Control // // ------------------------------------------------------------------ /** * @var null|callable if the api methods are under access control mechanism * you can attach a function here that returns true or false to determine * visibility of a protected api method. this function will receive method * info as the only parameter. */ public static $accessControlFunction = null; /** * @var int set the default api access mode * value of 0 = public api * value of 1 = hybrid api using `@access hybrid` comment * value of 2 = protected api using `@access protected` comment * value of 3 = protected api using `protected function` method */ public static $apiAccessLevel = 0; /** * @var string authentication method to be called in iAuthenticate * Interface */ public static $authenticationMethod = '__isAllowed'; /** * @var int time in milliseconds for bandwidth throttling, * which is the minimum response time for each api request. You can * change it per api method by setting `@throttle 3000` in php doc * comment either at the method level or class level */ public static $throttle = 0; // ================================================================== // // Overrides for API User // // ------------------------------------------------------------------ /** * @var array use 'alternativeName'=> 'actualName' to set alternative * names that can be used to represent the api method parameters and/or * static properties of Defaults */ public static $aliases = array( /** * suppress_response_codes=true as an URL parameter to force * a HTTP 200 status code on all responses */ 'suppress_response_codes' => 'suppressResponseCode', ); /** * @var array determines the defaults that can be overridden by the api * user by passing them as URL parameters */ public static $overridables = array('suppressResponseCode'); /** * @var array contains validation details for defaults to be used when * set through URL parameters */ public static $validation = array('suppressResponseCode' => array('type' => 'bool'), 'headerExpires' => array('type' => 'int', 'min' => 0)); // ================================================================== // // Overrides API Developer // // ------------------------------------------------------------------ /** * @var array determines what are the phpdoc comment tags that will * override the Defaults here with their values */ public static $fromComments = array( /** * use PHPDoc comments such as the following * ` * * @cache no-cache, must-revalidate` to set the Cache-Control header * for a specific api method */ 'cache' => 'headerCacheControl', /** * use PHPDoc comments such as the following * ` * * @expires 50` to set the Expires header * for a specific api method */ 'expires' => 'headerExpires', /** * use PHPDoc comments such as the following * ` * * @throttle 300` * to set the bandwidth throttling for 300 milliseconds * for a specific api method */ 'throttle' => 'throttle', /** * enable or disable smart auto routing from method comments * this one is hardwired so cant be turned off * it is placed here just for documentation purpose */ 'smart-auto-routing' => 'smartAutoRouting', ); // ================================================================== // // Util // // ------------------------------------------------------------------ /** * Use this method to set value to a static properly of Defaults when * you want to make sure only proper values are taken in with the help of * validation * * @static * * @param string $name name of the static property * @param mixed $value value to set the property to * * @return bool */ public static function setProperty($name, $value) { } } class EventDispatcher { protected static $_waitList = array(); public static $self; protected $events = array(); public function __construct() { } public static function __callStatic($eventName, $params) { } public function __call($eventName, $params) { } public static function addListener($eventName, \Closure $callback) { } public function on(array $eventHandlers) { } /** * Fire an event to notify all listeners * * @param string $eventName name of the event * @param array $params event related data */ protected function dispatch($eventName, array $params = array()) { } } /** * Interface iProvideMultiVersionApi * @package Luracast\Restler * * */ interface iProvideMultiVersionApi { /** * Maximum api version supported by the api class * @return int */ public static function __getMaximumSupportedVersion(); } /** * Class Explorer * * @package Luracast\Restler * * @access hybrid * @version 3.0.0rc6 */ class Explorer implements \Luracast\Restler\iProvideMultiVersionApi { const SWAGGER = '2.0'; /** * @var array http schemes supported. http or https or both http and https */ public static $schemes = array(); /** * @var bool should protected resources be shown to unauthenticated users? */ public static $hideProtected = true; /** * @var bool should we use format as extension? */ public static $useFormatAsExtension = true; /* * @var bool can we accept scalar values (string, int, float etc) as the request body? */ public static $allowScalarValueOnRequestBody = false; /** * @var array all http methods specified here will be excluded from * documentation */ public static $excludedHttpMethods = array('OPTIONS'); /** * @var array all paths beginning with any of the following will be excluded * from documentation */ public static $excludedPaths = array(); /** * @var bool */ public static $placeFormatExtensionBeforeDynamicParts = true; /** * @var bool should we group all the operations with the same url or not */ public static $groupOperations = false; /** * @var string class that holds metadata as static properties */ public static $infoClass = 'Luracast\\Restler\\ExplorerInfo'; /** * Injected at runtime * * @var Restler instance of restler */ public $restler; /** * @var string when format is not used as the extension this property is * used to set the extension manually */ public $formatString = ''; /** * @var array type mapping for converting data types to JSON-Schema Draft 4 * Which is followed by swagger 1.2 spec */ public static $dataTypeAlias = array( //'string' => 'string', 'int' => 'integer', 'number' => 'number', 'float' => array('number', 'float'), 'bool' => 'boolean', //'boolean' => 'boolean', //'NULL' => 'null', 'array' => 'array', //'object' => 'object', 'stdClass' => 'object', 'mixed' => 'string', 'date' => array('string', 'date'), 'datetime' => array('string', 'date-time'), ); /** * @var array configurable symbols to differentiate public, hybrid and * protected api */ public static $apiDescriptionSuffixSymbols = array( 0 => ' 🔓', //'  ', //public api 1 => ' ◑', //'  ', //hybrid api 2 => ' 🔐', ); protected $models = array(); /** * @var bool|stdClass */ protected $_fullDataRequested = false; protected $crud = array('POST' => 'create', 'GET' => 'retrieve', 'PUT' => 'update', 'DELETE' => 'delete', 'PATCH' => 'partial update'); protected static $prefixes = array('get' => 'retrieve', 'index' => 'list', 'post' => 'create', 'put' => 'update', 'patch' => 'modify', 'delete' => 'remove'); protected $_authenticated = false; protected $cacheName = ''; /** * Serve static files for exploring * * Serves explorer html, css, and js files * * @url GET * */ public function get() { } /** * @return stdClass */ public function swagger() { } /** * Maximum api version supported by the api class * @return int */ public static function __getMaximumSupportedVersion() { } } /** * Class ExplorerInfo * @package Luracast\Restler * * @version 3.0.0rc6 */ class ExplorerInfo { public static $title = 'Restler API Explorer'; public static $description = 'Live API Documentation'; public static $termsOfService = null; public static $contact = array('name' => 'Restler Support', 'url' => 'luracast.com/products/restler', 'email' => 'arul@luracast.com'); public static $license = array('name' => 'LGPL-2.1', 'url' => 'https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html'); } /** * Interface for creating classes that perform authentication/access * verification * * @category Framework * @package Restler * @subpackage auth * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ interface iFilter { /** * Access verification method. * * API access will be denied when this method returns false * * @abstract * @return boolean true when api access is allowed false otherwise */ public function __isAllowed(); } /** * Api classes or filter classes can implement this interface to know about * authentication status * * @category Framework * @package Restler * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ interface iUseAuthentication { /** * This method will be called first for filter classes and api classes so * that they can respond accordingly for filer method call and api method * calls * * @abstract * * @param bool $isAuthenticated passes true when the authentication is * done false otherwise * * @return mixed */ public function __setAuthenticationStatus($isAuthenticated = false); } } namespace Luracast\Restler\Filter { /** * Describe the purpose of this class/interface/trait * * @category Framework * @package restler * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class RateLimit implements \Luracast\Restler\iFilter, \Luracast\Restler\iUseAuthentication { /** * @var \Luracast\Restler\Restler; */ public $restler; /** * @var int */ public static $usagePerUnit = 1200; /** * @var int */ public static $authenticatedUsagePerUnit = 5000; /** * @var string */ public static $unit = 'hour'; /** * @var string group the current api belongs to */ public static $group = 'common'; protected static $units = array( 'second' => 1, 'minute' => 60, 'hour' => 3600, // 60*60 seconds 'day' => 86400, // 60*60*24 seconds 'week' => 604800, // 60*60*24*7 seconds 'month' => 2592000, ); /** * @var array all paths beginning with any of the following will be excluded * from documentation */ public static $excludedPaths = array('explorer'); /** * @param string $unit * @param int $usagePerUnit * @param int $authenticatedUsagePerUnit set it to false to give unlimited access * * @throws \InvalidArgumentException * @return void */ public static function setLimit($unit, $usagePerUnit, $authenticatedUsagePerUnit = null) { } public function __isAllowed() { } public function __setAuthenticationStatus($isAuthenticated = false) { } } } namespace Luracast\Restler { /** * Storing and retrieving a message or array of key value pairs for one time use using $_SESSION * * They are typically used in view templates when using HtmlFormat * * @category Framework * @package Restler * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class Flash implements \ArrayAccess { const SUCCESS = 'success'; const INFO = 'info'; const WARNING = 'warning'; const DANGER = 'danger'; /** * Flash a success message to user * * @param string $message * @param string $header * * @return Flash */ public static function success($message, $header = '') { } /** * Flash a info message to user * * @param string $message * @param string $header * * @return Flash */ public static function info($message, $header = '') { } /** * Flash a warning message to user * * @param string $message * @param string $header * * @return Flash */ public static function warning($message, $header = '') { } /** * Flash a error message to user * * @param string $message * @param string $header * * @return Flash */ public static function danger($message, $header = '') { } /** * Flash a message to user * * @param string $text message text * @param string $header * @param string $type * * @return Flash */ public static function message($text, $header = '', $type = \Luracast\Restler\Flash::WARNING) { } /** * Set some data for one time use * * @param array $data array of key value pairs {@type associative} * * @return Flash */ public static function set(array $data) { } public function __get($name) { } public function __isset($name) { } public function __destruct() { } /** * Specify data which should be serialized to JSON * @link http://php.net/manual/en/jsonserializable.jsonserialize.php * @return mixed data which can be serialized by json_encode, * which is a value of any type other than a resource. */ public function jsonSerialize() { } public function offsetExists($offset) { } public function offsetGet($offset) { } public function offsetSet($offset, $value) { } public function offsetUnset($offset) { } } } namespace Luracast\Restler\Format { /** * Interface for creating custom data formats * like xml, json, yaml, amf etc * @category Framework * @package Restler * @subpackage format * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ interface iFormat { /** * Get MIME type => Extension mappings as an associative array * * @return array list of mime strings for the format * @example array('application/json'=>'json'); */ public function getMIMEMap(); /** * Set the selected MIME type * * @param string $mime * MIME type */ public function setMIME($mime); /** * Content-Type field of the HTTP header can send a charset * parameter in the HTTP header to specify the character * encoding of the document. * This information is passed * here so that Format class can encode data accordingly * Format class may choose to ignore this and use its * default character set. * * @param string $charset * Example utf-8 */ public function setCharset($charset); /** * Content-Type accepted by the Format class * * @return string $charset Example utf-8 */ public function getCharset(); /** * Get selected MIME type */ public function getMIME(); /** * Set the selected file extension * * @param string $extension * file extension */ public function setExtension($extension); /** * Get the selected file extension * * @return string file extension */ public function getExtension(); /** * Encode the given data in the format * * @param array $data * resulting data that needs to * be encoded in the given format * @param boolean $humanReadable * set to TRUE when restler * is not running in production mode. Formatter has to * make the encoded output more human readable * @return string encoded string */ public function encode($data, $humanReadable = false); /** * Decode the given data from the format * * @param string $data * data sent from client to * the api in the given format. * @return array associative array of the parsed data */ public function decode($data); /** * @return boolean is parsing the request supported? */ public function isReadable(); /** * @return boolean is composing response supported? */ public function isWritable(); } /** * Abstract class to implement common methods of iFormat * * @category Framework * @package Restler * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ abstract class Format implements \Luracast\Restler\Format\iFormat { /** * override in the extending class */ const MIME = 'text/plain'; /** * override in the extending class */ const EXTENSION = 'txt'; /** * @var string charset encoding defaults to UTF8 */ protected $charset = 'utf-8'; /** * Injected at runtime * * @var \Luracast\Restler\Restler */ public $restler; /** * Get MIME type => Extension mappings as an associative array * * @return array list of mime strings for the format * @example array('application/json'=>'json'); */ public function getMIMEMap() { } /** * Set the selected MIME type * * @param string $mime * MIME type */ public function setMIME($mime) { } /** * Content-Type field of the HTTP header can send a charset * parameter in the HTTP header to specify the character * encoding of the document. * This information is passed * here so that Format class can encode data accordingly * Format class may choose to ignore this and use its * default character set. * * @param string $charset * Example utf-8 */ public function setCharset($charset) { } /** * Content-Type accepted by the Format class * * @return string $charset Example utf-8 */ public function getCharset() { } /** * Get selected MIME type */ public function getMIME() { } /** * Set the selected file extension * * @param string $extension * file extension */ public function setExtension($extension) { } /** * Get the selected file extension * * @return string file extension */ public function getExtension() { } /** * @return boolean is parsing the request supported? */ public function isReadable() { } /** * @return boolean is composing response supported? */ public function isWritable() { } public function __toString() { } } abstract class DependentFormat extends \Luracast\Restler\Format\Format { /** * override in the extending class * * @example symfony/yaml:* */ const PACKAGE_NAME = 'vendor/project:version'; /** * override in the extending class * * fully qualified class name */ const EXTERNAL_CLASS = 'Namespace\\ClassName'; /** * Get external class => packagist package name as an associative array * * @return array list of dependencies for the format */ public function getDependencyMap() { } protected function checkDependency($class = null) { } public function __construct() { } } /** * AMF Binary Format for Restler Framework. * Native format supported by Adobe Flash and Adobe AIR * * @category Framework * @package Restler * @subpackage format * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class AmfFormat extends \Luracast\Restler\Format\DependentFormat { const MIME = 'application/x-amf'; const EXTENSION = 'amf'; const PACKAGE_NAME = 'zendframework/zendamf:dev-master'; const EXTERNAL_CLASS = 'ZendAmf\\Parser\\Amf3\\Deserializer'; public function encode($data, $humanReadable = false) { } public function decode($data) { } } /** * Interface for creating formats that accept steams for decoding * * @category Framework * @package Restler * @subpackage format * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ interface iDecodeStream { /** * Decode the given data stream * * @param string $stream A stream resource with data * sent from client to the api * in the given format. * * @return array associative array of the parsed data */ public function decodeStream($stream); } /** * Comma Separated Value Format * * @category Framework * @package Restler * @subpackage format * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class CsvFormat extends \Luracast\Restler\Format\Format implements \Luracast\Restler\Format\iDecodeStream { const MIME = 'text/csv'; const EXTENSION = 'csv'; public static $delimiter = ','; public static $enclosure = '"'; public static $escape = '\\'; public static $haveHeaders = null; /** * Encode the given data in the csv format * * @param array $data * resulting data that needs to * be encoded in the given format * @param boolean $humanReadable * set to TRUE when restler * is not running in production mode. Formatter has to * make the encoded output more human readable * * @return string encoded string * * @throws RestException 500 on unsupported data */ public function encode($data, $humanReadable = false) { } protected static function putRow($data) { } /** * Decode the given data from the csv format * * @param string $data * data sent from client to * the api in the given format. * * @return array associative array of the parsed data */ public function decode($data) { } protected static function getRow($data, $keys = false) { } /** * Decode the given data stream * * @param string $stream A stream resource with data * sent from client to the api * in the given format. * * @return array associative array of the parsed data */ public function decodeStream($stream) { } } /** * Describe the purpose of this class/interface/trait * * @category Framework * @package Restler * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ abstract class MultiFormat implements \Luracast\Restler\Format\iFormat { /** * override in the extending class */ const MIME = 'text/plain,text/html'; /** * override in the extending class */ const EXTENSION = 'txt,html'; /** * @var string charset encoding defaults to UTF8 */ protected $charset = 'utf-8'; public static $mime; public static $extension; /** * Injected at runtime * * @var \Luracast\Restler\Restler */ public $restler; /** * Get MIME type => Extension mappings as an associative array * * @return array list of mime strings for the format * @example array('application/json'=>'json'); */ public function getMIMEMap() { } /** * Set the selected MIME type * * @param string $mime * MIME type */ public function setMIME($mime) { } /** * Content-Type field of the HTTP header can send a charset * parameter in the HTTP header to specify the character * encoding of the document. * This information is passed * here so that Format class can encode data accordingly * Format class may choose to ignore this and use its * default character set. * * @param string $charset * Example utf-8 */ public function setCharset($charset) { } /** * Content-Type accepted by the Format class * * @return string $charset Example utf-8 */ public function getCharset() { } /** * Get selected MIME type */ public function getMIME() { } /** * Set the selected file extension * * @param string $extension * file extension */ public function setExtension($extension) { } /** * Get the selected file extension * * @return string file extension */ public function getExtension() { } /** * @return boolean is parsing the request supported? */ public function isReadable() { } /** * @return boolean is composing response supported? */ public function isWritable() { } public function __toString() { } } abstract class DependentMultiFormat extends \Luracast\Restler\Format\MultiFormat { /** * Get external class => packagist package name as an associative array * * @return array list of dependencies for the format * * @example return ['Illuminate\\View\\View' => 'illuminate/view:4.2.*'] */ abstract public function getDependencyMap(); protected function checkDependency($class = null) { } public function __construct() { } } /** * Html template format * * @category Framework * @package Restler * @subpackage format * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class HtmlFormat extends \Luracast\Restler\Format\DependentFormat { const BLADE = 'Illuminate\\View\\View'; const TWIG = 'Twig\\Environment'; const MUSTACHE = 'Mustache_Engine'; public static $mime = 'text/html'; public static $extension = 'html'; public static $view; public static $errorView = 'debug.php'; public static $template = 'php'; public static $handleSession = true; public static $convertResponseToArray = false; public static $useSmartViews = true; /** * @var null|string defaults to template named folder in Defaults::$cacheDirectory */ public static $cacheDirectory = null; /** * @var array global key value pair to be supplied to the templates. All * keys added here will be available as a variable inside the template */ public static $data = array(); /** * @var string set it to the location of your the view files. Defaults to * views folder which is same level as vendor directory. */ public static $viewPath; /** * @var array template and its custom extension key value pair */ public static $customTemplateExtensions = array('blade' => 'blade.php'); /** * @var bool used internally for error handling */ protected static $parseViewMetadata = true; /** * @var Restler; */ public $restler; public function __construct() { } public function getDependencyMap() { } public static function blade(array $data, $debug = true) { } /** * @param array|object $data * @param bool $debug * * @return string * @throws \Twig\Error\LoaderError * @throws \Twig\Error\RuntimeError * @throws \Twig\Error\SyntaxError */ public static function twig($data, $debug = true) { } /** * @param array|object $data * @param bool $debug * * @return string */ public static function handlebar($data, $debug = true) { } /** * @param array|object $data * @param bool $debug * * @return string */ public static function mustache($data, $debug = true) { } /** * @param array|object $data * @param bool $debug * * @return string * @throws RestException */ public static function php($data, $debug = true) { } /** * Encode the given data in the format * * @param array $data resulting data that needs to * be encoded in the given format * @param boolean $humanReadable set to TRUE when restler * is not running in production mode. * Formatter has to make the encoded * output more human readable * * @return string encoded string * @throws \Exception */ public function encode($data, $humanReadable = false) { } public static function guessViewName($path) { } public static function getViewExtension() { } public static function getViewFile($fullPath = false, $includeExtension = true) { } /** * Decode the given data from the format * * @param string $data * data sent from client to * the api in the given format. * * @return array associative array of the parsed data * * @throws RestException */ public function decode($data) { } /** * @return bool false as HTML format is write only */ public function isReadable() { } /** * Get MIME type => Extension mappings as an associative array * * @return array list of mime strings for the format * @example array('application/json'=>'json'); */ public function getMIMEMap() { } /** * Set the selected MIME type * * @param string $mime MIME type */ public function setMIME($mime) { } /** * Get selected MIME type */ public function getMIME() { } /** * Get the selected file extension * * @return string file extension */ public function getExtension() { } /** * Set the selected file extension * * @param string $extension file extension */ public function setExtension($extension) { } } /** * Javascript Object Notation Format * * @category Framework * @package Restler * @subpackage format * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class JsonFormat extends \Luracast\Restler\Format\Format { /** * @var boolean|null shim for json_encode option JSON_PRETTY_PRINT set * it to null to use smart defaults */ public static $prettyPrint = null; /** * @var boolean|null shim for json_encode option JSON_UNESCAPED_SLASHES * set it to null to use smart defaults */ public static $unEscapedSlashes = null; /** * @var boolean|null shim for json_encode JSON_UNESCAPED_UNICODE set it * to null to use smart defaults */ public static $unEscapedUnicode = null; /** * @var boolean|null shim for json_decode JSON_BIGINT_AS_STRING set it to * null to * use smart defaults */ public static $bigIntAsString = null; /** * @var boolean|null shim for json_decode JSON_NUMERIC_CHECK set it to * null to * use smart defaults */ public static $numbersAsNumbers = null; const MIME = 'application/json'; const EXTENSION = 'json'; public function encode($data, $humanReadable = false) { } public function decode($data) { } /** * Throws an exception if an error occurred during the last JSON encoding/decoding * * @return void * @throws \RuntimeException */ protected function handleJsonError() { } } /** * Javascript Object Notation Packaged in a method (JSONP) * * @category Framework * @package Restler * @subpackage format * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class JsFormat extends \Luracast\Restler\Format\JsonFormat { const MIME = 'text/javascript'; const EXTENSION = 'js'; public static $callbackMethodName = 'parseResponse'; public static $callbackOverrideQueryString = 'callback'; public static $includeHeaders = true; public function encode($data, $human_readable = false) { } public function isReadable() { } } /** * Plist Format for Restler Framework. * Plist is the native data exchange format for Apple iOS and Mac platform. * Use this format to talk to mac applications and iOS devices. * This class is capable of serving both xml plist and binary plist. * * @category Framework * @package Restler * @subpackage format * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class PlistFormat extends \Luracast\Restler\Format\DependentMultiFormat { /** * @var boolean set it to true binary plist is preferred */ public static $compact = null; const MIME = 'application/xml,application/x-plist'; const EXTENSION = 'plist'; public function setMIME($mime) { } /** * Encode the given data in plist format * * @param array $data * resulting data that needs to * be encoded in plist format * @param boolean $humanReadable * set to true when restler * is not running in production mode. Formatter has to * make the encoded output more human readable * * @return string encoded string */ public function encode($data, $humanReadable = false) { } /** * Decode the given data from plist format * * @param string $data * data sent from client to * the api in the given format. * * @return array associative array of the parsed data */ public function decode($data) { } /** * Get external class => packagist package name as an associative array * * @return array list of dependencies for the format * * @example return ['Illuminate\\View\\View' => 'illuminate/view:4.2.*'] */ public function getDependencyMap() { } } /** * Tab Separated Value Format * * @category Framework * @package Restler * @subpackage format * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class TsvFormat extends \Luracast\Restler\Format\CsvFormat { const MIME = 'text/csv'; const EXTENSION = 'csv'; public static $delimiter = "\t"; public static $enclosure = '"'; public static $escape = '\\'; public static $haveHeaders = null; } /** * Support for Multi Part Form Data and File Uploads * * @category Framework * @package Restler * @subpackage format * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class UploadFormat extends \Luracast\Restler\Format\Format { const MIME = 'multipart/form-data'; const EXTENSION = 'post'; public static $errors = array(0 => false, 1 => "The uploaded file exceeds the maximum allowed size", 2 => "The uploaded file exceeds the maximum allowed size", 3 => "The uploaded file was only partially uploaded", 4 => "No file was uploaded", 6 => "Missing a temporary folder", 7 => "Failed to write file to disk", 8 => "A PHP extension stopped the file upload"); /** * use it if you need to restrict uploads based on file type * setting it as an empty array allows all file types * default is to allow only png and jpeg images * * @var array */ public static $allowedMimeTypes = array('image/jpeg', 'image/png'); /** * use it to restrict uploads based on file size * set it to 0 to allow all sizes * please note that it upload restrictions in the server * takes precedence so it has to be lower than or equal to that * default value is 1MB (1024x1024)bytes * usual value for the server is 8388608 * * @var int */ public static $maximumFileSize = 1048576; /** * Your own validation function for validating each uploaded file * it can return false or throw an exception for invalid file * use anonymous function / closure in PHP 5.3 and above * use function name in other cases * * @var Callable */ public static $customValidationFunction; /** * Since exceptions are triggered way before at the `get` stage * * @var bool */ public static $suppressExceptionsAsError = false; protected static function checkFile(&$file, $doMimeCheck = false, $doSizeCheck = false) { } public function encode($data, $humanReadable = false) { } public function decode($data) { } public function isWritable() { } } /** * URL Encoded String Format * * @category Framework * @package Restler * @subpackage format * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class UrlEncodedFormat extends \Luracast\Restler\Format\Format { const MIME = 'application/x-www-form-urlencoded'; const EXTENSION = 'post'; public function encode($data, $humanReadable = false) { } public function decode($data) { } public static function encoderTypeFix(array $data) { } public static function decoderTypeFix(array $data) { } } /** * XML Markup Format for Restler Framework * * @category Framework * @package Restler * @subpackage format * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class XmlFormat extends \Luracast\Restler\Format\Format { const MIME = 'application/xml'; const EXTENSION = 'xml'; // ================================================================== // // Properties related to reading/parsing/decoding xml // // ------------------------------------------------------------------ public static $importSettingsFromXml = false; public static $parseAttributes = true; public static $parseNamespaces = true; public static $parseTextNodeAsProperty = true; // ================================================================== // // Properties related to writing/encoding xml // // ------------------------------------------------------------------ public static $useTextNodeProperty = true; public static $useNamespaces = true; public static $cdataNames = array(); // ================================================================== // // Common Properties // // ------------------------------------------------------------------ public static $attributeNames = array(); public static $textNodeName = 'text'; public static $namespaces = array(); public static $namespacedProperties = array(); /** * Default name for the root node. * * @var string $rootNodeName */ public static $rootName = 'response'; public static $defaultTagName = 'item'; /** * When you decode an XML its structure is copied to the static vars * we can use this function to echo them out and then copy paste inside * our service methods * * @return string PHP source code to reproduce the configuration */ public static function exportCurrentSettings() { } public function encode($data, $humanReadable = false) { } public function write(\XMLWriter $xml, $data, $parent) { } public function decode($data) { } public function read(\SimpleXMLElement $xml, $namespaces = null) { } public static function setType($value) { } } /** * YAML Format for Restler Framework * * @category Framework * @package Restler * @subpackage format * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class YamlFormat extends \Luracast\Restler\Format\DependentFormat { const MIME = 'text/plain'; const EXTENSION = 'yaml'; const PACKAGE_NAME = 'symfony/yaml:*'; const EXTERNAL_CLASS = 'Symfony\\Component\\Yaml\\Yaml'; public function encode($data, $humanReadable = false) { } public function decode($data) { } } } namespace Luracast\Restler { /** * Default Cache that writes/reads human readable files for caching purpose * * @category Framework * @package Restler * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class HumanReadableCache implements \Luracast\Restler\iCache { /** * @var string path of the folder to hold cache files */ public static $cacheDir; public function __construct() { } /** * store data in the cache * * @param string $name * @param mixed $data * * @throws \Exception * @return boolean true if successful */ public function set($name, $data) { } /** * retrieve data from the cache * * @param string $name * @param bool $ignoreErrors * * @return mixed */ public function get($name, $ignoreErrors = false) { } /** * delete data from the cache * * @param string $name * @param bool $ignoreErrors * * @return boolean true if successful */ public function clear($name, $ignoreErrors = false) { } /** * check if the given name is cached * * @param string $name * * @return boolean true if cached */ public function isCached($name) { } } /** * Interface for creating authentication classes * * @category Framework * @package Restler * @subpackage auth * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ interface iAuthenticate extends \Luracast\Restler\iFilter { /** * @return string string to be used with WWW-Authenticate header * @example Basic * @example Digest * @example OAuth */ public function __getWWWAuthenticateString(); } /** * Interface to identify the user * * When the user is known we will be able to monitor, rate limit and do more * * @category Framework * @package restler * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ interface iIdentifyUser { /** * A way to uniquely identify the current api consumer * * When his user id is known it should be used otherwise ip address * can be used * * @param bool $includePlatform Should we consider user alone or should * consider the application/platform/device * as well for generating unique id * * @return string */ public static function getUniqueIdentifier($includePlatform = false); /** * User identity to be used for caching purpose * * When the dynamic cache service places an object in the cache, it needs to * label it with a unique identifying string known as a cache ID. This * method gives that identifier * * @return string */ public static function getCacheIdentifier(); /** * Authentication classes should call this method * * @param string $id user id as identified by the authentication classes * * @return void */ public static function setUniqueIdentifier($id); /** * User identity for caching purpose * * In a role based access control system this will be based on role * * @param $id * * @return void */ public static function setCacheIdentifier($id); } /** * Special Exception for raising API errors * that can be used in API methods * * @category Framework * @package Restler * @subpackage exception * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class RestException extends \Exception { /** * HTTP status codes * * @var array */ public static $codes = array( 100 => 'Continue', 101 => 'Switching Protocols', 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 306 => '(Unused)', 307 => 'Temporary Redirect', 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Timeout', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Long', 415 => 'Unsupported Media Type', 416 => 'Requested Range Not Satisfiable', 417 => 'Expectation Failed', 429 => 'Too Many Requests', //still in draft but used for rate limiting 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Timeout', 505 => 'HTTP Version Not Supported', ); /** * @param int $httpStatusCode http status code * @param string|null $errorMessage error message * @param array $details any extra detail about the exception * @param Exception $previous previous exception if any */ public function __construct($httpStatusCode, $errorMessage = null, array $details = array(), \Exception $previous = null) { } /** * Get extra details about the exception * * @return array details array */ public function getDetails() { } public function getStage() { } public function getStages() { } public function getErrorMessage() { } public function getSource() { } } /** * Special RestException for forcing the exception even when * in hybrid method * * @category Framework * @package Restler * @subpackage exception * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class InvalidAuthCredentials extends \Luracast\Restler\RestException { } /** * Class MemcacheCache provides a memcache based cache for Restler * * @category Framework * @package Restler * @author Dave Drager * @copyright 2014 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * @version 3.0.0rc5 */ class MemcacheCache implements \Luracast\Restler\iCache { /** * The namespace that all of the cached entries will be stored under. This allows multiple APIs to run concurrently. * * @var string */ public static $namespace; /** * @var string the memcache server hostname / IP address. For the memcache * cache method. */ public static $memcacheServer = '127.0.0.1'; /** * @var int the memcache server port. For the memcache cache method. */ public static $memcachePort = 11211; /** * @param string $namespace */ public function __construct($namespace = 'restler') { } /** * store data in the cache * * * @param string $name * @param mixed $data * * @return boolean true if successful */ public function set($name, $data) { } /** * retrieve data from the cache * * * @param string $name * @param bool $ignoreErrors * * @throws \Exception * @return mixed */ public function get($name, $ignoreErrors = false) { } /** * delete data from the cache * * * @param string $name * @param bool $ignoreErrors * * @throws \Exception * @return boolean true if successful */ public function clear($name, $ignoreErrors = false) { } /** * check if the given name is cached * * * @param string $name * * @return boolean true if cached */ public function isCached($name) { } } /** * Static Class to pass through content outside of web root * * @category Framework * @package Restler * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class PassThrough { public static $mimeTypes = array('js' => 'text/javascript', 'css' => 'text/css', 'png' => 'image/png', 'jpg' => 'image/jpeg', 'gif' => 'image/gif', 'html' => 'text/html'); /** * Serve a file outside web root * * Respond with a file stored outside web accessible path * * @param string $filename full path for the file to be served * @param bool $forceDownload should the we download instead of viewing * @param int $expires cache expiry in number of seconds * @param bool $isPublic cache control, is it public or private * * @throws RestException * */ public static function file($filename, $forceDownload = false, $expires = 0, $isPublic = true) { } } /** * Static class for handling redirection * * @category Framework * @package Restler * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class Redirect { /** * Redirect to given url * * @param string $url relative path or full url * @param array $params associative array of query parameters * @param array $flashData associative array of properties to be set in $_SESSION for one time use * @param int $status http status code to send the response with ideally 301 or 302 * * @return array */ public static function to($url, array $params = array(), array $flashData = array(), $status = 302) { } /** * Redirect back to the previous page * * Makes use of http referrer for redirection * * @return array */ public static function back() { } } /** * API Class to create Swagger Spec 1.1 compatible id and operation * listing * * @category Framework * @package Restler * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class Resources implements \Luracast\Restler\iUseAuthentication, \Luracast\Restler\iProvideMultiVersionApi { /** * @var bool should protected resources be shown to unauthenticated users? */ public static $hideProtected = true; /** * @var bool should we use format as extension? */ public static $useFormatAsExtension = true; /** * @var bool should we include newer apis in the list? works only when * Defaults::$useUrlBasedVersioning is set to true; */ public static $listHigherVersions = true; /** * @var array all http methods specified here will be excluded from * documentation */ public static $excludedHttpMethods = array('OPTIONS'); /** * @var array all paths beginning with any of the following will be excluded * from documentation */ public static $excludedPaths = array(); /** * @var bool */ public static $placeFormatExtensionBeforeDynamicParts = true; /** * @var bool should we group all the operations with the same url or not */ public static $groupOperations = false; /** * @var null|callable if the api methods are under access control mechanism * you can attach a function here that returns true or false to determine * visibility of a protected api method. this function will receive method * info as the only parameter. */ public static $accessControlFunction = null; /** * @var array type mapping for converting data types to javascript / swagger */ public static $dataTypeAlias = array('string' => 'string', 'int' => 'int', 'number' => 'float', 'float' => 'float', 'bool' => 'boolean', 'boolean' => 'boolean', 'NULL' => 'null', 'array' => 'Array', 'object' => 'Object', 'stdClass' => 'Object', 'mixed' => 'string', 'DateTime' => 'Date'); /** * @var array configurable symbols to differentiate public, hybrid and * protected api */ public static $apiDescriptionSuffixSymbols = array( 0 => '  ', //public api 1 => '  ', //hybrid api 2 => '  ', ); /** * Injected at runtime * * @var Restler instance of restler */ public $restler; /** * @var string when format is not used as the extension this property is * used to set the extension manually */ public $formatString = ''; protected $_models; protected $_bodyParam; /** * @var bool|stdClass */ protected $_fullDataRequested = false; protected $crud = array('POST' => 'create', 'GET' => 'retrieve', 'PUT' => 'update', 'DELETE' => 'delete', 'PATCH' => 'partial update'); protected static $prefixes = array('get' => 'retrieve', 'index' => 'list', 'post' => 'create', 'put' => 'update', 'patch' => 'modify', 'delete' => 'remove'); protected $_authenticated = false; protected $cacheName = ''; public function __construct() { } /** * This method will be called first for filter classes and api classes so * that they can respond accordingly for filer method call and api method * calls * * * @param bool $isAuthenticated passes true when the authentication is * done, false otherwise * * @return mixed */ public function __setAuthenticationStatus($isAuthenticated = false) { } /** * pre call for get($id) * * if cache is present, use cache */ public function _pre_get_json($id) { } /** * post call for get($id) * * create cache if in production mode * * @param $responseData * * @internal param string $data composed json output * * @return string */ public function _post_get_json($responseData) { } /** * @access hybrid * * @param string $id * * @throws RestException * @return null|stdClass * * @url GET {id} */ public function get($id = '') { } protected function _nickname(array $route) { } protected function _noNamespace($className) { } protected function _operationListing($resourcePath = '/') { } protected function _resourceListing() { } protected function _api($path, $description = '') { } protected function _operation($route, $nickname, $httpMethod = 'GET', $summary = 'description', $notes = 'long description', $responseClass = 'void') { } protected function _parameter($param) { } protected function _appendToBody($p) { } protected function _getBody() { } protected function _model($className, $instance = null) { } /** * Find the data type of the given value. * * * @param mixed $o given value for finding type * * @param bool $appendToModels if an object is found should we append to * our models list? * * @return string * * @access private */ public function getType($o, $appendToModels = false) { } /** * pre call for index() * * if cache is present, use cache */ public function _pre_index_json() { } /** * post call for index() * * create cache if in production mode * * @param $responseData * * @internal param string $data composed json output * * @return string */ public function _post_index_json($responseData) { } /** * @access hybrid * @return \stdClass */ public function index() { } protected function _loadResource($url) { } protected function _mapResources(array $allRoutes, array &$map, $version = 1) { } /** * Maximum api version supported by the api class * @return int */ public static function __getMaximumSupportedVersion() { } /** * Verifies that the requesting user is allowed to view the docs for this API * * @param $route * * @return boolean True if the user should be able to view this API's docs */ protected function verifyAccess($route) { } } /** * REST API Server. It is the server part of the Restler framework. * inspired by the RestServer code from * * * * @category Framework * @package Restler * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * * * @method static void onGet(Callable $function) fired before reading the request details * @method static void onRoute(Callable $function) fired before finding the api method * @method static void onNegotiate(Callable $function) fired before content negotiation * @method static void onPreAuthFilter(Callable $function) fired before pre auth filtering * @method static void onAuthenticate(Callable $function) fired before auth * @method static void onPostAuthFilter(Callable $function) fired before post auth filtering * @method static void onValidate(Callable $function) fired before validation * @method static void onCall(Callable $function) fired before api method call * @method static void onCompose(Callable $function) fired before composing response * @method static void onRespond(Callable $function) fired before sending response * @method static void onComplete(Callable $function) fired after sending response * @method static void onMessage(Callable $function) fired before composing error response * * @method void onGet(Callable $function) fired before reading the request details * @method void onRoute(Callable $function) fired before finding the api method * @method void onNegotiate(Callable $function) fired before content negotiation * @method void onPreAuthFilter(Callable $function) fired before pre auth filtering * @method void onAuthenticate(Callable $function) fired before auth * @method void onPostAuthFilter(Callable $function) fired before post auth filtering * @method void onValidate(Callable $function) fired before validation * @method void onCall(Callable $function) fired before api method call * @method void onCompose(Callable $function) fired before composing response * @method void onRespond(Callable $function) fired before sending response * @method void onComplete(Callable $function) fired after sending response * @method void onMessage(Callable $function) fired before composing error response * * @property bool|null _authenticated * @property bool _authVerified */ class Restler extends \Luracast\Restler\EventDispatcher { const VERSION = '3.1.0'; // ================================================================== // // Public variables // // ------------------------------------------------------------------ /** * Reference to the last exception thrown * @var RestException */ public $exception = null; /** * Used in production mode to store the routes and more * * @var iCache */ public $cache; /** * URL of the currently mapped service * * @var string */ public $url; /** * Http request method of the current request. * Any value between [GET, PUT, POST, DELETE] * * @var string */ public $requestMethod; /** * Requested data format. * Instance of the current format class * which implements the iFormat interface * * @var Format\iFormat * @example jsonFormat, xmlFormat, yamlFormat etc */ public $requestFormat; /** * Response data format. * * Instance of the current format class * which implements the iFormat interface * * @var Format\iFormat * @example jsonFormat, xmlFormat, yamlFormat etc */ public $responseFormat; /** * Http status code * * @var int|null when specified it will override @status comment */ public $responseCode = null; /** * @var string base url of the api service */ protected $baseUrl; /** * @var bool Used for waiting till verifying @format * before throwing content negotiation failed */ protected $requestFormatDiffered = false; /** * method information including metadata * * @var Data\ApiMethodInfo */ public $apiMethodInfo; /** * @var int for calculating execution time */ protected $startTime; /** * When set to false, it will run in debug mode and parse the * class files every time to map it to the URL * * @var boolean */ protected $productionMode = false; public $refreshCache = false; /** * Caching of url map is enabled or not * * @var boolean */ protected $cached; /** * @var int */ protected $apiVersion = 1; /** * @var int */ protected $requestedApiVersion = 1; /** * @var int */ protected $apiMinimumVersion = 1; /** * @var array */ protected $apiVersionMap = array(); /** * Associated array that maps formats to their respective format class name * * @var array */ protected $formatMap = array(); /** * List of the Mime Types that can be produced as a response by this API * * @var array */ protected $writableMimeTypes = array(); /** * List of the Mime Types that are supported for incoming requests by this API * * @var array */ protected $readableMimeTypes = array(); /** * Associated array that maps formats to their respective format class name * * @var array */ protected $formatOverridesMap = array('extensions' => array()); /** * list of filter classes * * @var array */ protected $filterClasses = array(); /** * instances of filter classes that are executed after authentication * * @var array */ protected $postAuthFilterClasses = array(); // ================================================================== // // Protected variables // // ------------------------------------------------------------------ /** * Data sent to the service * * @var array */ protected $requestData = array(); /** * list of authentication classes * * @var array */ protected $authClasses = array(); /** * list of error handling classes * * @var array */ protected $errorClasses = array(); protected $authenticated = false; protected $authVerified = false; /** * @var mixed */ protected $responseData; /** * Constructor * * @param boolean $productionMode When set to false, it will run in * debug mode and parse the class files * every time to map it to the URL * * @param bool $refreshCache will update the cache when set to true */ public function __construct($productionMode = false, $refreshCache = false) { } /** * Main function for processing the api request * and return the response * * @throws Exception when the api service class is missing * @throws RestException to send error response */ public function handle() { } /** * read the request details * * Find out the following * - baseUrl * - url requested * - version requested (if url based versioning) * - http verb/method * - negotiate content type * - request data * - set defaults */ protected function get() { } /** * Returns a list of the mime types (e.g. ["application/json","application/xml"]) that the API can respond with * @return array */ public function getWritableMimeTypes() { } /** * Returns the list of Mime Types for the request that the API can understand * @return array */ public function getReadableMimeTypes() { } /** * Call this method and pass all the formats that should be supported by * the API Server. Accepts multiple parameters * * @param string ,... $formatName class name of the format class that * implements iFormat * * @example $restler->setSupportedFormats('JsonFormat', 'XmlFormat'...); * @throws Exception */ public function setSupportedFormats($format = null, ...$formatName) { } /** * Call this method and pass all the formats that can be used to override * the supported formats using `@format` comment. Accepts multiple parameters * * @param string ,... $formatName class name of the format class that * implements iFormat * * @example $restler->setOverridingFormats('JsonFormat', 'XmlFormat'...); * @throws Exception */ public function setOverridingFormats($format = null, ...$formatName) { } /** * Set one or more string to be considered as the base url * * When more than one base url is provided, restler will make * use of $_SERVER['HTTP_HOST'] to find the right one * * @param string ,... $url */ public function setBaseUrls($url, ...$otherurls) { } /** * Parses the request url and get the api path * * @return string api path */ protected function getPath() { } /** * Parses the request to figure out format of the request data * * @throws RestException * @return Format\iFormat any class that implements iFormat * @example JsonFormat */ protected function getRequestFormat() { } public function getRequestStream() { } /** * Parses the request data and returns it * * @param bool $includeQueryParameters * * @return array php data */ public function getRequestData($includeQueryParameters = true) { } /** * Find the api method to execute for the requested Url */ protected function route() { } /** * Negotiate the response details such as * - cross origin resource sharing * - media type * - charset * - language * * @throws RestException */ protected function negotiate() { } protected function negotiateCORS() { } // ================================================================== // // Protected functions // // ------------------------------------------------------------------ /** * Parses the request to figure out the best format for response. * Extension, if present, overrides the Accept header * * @throws RestException * @return Format\iFormat * @example JsonFormat */ protected function negotiateResponseFormat() { } protected function negotiateCharset() { } protected function negotiateLanguage() { } /** * Filer api calls before authentication */ protected function preAuthFilter() { } protected function authenticate() { } /** * Filer api calls after authentication */ protected function postAuthFilter() { } protected function validate() { } protected function call() { } protected function compose() { } public function composeHeaders(\Luracast\Restler\RestException $e = null) { } protected function respond() { } protected function message(\Exception $exception) { } /** * Provides backward compatibility with older versions of Restler * * @param int $version restler version * * @throws \OutOfRangeException */ public function setCompatibilityMode($version = 2) { } /** * @param int $version maximum version number supported * by the api * @param int $minimum minimum version number supported * (optional) * * @throws InvalidArgumentException * @return void */ public function setAPIVersion($version = 1, $minimum = 1) { } /** * Classes implementing iFilter interface can be added for filtering out * the api consumers. * * It can be used for rate limiting based on usage from a specific ip * address or filter by country, device etc. * * @param $className */ public function addFilterClass($className) { } /** * protected methods will need at least one authentication class to be set * in order to allow that method to be executed * * @param string $className of the authentication class * @param string $resourcePath optional url prefix for mapping */ public function addAuthenticationClass($className, $resourcePath = null) { } /** * Add api classes through this method. * * All the public methods that do not start with _ (underscore) * will be will be exposed as the public api by default. * * All the protected methods that do not start with _ (underscore) * will exposed as protected api which will require authentication * * @param string $className name of the service class * @param string $resourcePath optional url prefix for mapping, uses * lowercase version of the class name when * not specified * * @return null * * @throws Exception when supplied with invalid class name */ public function addAPIClass($className, $resourcePath = null) { } /** * Add class for custom error handling * * @param string $className of the error handling class */ public function addErrorClass($className) { } /** * protected methods will need at least one authentication class to be set * in order to allow that method to be executed. When multiple authentication * classes are in use, this function provides better performance by setting * all auth classes through a single function call. * * @param array $classNames array of associative arrays containing * the authentication class name & optional * url prefix for mapping. */ public function setAuthClasses(array $classNames) { } /** * Add multiple api classes through this method. * * This method provides better performance when large number * of API classes are in use as it processes them all at once, * as opposed to hundreds (or more) addAPIClass calls. * * * All the public methods that do not start with _ (underscore) * will be will be exposed as the public api by default. * * All the protected methods that do not start with _ (underscore) * will exposed as protected api which will require authentication * * @param array $map array of associative arrays containing * the class name & optional url prefix * for mapping. * * @return null * * @throws Exception when supplied with invalid class name */ public function mapAPIClasses(array $map) { } /** * Associated array that maps formats to their respective format class name * * @return array */ public function getFormatMap() { } /** * API version requested by the client * @return int */ public function getRequestedApiVersion() { } /** * When false, restler will run in debug mode and parse the class files * every time to map it to the URL * * @return bool */ public function getProductionMode() { } /** * Chosen API version * * @return int */ public function getApiVersion() { } /** * Base Url of the API Service * * @return string * * @example http://localhost/restler3 * @example http://restler3.com */ public function getBaseUrl() { } /** * List of events that fired already * * @return array */ public function getEvents() { } /** * Magic method to expose some protected variables * * @param string $name name of the hidden property * * @return null|mixed */ public function __get($name) { } /** * Store the url map cache if needed */ public function __destruct() { } /** * pre call * * call _pre_{methodName)_{extension} if exists with the same parameters as * the api method * * @example _pre_get_json * */ protected function preCall() { } /** * post call * * call _post_{methodName}_{extension} if exists with the composed and * serialized (applying the repose format) response data * * @example _post_get_json */ protected function postCall() { } } /** * Router class that routes the urls to api methods along with parameters * * @category Framework * @package Restler * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class Routes { public static $prefixingParameterNames = array('id'); public static $fieldTypesByName = array('email' => 'email', 'password' => 'password', 'phone' => 'tel', 'mobile' => 'tel', 'tel' => 'tel', 'search' => 'search', 'date' => 'date', 'created_at' => 'datetime', 'modified_at' => 'datetime', 'url' => 'url', 'link' => 'url', 'href' => 'url', 'website' => 'url', 'color' => 'color', 'colour' => 'color'); protected static $routes = array(); protected static $models = array(); /** * Route the public and protected methods of an Api class * * @param string $className * @param string $resourcePath * @param int $version * * @throws RestException */ public static function addAPIClass($className, $resourcePath = '', $version = 1) { } /** * @access private */ public static function typeChar($type = null) { } protected static function addPath($path, array $call, $httpMethod = 'GET', $version = 1) { } /** * Find the api method for the given url and http method * * @param string $path Requested url path * @param string $httpMethod GET|POST|PUT|PATCH|DELETE etc * @param int $version Api Version number * @param array $data Data collected from the request * * @throws RestException * @return Data\ApiMethodInfo */ public static function find($path, $httpMethod, $version = 1, array $data = array()) { } public static function findAll(array $excludedPaths = array(), array $excludedHttpMethods = array(), $version = 1) { } public static function verifyAccess($route) { } /** * Populates the parameter values * * @param array $call * @param $data * * @return Data\ApiMethodInfo * * @access private */ protected static function populate(array $call, $data) { } /** * @access private */ protected static function pathVarTypeOf($var) { } protected static function typeMatch($type, $var) { } protected static function parseMagic(\ReflectionClass $class, $forResponse = true) { } /** * Get the type and associated model * * @param ReflectionClass $class * @param array $scope * * @throws RestException * @throws \Exception * @return array * * @access protected */ protected static function getTypeAndModel(\ReflectionClass $class, array $scope, $prefix = '', array $rules = array()) { } /** * Import previously created routes from cache * * @param array $routes */ public static function fromArray(array $routes) { } /** * Export current routes for cache * * @return array */ public static function toArray() { } public static function type($var) { } public static function scope(\ReflectionClass $class) { } } /** * Scope resolution class, manages instantiation and acts as a dependency * injection container * * @category Framework * @package Restler * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class Scope { public static $classAliases = array( //Core 'Restler' => 'Luracast\\Restler\\Restler', //Format classes 'AmfFormat' => 'Luracast\\Restler\\Format\\AmfFormat', 'JsFormat' => 'Luracast\\Restler\\Format\\JsFormat', 'JsonFormat' => 'Luracast\\Restler\\Format\\JsonFormat', 'HtmlFormat' => 'Luracast\\Restler\\Format\\HtmlFormat', 'PlistFormat' => 'Luracast\\Restler\\Format\\PlistFormat', 'UploadFormat' => 'Luracast\\Restler\\Format\\UploadFormat', 'UrlEncodedFormat' => 'Luracast\\Restler\\Format\\UrlEncodedFormat', 'XmlFormat' => 'Luracast\\Restler\\Format\\XmlFormat', 'YamlFormat' => 'Luracast\\Restler\\Format\\YamlFormat', 'CsvFormat' => 'Luracast\\Restler\\Format\\CsvFormat', 'TsvFormat' => 'Luracast\\Restler\\Format\\TsvFormat', //Filter classes 'RateLimit' => 'Luracast\\Restler\\Filter\\RateLimit', //UI classes 'Forms' => 'Luracast\\Restler\\UI\\Forms', 'Nav' => 'Luracast\\Restler\\UI\\Nav', 'Emmet' => 'Luracast\\Restler\\UI\\Emmet', 'T' => 'Luracast\\Restler\\UI\\Tags', //API classes 'Resources' => 'Luracast\\Restler\\Resources', 'Explorer' => 'Luracast\\Restler\\Explorer\\v2\\Explorer', 'Explorer1' => 'Luracast\\Restler\\Explorer\\v1\\Explorer', 'Explorer2' => 'Luracast\\Restler\\Explorer\\v2\\Explorer', //Cache classes 'HumanReadableCache' => 'Luracast\\Restler\\HumanReadableCache', 'ApcCache' => 'Luracast\\Restler\\ApcCache', 'MemcacheCache' => 'Luracast\\Restler\\MemcacheCache', //Utility classes 'Object' => 'Luracast\\Restler\\Data\\Obj', 'Text' => 'Luracast\\Restler\\Data\\Text', 'Arr' => 'Luracast\\Restler\\Data\\Arr', //Exception 'RestException' => 'Luracast\\Restler\\RestException', ); /** * @var null|Callable adding a resolver function that accepts * the class name as the parameter and returns an instance of the class * as a singleton. Allows the use of your favourite DI container */ public static $resolver = null; public static $properties = array(); protected static $instances = array(); protected static $registry = array(); /** * @param string $name * @param callable $function * @param bool $singleton */ public static function register($name, $function, $singleton = true) { } public static function set($name, $instance) { } public static function get($name) { } /** * Get fully qualified class name for the given scope * * @param string $className * @param array $scope local scope * * @return string|boolean returns the class name or false */ public static function resolve($className, array $scope) { } } } namespace Luracast\Restler\UI { /** * Class Emmet * @package Luracast\Restler\UI * * @version 3.1.0 */ class Emmet { const DELIMITERS = '.#*>+^[=" ]{$@-#}'; /** * Create the needed tag hierarchy from emmet string * * @param string $string * * @param array|string $data * * @return array|T */ public static function make($string, $data = null) { } public static function tokenize($string) { } } /** * Utility class for automatically generating forms for the given http method * and api url * * @category Framework * @package Restler * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class Forms implements \Luracast\Restler\iFilter { const FORM_KEY = 'form_key'; public static $filterFormRequestsOnly = false; public static $excludedPaths = array(); /** * @var bool should we fill up the form using given data? */ public static $preFill = true; /** * @var ValidationInfo */ public static $validationInfo = null; protected static $inputTypes = array('hidden', 'password', 'button', 'image', 'file', 'reset', 'submit', 'search', 'checkbox', 'radio', 'email', 'text', 'color', 'date', 'datetime', 'datetime-local', 'email', 'month', 'number', 'range', 'search', 'tel', 'time', 'url', 'week'); protected static $fileUpload = false; public static function setStyles(\Luracast\Restler\UI\HtmlForm $style) { } /** * Get the form * * @param string $method http method to submit the form * @param string $action relative path from the web root. When set to null * it uses the current api method's path * @param bool $dataOnly if you want to render the form yourself use this * option * @param string $prefix used for adjusting the spacing in front of * form elements * @param string $indent used for adjusting indentation * * @return array|T * * @throws RestException */ public static function get($method = 'POST', $action = null, $dataOnly = false, $prefix = '', $indent = ' ') { } public static function style($name, array $metadata, $type = '') { } public static function fields($dataOnly = false) { } /** * @param ValidationInfo $p * * @param bool $dataOnly * * @return array|T */ public static function field(\Luracast\Restler\Data\ValidationInfo $p, $dataOnly = false) { } protected static function guessFieldType(\Luracast\Restler\Data\ValidationInfo $p, $type = 'type') { } /** * Get the form key * * @param string $method http method for form key * @param string $action relative path from the web root. When set to null * it uses the current api method's path * * @return string generated form key */ public static function key($method = 'POST', $action = null) { } /** * Access verification method. * * API access will be denied when this method returns false * * @return boolean true when api access is allowed false otherwise * * @throws RestException 403 security violation */ public function __isAllowed() { } } /** * Utility class for providing preset styles for html forms * * @category Framework * @package Restler * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * @version 3.0.0rc6 */ class FormStyles { public static $html = array( 'form' => 'form[role=form id=$id# name=$name# method=$method# action=$action# enctype=$enctype#]', 'input' => '.row>section>label{$label#}^input[id=$id# name=$name# value=$value# type=$type# required=$required# autofocus=$autofocus# placeholder=$default# accept=$accept# disabled=$disabled#]', 'textarea' => '.row>label{$label#}^textarea[id=$id# name=$name# required=$required# autofocus=$autofocus# placeholder=$default# rows=3 disabled=$disabled#]{$value#}', 'radio' => '.row>section>label{$label#}^span>label*options>input[id=$id# name=$name# value=$value# type=radio checked=$selected# required=$required# disabled=$disabled#]+{ $text#}', 'select' => '.row>label{$label#}^select[id=$id# name=$name# required=$required#]>option[value]+option[value=$value# selected=$selected# disabled=$disabled#]{$text#}*options', 'submit' => '.row>label{   }^button[id=$id# type=submit disabled=$disabled#]{$label#}', 'fieldset' => 'fieldset>legend{$label#}', 'checkbox' => '.row>label>input[id=$id# name=$name# value=$value# type=checkbox checked=$selected# required=$required# autofocus=$autofocus# accept=$accept# disabled=$disabled#]+{$label#}', //------------- TYPE BASED STYLES ---------------------// 'checkbox-array' => 'fieldset>legend{$label#}+section*options>label>input[name=$name# value=$value# type=checkbox checked=$selected# required=$required# autofocus=$autofocus# accept=$accept#]+{ $text#}', 'select-array' => 'label{$label#}+select[name=$name# required=$required# multiple style="height: auto;background-image: none; outline: inherit;"]>option[value=$value# selected=$selected#]{$text#}*options', ); public static $bootstrap3 = array( 'form' => 'form[role=form id=$id# name=$name# method=$method# action=$action# enctype=$enctype#]', 'input' => '.form-group.$error#>label{$label#}+input.form-control[id=$id# name=$name# value=$value# type=$type# required=$required# autofocus=$autofocus# placeholder=$default# accept=$accept# disabled=$disabled#]+small.help-block>{$message#}', 'textarea' => '.form-group>label{$label#}+textarea.form-control[id=$id# name=$name# required=$required# autofocus=$autofocus# placeholder=$default# rows=3 disabled=$disabled#]{$value#}+small.help-block>{$message#}', 'radio' => 'fieldset>legend{$label#}>.radio*options>label>input.radio[name=$name# value=$value# type=radio checked=$selected# required=$required# disabled=$disabled#]{$text#}+p.help-block>{$message#}', 'select' => '.form-group>label{$label#}+select.form-control[id=$id# name=$name# multiple=$multiple# required=$required#]>option[value]+option[value=$value# selected=$selected# disabled=$disabled#]{$text#}*options', 'submit' => 'button.btn.btn-primary[id=$id# type=submit]{$label#} disabled=$disabled#', 'fieldset' => 'fieldset>legend{$label#}', 'checkbox' => '.checkbox>label>input[id=$id# name=$name# value=$value# type=checkbox checked=$selected# required=$required# autofocus=$autofocus# disabled=$disabled#]+{$label#}^p.help-block>{$error#}', //------------- TYPE BASED STYLES ---------------------// 'checkbox-array' => 'fieldset>legend{$label#}>.checkbox*options>label>input[name=$name# value=$value# type=checkbox checked=$selected# required=$required#]{$text#}', 'select-array' => '.form-group>label{$label#}+select.form-control[name=$name# multiple=$multiple# required=$required#] size=$options#>option[value=$value# selected=$selected#]{$text#}*options', //------------- CUSTOM STYLES ---------------------// 'radio-inline' => '.form-group>label{$label# :  }+label.radio-inline*options>input.radio[name=$name# value=$value# type=radio checked=$selected# required=$required#]+{$text#}', ); public static $foundation5 = array( 'form' => 'form[id=$id# name=$name# method=$method# action=$action# enctype=$enctype#]', 'input' => 'label{$label#}+input[id=$id# name=$name# value=$value# type=$type# required=$required# autofocus=$autofocus# placeholder=$default# accept=$accept# disabled=$disabled#]', 'textarea' => 'label{$label#}+textarea[id=$id# name=$name# required=$required# autofocus=$autofocus# placeholder=$default# rows=3 disabled=$disabled#]{$value#}', 'radio' => 'label{$label# :  }+label.radio-inline*options>input.radio[name=$name# value=$value# type=radio checked=$selected# required=$required# disabled=$disabled#]+{$text#}', 'select' => 'label{$label#}+select[id=$id# name=$name# required=$required#]>option[value]+option[value=$value# selected=$selected# disabled=$disabled#]{$text#}*options', 'submit' => 'button.button[id=$id# type=submit disabled=$disabled#]{$label#}', 'fieldset' => 'fieldset>legend{$label#}', 'checkbox' => 'label>input[id=$id# name=$name# value=$value# type=checkbox checked=$selected# required=$required# autofocus=$autofocus# disabled=$disabled#]+{ $label#}', //------------- TYPE BASED STYLES ---------------------// 'checkbox-array' => 'fieldset>legend{$label#}+label*options>input[name=$name# value=$value# type=checkbox checked=$selected# required=$required# autofocus=$autofocus#]+{ $text#}', 'select-array' => 'label{$label#}+select[name=$name# required=$required# multiple style="height: auto;background-image: none; outline: inherit;"]>option[value=$value# selected=$selected#]{$text#}*options', ); } /** * Utility class for automatically creating data to build an navigation interface * based on available routes that are accessible by the current user * * @category Framework * @package Restler * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class Nav { protected static $tree = array(); public static $root = 'home'; /** * @var array all paths beginning with any of the following will be excluded * from documentation. if an empty string is given it will exclude the root */ public static $excludedPaths = array(''); /** * @var array prefix additional menu items with one of the following syntax * [$path => $text] * [$path] * [$path => ['text' => $text, 'url' => $url, 'trail'=> $trail]] */ public static $prepends = array(); /** * @var array suffix additional menu items with one of the following syntax * [$path => $text] * [$path] * [$path => ['text' => $text, 'url' => $url, 'trail'=> $trail]] */ public static $appends = array(); public static $addExtension = true; protected static $extension = ''; protected static $activeTrail = ''; protected static $url; public static function get($for = '', $activeTrail = null) { } protected static function &nested(array &$tree, array $parts) { } public static function addUrls(array $urls) { } public static function add($url, $label = null, $trail = null) { } public static function build(array $r) { } } /** * Utility class for generating html tags in an object oriented way * * @category Framework * @package Restler * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * * * ============================ magic properties ============================== * @property Tags parent parent tag * ============================== magic methods =============================== * @method Tags name(string $value) name attribute * @method Tags action(string $value) action attribute * @method Tags placeholder(string $value) placeholder attribute * @method Tags value(string $value) value attribute * @method Tags required(boolean $value) required attribute * @method Tags class(string $value) required attribute * * =========================== static magic methods ============================ * @method static Tags form() creates a html form * @method static Tags input() creates a html input element * @method static Tags button() creates a html button element * */ class Tags implements \ArrayAccess, \Countable { public static $humanReadable = true; public static $initializer = null; protected static $instances = array(); public $prefix = ''; public $indent = ' '; public $tag; protected $attributes = array(); protected $children = array(); protected $_parent; public function __construct($name = null, array $children = array()) { } /** * Get Tag by id * * Retrieve a tag by its id attribute * * @param string $id * * @return Tags|null */ public static function byId($id) { } /** * @param $name * @param array $children * * @return Tags */ public static function __callStatic($name, array $children) { } public function toString($prefix = '', $indent = ' ') { } public function __toString() { } public function toArray() { } /** * Set the id attribute of the current tag * * @param string $value * * @return string */ public function id($value) { } public function __get($name) { } public function __set($name, $value) { } public function __isset($name) { } /** * @param $attribute * @param $value * * @return Tags */ public function __call($attribute, $value) { } public function offsetGet($index) { } public function offsetExists($index) { } public function offsetSet($index, $value) { } public function offsetUnset($index) { } public function getContents() { } public function count() { } } } namespace Luracast\Restler { /** * Information gathered about the api user is kept here using static methods * and properties for other classes to make use of them. * Typically Authentication classes populate them * * @category Framework * @package restler * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class User implements \Luracast\Restler\iIdentifyUser { public static $id = null; public static $cacheId = null; public static $ip; public static $browser = ''; public static $platform = ''; public static function init() { } public static function getUniqueIdentifier($includePlatform = false) { } public static function getIpAddress($ignoreProxies = false) { } /** * Authentication classes should call this method * * @param string $id user id as identified by the authentication classes * * @return void */ public static function setUniqueIdentifier($id) { } /** * User identity to be used for caching purpose * * When the dynamic cache service places an object in the cache, it needs to * label it with a unique identifying string known as a cache ID. This * method gives that identifier * * @return string */ public static function getCacheIdentifier() { } /** * User identity for caching purpose * * In a role based access control system this will be based on role * * @param $id * * @return void */ public static function setCacheIdentifier($id) { } } /** * Describe the purpose of this class/interface/trait * * @category Framework * @package Restler * @author R.Arul Kumaran * @copyright 2010 Luracast * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link http://luracast.com/products/restler/ * */ class Util { /** * @var Restler instance injected at runtime */ public static $restler; /** * verify if the given data type string is scalar or not * * @static * * @param string $type data type as string * * @return bool true or false */ public static function isObjectOrArray($type) { } /** * Get the value deeply nested inside an array / object * * Using isset() to test the presence of nested value can give a false positive * * This method serves that need * * When the deeply nested property is found its value is returned, otherwise * false is returned. * * @param array|object $from array to extract the value from * @param string|array $key ... pass more to go deeply inside the array * alternatively you can pass a single array * * @return null|mixed null when not found, value otherwise */ public static function nestedValue($from, $key) { } public static function getResourcePath($className, $resourcePath = null, $prefix = '') { } /** * Compare two strings and remove the common * sub string from the first string and return it * * @static * * @param string $fromPath * @param string $usingPath * @param string $char * optional, set it as * blank string for char by char comparison * * @return string */ public static function removeCommonPath($fromPath, $usingPath, $char = '/') { } /** * Compare two strings and split the common * sub string from the first string and return it as array * * @static * * @param string $fromPath * @param string $usingPath * @param string $char * optional, set it as * blank string for char by char comparison * * @return array with 2 strings first is the common string and second is the remaining in $fromPath */ public static function splitCommonPath($fromPath, $usingPath, $char = '/') { } /** * Parses the request to figure out the http request type * * @static * * @return string which will be one of the following * [GET, POST, PUT, PATCH, DELETE] * @example GET */ public static function getRequestMethod() { } /** * Pass any content negotiation header such as Accept, * Accept-Language to break it up and sort the resulting array by * the order of negotiation. * * @static * * @param string $accept header value * * @return array sorted by the priority */ public static function sortByPriority($accept) { } public static function getShortName($className) { } } } namespace { /** * Include function in the root namespace to include files optimized * for the global context. * * @param $path string path of php file to include into the global context. * * @return mixed|bool false if the file could not be included. */ function Luracast_Restler_autoloaderInclude($path) { } } namespace { function exceptions() { } function parse_backtrace($raw, $skip = 1) { } function render($data, $shadow = \true) { } }