class HttpClientKernel
An implementation of a Symfony HTTP kernel using a "real" HTTP client.
@author Fabien Potencier <fabien@symfony.com>
Hierarchy
- class \Symfony\Component\HttpKernel\HttpClientKernel implements \Symfony\Component\HttpKernel\HttpKernelInterface
Expanded class hierarchy of HttpClientKernel
File
-
vendor/
symfony/ http-kernel/ HttpClientKernel.php, line 32
Namespace
Symfony\Component\HttpKernelView source
final class HttpClientKernel implements HttpKernelInterface {
private HttpClientInterface $client;
public function __construct(?HttpClientInterface $client = null) {
if (null === $client && !class_exists(HttpClient::class)) {
throw new \LogicException(\sprintf('You cannot use "%s" as the HttpClient component is not installed. Try running "composer require symfony/http-client".', __CLASS__));
}
$this->client = $client ?? HttpClient::create();
}
public function handle(Request $request, int $type = HttpKernelInterface::MAIN_REQUEST, bool $catch = true) : Response {
$headers = $this->getHeaders($request);
$body = '';
if (null !== ($part = $this->getBody($request))) {
$headers = array_merge($headers, $part->getPreparedHeaders()
->toArray());
$body = $part->bodyToIterable();
}
$response = $this->client
->request($request->getMethod(), $request->getUri(), [
'headers' => $headers,
'body' => $body,
] + $request->attributes
->get('http_client_options', []));
$response = new Response($response->getContent(!$catch), $response->getStatusCode(), $response->getHeaders(!$catch));
$response->headers
->remove('X-Body-File');
$response->headers
->remove('X-Body-Eval');
$response->headers
->remove('X-Content-Digest');
$response->headers = new class ($response->headers
->all()) extends ResponseHeaderBag {
protected function computeCacheControlValue() : string {
return $this->getCacheControlHeader();
// preserve the original value
}
};
return $response;
}
private function getBody(Request $request) : ?AbstractPart {
if (\in_array($request->getMethod(), [
'GET',
'HEAD',
])) {
return null;
}
if (!class_exists(AbstractPart::class)) {
throw new \LogicException('You cannot pass non-empty bodies as the Mime component is not installed. Try running "composer require symfony/mime".');
}
if ($content = $request->getContent()) {
return new TextPart($content, 'utf-8', 'plain', '8bit');
}
$fields = $request->request
->all();
foreach ($request->files
->all() as $name => $file) {
$fields[$name] = DataPart::fromPath($file->getPathname(), $file->getClientOriginalName(), $file->getClientMimeType());
}
return new FormDataPart($fields);
}
private function getHeaders(Request $request) : array {
$headers = [];
foreach ($request->headers as $key => $value) {
$headers[$key] = $value;
}
$cookies = [];
foreach ($request->cookies
->all() as $name => $value) {
$cookies[] = $name . '=' . $value;
}
if ($cookies) {
$headers['cookie'] = implode('; ', $cookies);
}
return $headers;
}
}
Members
Title Sort descending | Modifiers | Object type | Summary | Overriden Title |
---|---|---|---|---|
HttpClientKernel::$client | private | property | ||
HttpClientKernel::getBody | private | function | ||
HttpClientKernel::getHeaders | private | function | ||
HttpClientKernel::handle | public | function | Handles a Request to convert it to a Response. | Overrides HttpKernelInterface::handle |
HttpClientKernel::__construct | public | function | ||
HttpKernelInterface::MAIN_REQUEST | public | constant | ||
HttpKernelInterface::SUB_REQUEST | public | constant |