35 lines
921 B
PHP
35 lines
921 B
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Services;
|
|
|
|
use Illuminate\Support\Uri;
|
|
use InvalidArgumentException;
|
|
|
|
class UrlService
|
|
{
|
|
public function host(string $url): string
|
|
{
|
|
$uri = Uri::of($url);
|
|
|
|
$scheme = $uri->scheme();
|
|
if ($scheme === null || $scheme === '') {
|
|
throw new InvalidArgumentException("URL has no scheme: {$url}");
|
|
}
|
|
if (! in_array($scheme, ['http', 'https'], true)) {
|
|
throw new InvalidArgumentException("Invalid URL scheme: {$scheme}");
|
|
}
|
|
|
|
$host = $uri->host();
|
|
if ($host === null || $host === '') {
|
|
throw new InvalidArgumentException("URL has no host: {$url}");
|
|
}
|
|
|
|
if (filter_var(trim($host, '[]'), FILTER_VALIDATE_IP) !== false) {
|
|
throw new InvalidArgumentException("IP literal hosts not allowed: {$host}");
|
|
}
|
|
|
|
return strtolower($host);
|
|
}
|
|
}
|