Вход Регистрация
Файл: vendor/symfony/http-kernel/HttpClientKernel.php
Строк: 184
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace SymfonyComponentHttpKernel;

use 
SymfonyComponentHttpClientHttpClient;
use 
SymfonyComponentHttpFoundationRequest;
use 
SymfonyComponentHttpFoundationResponse;
use 
SymfonyComponentHttpFoundationResponseHeaderBag;
use 
SymfonyComponentMimePartAbstractPart;
use 
SymfonyComponentMimePartDataPart;
use 
SymfonyComponentMimePartMultipartFormDataPart;
use 
SymfonyComponentMimePartTextPart;
use 
SymfonyContractsHttpClientHttpClientInterface;

// Help opcache.preload discover always-needed symbols
class_exists(ResponseHeaderBag::class);

/**
 * An implementation of a Symfony HTTP kernel using a "real" HTTP client.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
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 $requestint $type HttpKernelInterface::MAIN_REQUESTbool $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;
    }
}
Онлайн: 2
Реклама