/**
  * Handle
  *
  * @param Request $request Request
  * @param Response $response Response
  *
  * @return Response Response
  */
 public function handle(HttpMessages_CraftRequest $request, HttpMessages_CraftResponse $response)
 {
     $relay = new RelayBuilder();
     $globalMiddleware = \Craft\craft()->config->get('globalMiddleware', 'httpmessages');
     $routeMiddleware = $request->getRoute()->getMiddleware();
     $dispatcher = $relay->newInstance(array_merge($globalMiddleware, $routeMiddleware));
     return $dispatcher($request, $response);
 }
 /**
  * Get Submitted Token
  *
  * @param Request $request Request
  *
  * @return void|HttMessages_Exception
  */
 private function getSubmittedToken(Request $request)
 {
     $csrfTokenName = $this->config->get('csrfTokenName');
     if ($request->hasHeader($csrfTokenName)) {
         return $request->getHeader($csrfTokenName)[0];
     }
     if ($token = $request->getParam($csrfTokenName)) {
         return $token;
     }
     throw new HttpMessages_Exception("A valid csrf token was not submitted with your request.");
 }
 /**
  * __invoke Magic Method
  *
  * @param Request  $request  Request
  * @param Response $response Response
  * @param callable $next     Next
  *
  * @return Response Response
  */
 public function __invoke(Request $request, Response $response, callable $next)
 {
     $config = $request->getRoute()->getMiddlewareConfig('validation');
     $input = $request->getMethod() === 'GET' ? $request->getQueryParams() : $request->getParams();
     try {
         $validator = $this->getValidator($config);
         $validator->assert($input);
     } catch (NestedValidationException $validation_exception) {
         $exception = new HttpMessages_Exception('Validation error.');
         $exception->setErrors($validation_exception->getMessages());
         $exception->setInput($input);
         throw $exception;
     }
     $response = $next($request, $response);
     return $response;
 }
 /**
  * Get Cache Key
  *
  * @param Request $request Request
  *
  * @return string Cache Key
  */
 private function getCacheKey(Request $request, $cache_duration)
 {
     $keys = array_merge($request->getQueryParams(), $request->getAttributes());
     $cache_key = $request->getUri();
     $cache_key .= $request->getMethod();
     $cache_key .= $cache_duration;
     $cache_key .= serialize($keys);
     return md5($cache_key);
 }