. // }}} namespace App\Core; use InvalidArgumentException; use Symfony\Component\HttpClient\Exception\ClientException as HTTPClientException; use Symfony\Component\HttpClient\Exception\TransportException; use Symfony\Contracts\HttpClient\HttpClientInterface; use Symfony\Contracts\HttpClient\ResponseInterface; /** * @codeCoverageIgnore * @mixin HttpClientInterface * * @method static ResponseInterface head(string $url, array $options = []) * @method static ResponseInterface get(string $url, array $options = []) * @method static ResponseInterface post(string $url, array $options = []) * @method static ResponseInterface put(string $url, array $options = []) * @method static ResponseInterface delete(string $url, array $options = []) * @method static ResponseInterface connect(string $url, array $options = []) * @method static ResponseInterface options(string $url, array $options = []) * @method static ResponseInterface trace(string $url, array $options = []) * @method static ResponseInterface patch(string $url, array $options = []) */ abstract class HTTPClient { private static ?HttpClientInterface $client; public static function setClient(HttpClientInterface $client) { self::$client = $client; } public static function statusCodeIsOkay(int|ResponseInterface $status): bool { if (!\is_int($status)) { $status = $status->getStatusCode(); } return $status >= 200 && $status < 300; } public static function getEffectiveUrl(ResponseInterface $head): string { try { // This must come before getInfo given that Symfony HTTPClient is lazy (thus forcing curl exec) $head->getHeaders(); // @codeCoverageIgnoreStart } catch (HTTPClientException|TransportException $e) { throw new InvalidArgumentException(previous: $e); // @codeCoverageIgnoreEnd } // The last effective url (after getHeaders, so it follows redirects) return $head->getInfo('url'); } public static function __callStatic(string $name, array $args) { if (\in_array(mb_strtoupper($name), ['GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'CONNECT', 'OPTIONS', 'TRACE', 'PATCH'])) { return self::$client->request(mb_strtoupper($name), ...$args); } return self::$client->{$name}(...$args); } }