/** * Get the file component from the request * * @param HTTPRequest $request * @return string */ protected function parseFilename(HTTPRequest $request) { $filename = ''; $next = $request->param('Filename'); while ($next) { $filename = $filename ? File::join_paths($filename, $next) : $next; $next = $request->shift(); } if ($extension = $request->getExtension()) { $filename = $filename . "." . $extension; } return $filename; }
/** * Handle an HTTP request, defined with a HTTPRequest object. * * @skipUpgrade * @param HTTPRequest $request * @param Session $session * @param DataModel $model * @return HTTPResponse|string */ protected static function handleRequest(HTTPRequest $request, Session $session, DataModel $model) { $rules = Director::config()->get('rules'); if (isset($_REQUEST['debug'])) { Debug::show($rules); } foreach ($rules as $pattern => $controllerOptions) { if (is_string($controllerOptions)) { if (substr($controllerOptions, 0, 2) == '->') { $controllerOptions = array('Redirect' => substr($controllerOptions, 2)); } else { $controllerOptions = array('Controller' => $controllerOptions); } } if (($arguments = $request->match($pattern, true)) !== false) { $request->setRouteParams($controllerOptions); // controllerOptions provide some default arguments $arguments = array_merge($controllerOptions, $arguments); // Pop additional tokens from the tokenizer if necessary if (isset($controllerOptions['_PopTokeniser'])) { $request->shift($controllerOptions['_PopTokeniser']); } // Handle redirection if (isset($arguments['Redirect'])) { return "redirect:" . Director::absoluteURL($arguments['Redirect'], true); } else { // Find the controller name $controller = $arguments['Controller']; Director::$urlParams = $arguments; $controllerObj = Injector::inst()->create($controller); $controllerObj->setSession($session); try { $result = $controllerObj->handleRequest($request, $model); } catch (HTTPResponse_Exception $responseException) { $result = $responseException->getResponse(); } if (!is_object($result) || $result instanceof HTTPResponse) { return $result; } user_error("Bad result from url " . $request->getURL() . " handled by " . get_class($controllerObj) . " controller: " . get_class($result), E_USER_WARNING); } } } // No URL rules matched, so return a 404 error. return new HTTPResponse('No URL rule was matched', 404); }
public function testSubActions() { /* If a controller action returns another controller, ensure that the $action variable is correctly forwarded */ $response = $this->get("ControllerTest_ContainerController/subcontroller/subaction"); $this->assertEquals('subaction', $response->getBody()); $request = new HTTPRequest('GET', 'ControllerTest_ContainerController/subcontroller/substring/subvieweraction'); /* Shift to emulate the director selecting the controller */ $request->shift(); /* Handle the request to create conditions where improperly passing the action to the viewer might fail */ $controller = new ControllerTest_ContainerController(); try { $controller->handleRequest($request, DataModel::inst()); } catch (ControllerTest_SubController_Exception $e) { $this->fail($e->getMessage()); } }