requestMiddleware = null; $this->viewMiddleware = null; $this->responseMiddleware = null; $this->exceptionMiddleware = null; } /** * Populate middleware lists from settings.MIDDLEWARE_CLASSES. * Must be called after the environment is fixed. */ protected function loadMiddleware() { $this->requestMiddleware = array(); $this->viewMiddleware = array(); $this->responseMiddleware = array(); $this->exceptionMiddleware = array(); $requestMiddleware = array(); foreach (settings::get('MIDDLEWARE_CLASSES') as $middlewareClass) { try { $instance = new $middlewareClass(); } catch (exceptions\MiddlewareNotUsed $e) { continue; } if (method_exists($instance, 'processRequest')) array_push($requestMiddleware, $instance); if (method_exists($instance, 'processView')) array_push($this->viewMiddleware, $instance); if (method_exists($instance, 'processResponse')) array_unshift($this->responseMiddleware, $instance); if (method_exists($instance, 'processException')) array_unshift($this->exceptionMiddleware, $instance); } // We only assign to this when initialization is complete as it is used // as a flag for initialization being complete. $this->requestMiddleware = $requestMiddleware; } public function getResponse($request) { $resolver = urlresolvers::get_resolver(); $response = null; try { // apply request middleware foreach ($this->requestMiddleware as $middleware) { $response = $middleware->processRequest($request); if (!is_null($response)) break; } if (is_null($response)) { list($callback, $args, $kwargs) = $resolver->resolve($request->getPathInfo()); // apply view middleware foreach ($this->viewMiddleware as $middleware) { $response = $middleware->processView($request, $callback, $args, $kwargs); if (!is_null($response)) break; } } if (is_null($response)) { // execute view try { if (!empty($kwargs)) { $params = array_merge($kwargs, array('request' => $request)); $response = functional::call_user_func_assoc($callback, $params); } else { $params = array_merge(array($request), $args); $response = call_user_func_array($callback, $params); } } catch (\Exception $e) { // If the view raised an exception, run it through exception // middleware, and if the exception middleware returns a // response, use that. Otherwise, reraise the exception. foreach ($this->exceptionMiddleware as $middleware) { $response = $middleware->processException($request, $e); if (!is_null($response)) break; } if (is_null($response)) throw $e; } } // Complain if the view returned None (a common error). if (is_null($response)) { throw new \Exception( "The view {$callback} didn't return an HttpResponse object."); } } catch (exceptions\PermissionDenied $e) { $response = $this->handlePermissionRequiredException($request, $resolver, $e); } catch (http\Http404 $e) { $response = $this->handleNotFoundException($request, $resolver, $e); } catch (\Exception $e) { $response = $this->handleUncaughtException($request, $resolver, $e); } try { // Apply response middleware, regardless of the response foreach ($this->responseMiddleware as $middleware) { $response = $middleware->processResponse($request, $response); if (is_null($response)) { throw new \Exception( 'Response middleware must return an HttpResponse object.'); } } $response = $this->apply_response_fixes($request, $response); } catch (\Exception $e) { // Any exception should be gathered and handled $response = $this->handleUncaughtException($request, $resolver, $e); } return $response; } public function handlePermissionRequiredException($request, $resolver, $e) { $response = new http\HttpResponseForbidden('