public function cat($file, \Response $oReponse = null) { $query_string = http_build_query(array()); // récuperation de la requete require_once __DIR__ . "/Request.php"; $oRequest = new Request(); // lance la requete $response = $oRequest->send(array('verb' => 'GET', 'resource' => '/' . $this->_bucket . '/' . urlencode($file) . '?' . $query_string), $this->_auth); // vérification du code de retour if ($oRequest->info('http_code') !== 200) { // ouverture du flux xml require_once __DIR__ . "/XMLElement.php"; throw new Client_Exception(new XMLElement($response), $oRequest); } // lecture du flux if ($oReponse !== null) { $oReponse->appendBody($response); $oReponse->type($oRequest->info('content_type')); // ajout des headers pour le validator HTTP $aHeaders = $oRequest->info('headers'); $oReponse->header("ETag", $aHeaders['ETag']); $oReponse->header("Last-Modified", $aHeaders['Last-Modified']); } return $response; }
/** * 执行应用程序 * @access public * @return void */ public static function run() { // 注册错误和异常处理机制 以及初始化配置 register_shutdown_function('\\think\\Error::appShutdown'); set_error_handler('\\think\\Error::appError'); set_exception_handler('\\think\\Error::appException'); Config::load(THINK_PATH . 'config' . EXT); // 初始化应用(公共模块) 初始化变量配置 self::initModule(COMMON_MODULE, Config::get()); // 获取配置参数 $config = Config::get(); // 设置系统时区 date_default_timezone_set($config['default_timezone']); // 监听app_init APP_HOOK && Hook::listen('app_init'); // 开启多语言机制 // 启动session CLI 不开启 if (!IS_CLI && $config['use_session']) { Session::init($config['session']); } if (empty(self::$dispatch['type'])) { // 未指定调度类型 则进行URL路由检测 self::route($config); } // 记录路由信息 APP_DEBUG && Log::record('[ ROUTE ] ' . var_export(self::$dispatch, true), 'info'); // 监听app_begin APP_HOOK && Hook::listen('app_begin'); // 根据类型调度 switch (self::$dispatch['type']) { case 'redirect': // 执行重定向跳转 header('Location: ' . self::$dispatch['url'], true, self::$dispatch['status']); break; case 'module': // 模块/控制器/操作 $data = self::module(self::$dispatch['module'], $config); break; case 'controller': // 执行控制器操作 //$data = Loader::action(self::$dispatch['controller'], self::$dispatch['params']); break; case 'method': // 执行回调方法 $data = self::invokeMethod(self::$dispatch['method'], self::$dispatch['params']); break; case 'function': // 规则闭包 $data = self::invokeFunction(self::$dispatch['function'], self::$dispatch['params']); break; default: throw new Exception('dispatch type not support', 10008); } // 监听app_end APP_HOOK && Hook::listen('app_end', $data); // 输出数据到客户端 return Response::send($data, Response::type(), Config::get('response_return')); }
public static function viaJavaScript($url, $parent = false) { if ($link = Filter::with('core.redirect', $url)) { Response::type('text/html'); Response::add('<script>' . ($parent ? 'parent.' : '') . 'location.href="', addslashes($link), '"</script>'); Response::send(); exit; } }
public static function set($type, $response) { if (!in_array($type, self::$response_types)) { echo "Invalid Response Type"; return false; } self::$type = $type; self::$response = $response; return array(self::$type => self::$response); }
/** * Inject the script with the cookie warning * * @param Response $response : Response * @return void */ protected function _injectCookieAdvert($response) { if (strpos($response->type(), 'html') === false) { return; } $body = $response->body(); $pos = strrpos($body, '</body>'); if ($pos === false) { return; } $view = "<iframe src='" . Router::url('/cookie_warning/cookie-warnings/display-info') . "' style='width:100%;position:fixed;top:0;left: 0;z-index:9999' id='cookie_iframe'></iframe>"; $body = substr($body, 0, $pos) . $view . substr($body, $pos); $response->body($body); }
/** * 执行应用程序 * @access public * @return void */ public static function run() { // 初始化公共模块 self::initModule(COMMON_MODULE, Config::get()); // 读取扩展配置文件 if (Config::get('extra_config_list')) { foreach (Config::get('extra_config_list') as $file) { Config::load($file, $file); } } // 获取配置参数 $config = Config::get(); // 加载额外文件 if (!empty($config['extra_file_list'])) { foreach ($config['extra_file_list'] as $file) { $file = strpos($file, '.') ? $file : APP_PATH . $file . EXT; if (is_file($file)) { include_once $file; } } } // 日志初始化 Log::init($config['log']); // 缓存初始化 Cache::connect($config['cache']); // 设置系统时区 date_default_timezone_set($config['default_timezone']); // 监听app_init APP_HOOK && Hook::listen('app_init'); // 开启多语言机制 if ($config['lang_switch_on']) { // 获取当前语言 defined('LANG_SET') or define('LANG_SET', Lang::range()); // 加载系统语言包 Lang::load(THINK_PATH . 'lang' . DS . LANG_SET . EXT); } // 启动session CLI 不开启 if (!IS_CLI && $config['use_session']) { Session::init($config['session']); } // 应用URL调度 self::dispatch($config); // 监听app_run APP_HOOK && Hook::listen('app_run'); // 执行操作 if (!preg_match('/^[A-Za-z](\\/|\\.|\\w)*$/', CONTROLLER_NAME)) { // 安全检测 throw new Exception('illegal controller name:' . CONTROLLER_NAME, 10000); } if (Config::get('action_bind_class')) { $class = self::bindActionClass(Config::get('empty_controller')); $instance = new $class(); // 操作绑定到类后 固定执行run入口 $action = 'run'; } else { $instance = Loader::controller(CONTROLLER_NAME, '', Config::get('empty_controller')); // 获取当前操作名 $action = ACTION_NAME . Config::get('action_suffix'); } if (!$instance) { throw new Exception('class [ ' . Loader::parseClass(MODULE_NAME, CONTROLLER_LAYER, CONTROLLER_NAME) . ' ] not exists', 10001); } try { // 操作方法开始监听 $call = [$instance, $action]; APP_HOOK && Hook::listen('action_begin', $call); if (!preg_match('/^[A-Za-z](\\w)*$/', $action)) { // 非法操作 throw new \ReflectionException(); } //执行当前操作 $method = new \ReflectionMethod($instance, $action); if ($method->isPublic()) { // URL参数绑定检测 if (Config::get('url_params_bind') && $method->getNumberOfParameters() > 0) { // 获取绑定参数 $args = self::getBindParams($method, Config::get('url_parmas_bind_type')); // 全局过滤 array_walk_recursive($args, 'think\\Input::filterExp'); $data = $method->invokeArgs($instance, $args); } else { $data = $method->invoke($instance); } // 操作方法执行完成监听 APP_HOOK && Hook::listen('action_end', $data); // 输出数据 return Response::send($data, Response::type(), Config::get('response_return')); } else { // 操作方法不是Public 抛出异常 throw new \ReflectionException(); } } catch (\ReflectionException $e) { // 操作不存在 if (method_exists($instance, '_empty')) { $method = new \ReflectionMethod($instance, '_empty'); $data = $method->invokeArgs($instance, [$action, '']); // 操作方法执行完成监听 APP_HOOK && Hook::listen('action_end', $data); // 输出数据 return Response::send($data, Response::type(), Config::get('response_return')); } else { throw new Exception('method [ ' . (new \ReflectionClass($instance))->getName() . '->' . $action . ' ] not exists ', 10002); } } }
/** * 执行应用程序 * @access public * @return void */ public static function run() { // 初始化应用(公共模块) self::initModule(COMMON_MODULE, Config::get()); // 读取扩展配置文件 if (Config::get('extra_config_list')) { foreach (Config::get('extra_config_list') as $name => $file) { $file = strpos($file, '.') ? $file : APP_PATH . $file . EXT; Config::load($file, is_string($name) ? $name : pathinfo($file, PATHINFO_FILENAME)); } } // 获取配置参数 $config = Config::get(); // 加载额外文件 if (!empty($config['extra_file_list'])) { foreach ($config['extra_file_list'] as $file) { $file = strpos($file, '.') ? $file : APP_PATH . $file . EXT; if (is_file($file)) { include_once $file; } } } // 设置系统时区 date_default_timezone_set($config['default_timezone']); // 监听app_init APP_HOOK && Hook::listen('app_init'); // 开启多语言机制 if ($config['lang_switch_on']) { // 获取当前语言 defined('LANG_SET') or define('LANG_SET', Lang::range()); // 加载系统语言包 Lang::load(THINK_PATH . 'lang' . DS . LANG_SET . EXT); if (!APP_MULTI_MODULE) { Lang::load(APP_PATH . 'lang' . DS . LANG_SET . EXT); } } // 启动session CLI 不开启 if (!IS_CLI && $config['use_session']) { Session::init($config['session']); } if (empty(self::$dispatch['type'])) { // 未指定调度类型 则进行URL路由检测 self::route($config); } // 监听app_begin APP_HOOK && Hook::listen('app_begin'); // 根据类型调度 switch (self::$dispatch['type']) { case 'redirect': // 执行重定向跳转 header('Location: ' . self::$dispatch['url'], true, self::$dispatch['status']); break; case 'module': // 模块/控制器/操作 $data = self::module(self::$dispatch['module'], $config); break; case 'controller': // 执行控制器操作 $data = Loader::action(self::$dispatch['controller'], self::$dispatch['params']); break; case 'method': // 执行回调方法 $data = self::invokeMethod(self::$dispatch['method'], self::$dispatch['params']); break; case 'function': // 规则闭包 $data = self::invokeFunction(self::$dispatch['function'], self::$dispatch['params']); break; default: throw new Exception('dispatch type not support', 10008); } // 监听app_end APP_HOOK && Hook::listen('app_end', $data); // 输出数据到客户端 return Response::send($data, Response::type(), Config::get('response_return')); }
/** * 解析和获取模板内容 用于输出 * @access public * * @param string $template 模板文件名或者内容 * @param array $vars 模板输出变量 * @param array $config 模板参数 * @param bool $renderContent 是否渲染内容 * * @return string * @throws Exception */ public function fetch($template = '', $vars = [], $config = [], $renderContent = false) { // 模板变量 $vars = $vars ? $vars : $this->data; if (!$renderContent) { // 获取模板文件名 $template = $this->parseTemplate($template); // 开启调试模式Win环境严格区分大小写 // 模板不存在 抛出异常 if (!is_file($template) || APP_DEBUG && IS_WIN && realpath($template) != $template) { throw new Exception('template file not exists:' . $template, 10700); } // 记录视图信息 APP_DEBUG && Log::record('[ VIEW ] ' . $template . ' [ ' . var_export($vars, true) . ' ]', 'info'); } // 页面缓存 ob_start(); ob_implicit_flush(0); if ('php' == $this->engine || empty($this->engine)) { // 原生PHP解析 extract($vars, EXTR_OVERWRITE); is_file($template) ? include $template : eval('?>' . $template); } else { // 指定模板引擎 $this->engine->fetch($template, $vars, $config); } // 获取并清空缓存 $content = ob_get_clean(); // 内容过滤标签 APP_HOOK && Hook::listen('view_filter', $content); // 允许用户自定义模板的字符串替换 if (!empty($this->config['parse_str'])) { $replace = $this->config['parse_str']; $content = str_replace(array_keys($replace), array_values($replace), $content); } if (!Config::get('response_auto_output')) { // 自动响应输出 return Response::send($content, Response::type()); } return $content; }
/** * 执行应用程序 * @access public * @return void */ public static function run() { // 初始化应用(公共模块) self::initModule(COMMON_MODULE, Config::get()); // 获取配置参数 $config = Config::get(); // 注册根命名空间 if (!empty($config['root_namespace'])) { Loader::addNamespace($config['root_namespace']); } // 加载额外文件 if (!empty($config['extra_file_list'])) { foreach ($config['extra_file_list'] as $file) { $file = strpos($file, '.') ? $file : APP_PATH . $file . EXT; if (is_file($file)) { include_once $file; } } } // 设置系统时区 date_default_timezone_set($config['default_timezone']); // 监听app_init APP_HOOK && Hook::listen('app_init'); // 开启多语言机制 if ($config['lang_switch_on']) { // 获取当前语言 defined('LANG_SET') or define('LANG_SET', Lang::range()); // 加载系统语言包 Lang::load(THINK_PATH . 'lang' . DS . LANG_SET . EXT); if (!APP_MULTI_MODULE) { Lang::load(APP_PATH . 'lang' . DS . LANG_SET . EXT); } } if (empty(self::$dispatch['type'])) { // 未指定调度类型 则进行URL路由检测 self::route($config); } // 记录路由信息 APP_DEBUG && Log::record('[ ROUTE ] ' . var_export(self::$dispatch, true), 'info'); // 监听app_begin APP_HOOK && Hook::listen('app_begin'); // 根据类型调度 switch (self::$dispatch['type']) { case 'redirect': // 执行重定向跳转 header('Location: ' . self::$dispatch['url'], true, self::$dispatch['status']); break; case 'module': // 模块/控制器/操作 $data = self::module(self::$dispatch['module'], $config); break; case 'controller': // 执行控制器操作 $data = Loader::action(self::$dispatch['controller'], self::$dispatch['params']); break; case 'method': // 执行回调方法 $data = self::invokeMethod(self::$dispatch['method'], self::$dispatch['params']); break; case 'function': // 规则闭包 $data = self::invokeFunction(self::$dispatch['function'], self::$dispatch['params']); break; default: throw new Exception('dispatch type not support', 10008); } // 监听app_end APP_HOOK && Hook::listen('app_end', $data); // 输出数据到客户端 if (Config::get('response_auto_output')) { // 自动响应输出 return Response::send($data, Response::type(), Config::get('response_return')); } }
/** * 执行应用程序 * @access public * @return void */ public static function run() { // 初始化应用(公共模块) self::initModule(COMMON_MODULE, Config::get()); // 读取扩展配置文件 if (Config::get('extra_config_list')) { foreach (Config::get('extra_config_list') as $file) { Config::load($file, $file); } } // 获取配置参数 $config = Config::get(); // 加载额外文件 if (!empty($config['extra_file_list'])) { foreach ($config['extra_file_list'] as $file) { $file = strpos($file, '.') ? $file : APP_PATH . $file . EXT; if (is_file($file)) { include_once $file; } } } // 日志初始化 Log::init($config['log']); // 缓存初始化 Cache::connect($config['cache']); // 设置系统时区 date_default_timezone_set($config['default_timezone']); // 监听app_init APP_HOOK && Hook::listen('app_init'); // 开启多语言机制 if ($config['lang_switch_on']) { // 获取当前语言 defined('LANG_SET') or define('LANG_SET', Lang::range()); // 加载系统语言包 Lang::load(THINK_PATH . 'lang' . DS . LANG_SET . EXT); } // 启动session CLI 不开启 if (!IS_CLI && $config['use_session']) { Session::init($config['session']); } // URL路由检测 $dispatch = self::route($config); // 监听app_begin APP_HOOK && Hook::listen('app_begin', $dispatch); // 根据类型调度 switch ($dispatch['type']) { case 'redirect': // 执行重定向跳转 header('Location: ' . $dispatch['url'], true, $dispatch['status']); break; case 'module': // 模块/控制器/操作 $data = self::module($dispatch['data'], $config); break; case 'action': // 执行操作 $data = Loader::action($dispatch['action'], $dispatch['params']); break; case 'behavior': // 执行行为 $data = Hook::exec($dispatch['class'], $dispatch['method'], $dispatch['params']); break; case 'regex_closure': // 正则闭包 $data = self::invokeRegex($dispatch['closure'], $dispatch['params']); break; case 'rule_closure': // 规则闭包 $data = self::invokeRule($dispatch['closure'], $dispatch['params']); break; default: throw new Exception('dispatch type not support', 10008); } // 监听app_end APP_HOOK && Hook::listen('app_end', $data); // 输出数据到客户端 return Response::send($data, Response::type(), Config::get('response_return')); }
/** * 执行应用程序 * @access public * @return void */ public static function run() { // 初始化应用(公共模块) self::initModule(COMMON_MODULE, Config::get()); // 读取扩展配置文件 if (Config::get('extra_config_list')) { foreach (Config::get('extra_config_list') as $file) { Config::load($file, $file); } } // 获取配置参数 $config = Config::get(); // 加载额外文件 if (!empty($config['extra_file_list'])) { foreach ($config['extra_file_list'] as $file) { $file = strpos($file, '.') ? $file : APP_PATH . $file . EXT; if (is_file($file)) { include_once $file; } } } // 日志初始化 Log::init($config['log']); // 缓存初始化 Cache::connect($config['cache']); // 设置系统时区 date_default_timezone_set($config['default_timezone']); // 监听app_init APP_HOOK && Hook::listen('app_init'); // 开启多语言机制 if ($config['lang_switch_on']) { // 获取当前语言 defined('LANG_SET') or define('LANG_SET', Lang::range()); // 加载系统语言包 Lang::load(THINK_PATH . 'lang' . DS . LANG_SET . EXT); } // 启动session CLI 不开启 if (!IS_CLI && $config['use_session']) { Session::init($config['session']); } if (empty(self::$dispatch['type'])) { // 未指定调度类型 则进行URL路由检测 self::route($config); } // 监听app_begin APP_HOOK && Hook::listen('app_begin'); // 根据类型调度 switch (self::$dispatch['type']) { case 'redirect': // 执行重定向跳转 header('Location: ' . self::$dispatch['url'], true, self::$dispatch['status']); break; case 'module': // 模块/控制器/操作 $data = self::module(self::$dispatch['data'], $config); break; case 'controller': // 执行控制器操作 $data = Loader::action(self::$dispatch['controller'], self::$dispatch['params']); break; case 'callable': // 执行回调方法 $callable = self::$dispatch['callable']; if (is_callable($callable)) { $data = is_array($callable) ? self::reflectionInvoke(new $callable[0](), $callable[1]) : call_user_func_array($callable, self::$dispatch['params']); // 静态方法或者函数 } else { throw new Exception('not callable : ' . (is_array($callable) ? implode('->', $callable) : $callable), 10009); } break; case 'closure': // 规则闭包 $data = self::invoke(self::$dispatch['closure'], self::$dispatch['params']); break; default: throw new Exception('dispatch type not support', 10008); } // 监听app_end APP_HOOK && Hook::listen('app_end', $data); // 输出数据到客户端 return Response::send($data, Response::type(), Config::get('response_return')); }
public static function viaJavaScript($url, $parent = false) { Response::type('text/html'); Response::text('<script>' . ($parent ? 'parent.' : '') . 'location.href="', addslashes($url), '"</script>'); }
/** * Run one of the mapped callbacks to a passed HTTP Method. * @param array $args The arguments to be passed to the callback * @param string $method The HTTP Method requested. * @return array The callback response. */ public function run(array $args, $method = 'get') { $method = strtolower($method); $append_echoed_text = Options::get('core.route.append_echoed_text', true); static::trigger('start', $this, $args, $method); // Call direct befores if ($this->befores) { // Reverse befores order foreach (array_reverse($this->befores) as $mw) { static::trigger('before', $this, $mw); Event::trigger('core.route.before', $this, $mw); ob_start(); $mw_result = call_user_func($mw); $raw_echoed = ob_get_clean(); if ($append_echoed_text) { Response::add($raw_echoed); } if (false === $mw_result) { return ['']; } else { Response::add($mw_result); } } } $callback = is_array($this->callback) && isset($this->callback[$method]) ? $this->callback[$method] : $this->callback; if (is_callable($callback) || is_a($callback, "View")) { Response::type(Options::get('core.route.response_default_type', Response::TYPE_HTML)); ob_start(); if (is_a($callback, "View")) { // Get the rendered view $view_results = (string) $callback; } else { $view_results = call_user_func_array($callback, $args); } $raw_echoed = ob_get_clean(); if ($append_echoed_text) { Response::add($raw_echoed); } Response::add($view_results); } // Apply afters if ($this->afters) { foreach ($this->afters as $mw) { static::trigger('after', $this, $mw); Event::trigger('core.route.after', $this, $mw); ob_start(); $mw_result = call_user_func($mw); $raw_echoed = ob_get_clean(); if ($append_echoed_text) { Response::add($raw_echoed); } if (false === $mw_result) { return ['']; } else { Response::add($mw_result); } } } static::trigger('end', $this, $args, $method); Event::trigger('core.route.end', $this); return [Filter::with('core.route.response', Response::body())]; }