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); }