Example #1
0
 public function __invoke(HttpRequest $request, HttpDriverContext $context) : \Generator
 {
     $path = \str_replace('+', '%20', $request->getRequestTarget());
     $routing = new RoutingContext($this->container, $this->compiler, $path, $request->getMethod(), $this->routable->getMiddlewares());
     $this->routeRequest($routing);
     if (!$routing->isMatch()) {
         return $routing->createNoMatchResponse();
     }
     $matches = [];
     if ($request->hasHeader('Content-Type')) {
         $type = $request->getContentType()->getMediaType();
         foreach ($routing->getMatches() as $match) {
             if ($match->handler->canConsume($type)) {
                 $matches[] = $match;
             }
         }
     } else {
         foreach ($routing->getMatches() as $match) {
             if ($match->handler->isConsumer()) {
                 continue;
             }
             $matches[] = $match;
         }
     }
     if (!$matches) {
         return $routing->createUnsupportedMediaTypeResponse();
     }
     $accept = $request->getAccept();
     $result = $matches[0];
     foreach ($accept->getMediaTypes() as $media) {
         foreach ($matches as $match) {
             foreach ($match->handler->getProducedMediaTypes() as $type) {
                 if ($media->is($type)) {
                     $result = $match;
                     break 3;
                 }
             }
         }
     }
     if (empty($result->middlewares)) {
         return yield from $this->dispatchRequest($request, $context, $result);
     }
     $next = new NextMiddleware($result->middlewares, function (HttpRequest $request) use($context, $result) {
         return yield from $this->dispatchRequest($request, $context, $result);
     }, $this->logger);
     return yield from $next($request);
 }