/** * Runs the request, handling from routing straight through to response output. * Primary method to be used by the external API. * * @return string|null Returns a string if {@link $_sendResponse} is false */ public function run() { ob_start(); XenForo_Application::set('fc', $this); $this->setup(); $this->setRequestPaths(); $showDebugOutput = $this->showDebugOutput(); $this->_dependencies->preLoadData(); XenForo_CodeEvent::fire('front_controller_pre_route', array($this)); $routeMatch = $this->route(); XenForo_CodeEvent::fire('front_controller_pre_dispatch', array($this, &$routeMatch)); $controllerResponse = $this->dispatch($routeMatch); if (!$controllerResponse) { XenForo_Error::noControllerResponse($routeMatch, $this->_request); exit; } $viewRenderer = $this->_getViewRenderer($routeMatch->getResponseType()); if (!$viewRenderer) { // note: should only happen if there's an error getting the default renderer, which should never happen :) XenForo_Error::noViewRenderer($this->_request); exit; } $containerParams = array('majorSection' => $routeMatch->getMajorSection(), 'minorSection' => $routeMatch->getMinorSection()); XenForo_CodeEvent::fire('front_controller_pre_view', array($this, &$controllerResponse, &$viewRenderer, &$containerParams)); $content = $this->renderView($controllerResponse, $viewRenderer, $containerParams); if ($showDebugOutput) { $content = $this->renderDebugOutput($content); } $bufferedContents = ob_get_contents(); ob_end_clean(); if ($bufferedContents !== '' && is_string($content)) { if (preg_match('#<body[^>]*>#sU', $content, $match)) { $content = str_replace($match[0], $match[0] . $bufferedContents, $content); } else { $content = $bufferedContents . $content; } } XenForo_CodeEvent::fire('front_controller_post_view', array($this, &$content)); if ($this->_sendResponse) { $headers = $this->_response->getHeaders(); $isText = false; foreach ($headers as $header) { if ($header['name'] == 'Content-Type') { if (strpos($header['value'], 'text/') === 0) { $isText = true; } break; } } if ($isText && is_string($content) && $content) { $extraHeaders = XenForo_Application::gzipContentIfSupported($content); foreach ($extraHeaders as $extraHeader) { $this->_response->setHeader($extraHeader[0], $extraHeader[1], $extraHeader[2]); } } if (is_string($content) && $content && !ob_get_level() && XenForo_Application::get('config')->enableContentLength) { if ($this->_response->getHttpResponseCode() >= 400 && strpos($this->_request->getServer('HTTP_USER_AGENT', ''), 'IEMobile') !== false) { // Windows mobile bug - 400+ errors cause the standard browser error // to be output if a content length is sent. ...Err, what? } else { $this->_response->setHeader('Content-Length', strlen($content), true); } } $this->_response->sendHeaders(); if ($content instanceof XenForo_FileOutput) { $content->output(); } else { echo $content; } } else { return $content; } }
/** * Runs the request, handling from routing straight through to response output. * Primary method to be used by the external API. * * @return string|null Returns a string if {@link $_sendResponse} is false */ public function run($innerContent = "", $newParams = array()) { ob_start(); $this->setup(); $this->setRequestPaths(); $showDebugOutput = $this->showDebugOutput(); $this->_dependencies->preLoadData(); XenForo_CodeEvent::fire('front_controller_pre_route', array($this)); $routeMatch = $this->route(); XenForo_CodeEvent::fire('front_controller_pre_dispatch', array($this, &$routeMatch)); $controllerResponse = $this->dispatch($routeMatch); if (!$controllerResponse) { XenForo_Error::noControllerResponse($routeMatch, $this->_request); exit; } $viewRenderer = $this->_getViewRenderer($routeMatch->getResponseType()); if (!$viewRenderer) { // note: should only happen if there's an error getting the default renderer, which should never happen :) XenForo_Error::noViewRenderer($this->_request); exit; } $containerParams = array('majorSection' => $routeMatch->getMajorSection(), 'minorSection' => $routeMatch->getMinorSection()); XenForo_CodeEvent::fire('front_controller_pre_view', array($this, &$controllerResponse, &$viewRenderer, &$containerParams)); $content = $this->renderView($controllerResponse, $viewRenderer, $containerParams, $innerContent, $newParams); if ($showDebugOutput) { $content = $this->renderDebugOutput($content); } $bufferedContents = ob_get_contents(); ob_end_clean(); if ($bufferedContents !== '') { $content = $bufferedContents . $content; } XenForo_CodeEvent::fire('front_controller_post_view', array($this, &$content)); if ($this->_sendResponse) { $headers = $this->_response->getHeaders(); $isText = false; foreach ($headers as $header) { if ($header['name'] == 'Content-Type') { if (strpos($header['value'], 'text/') === 0) { $isText = true; } break; } } if ($isText && is_string($content) && $content) { $extraHeaders = XenForo_Application::gzipContentIfSupported($content); foreach ($extraHeaders as $extraHeader) { $this->_response->setHeader($extraHeader[0], $extraHeader[1], $extraHeader[2]); } } if (is_string($content) && $content && !ob_get_level() && XenForo_Application::get('config')->enableContentLength) { $this->_response->setHeader('Content-Length', strlen($content), true); } $this->_response->sendHeaders(); if ($content instanceof XenForo_FileOutput) { $content->output(); } else { //$uncompressed = gzuncompress($content); //echo $uncompressed; echo $content; } } else { return $content; } }