| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- <?php
- /**
- * League.Uri (https://uri.thephpleague.com)
- *
- * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- declare(strict_types=1);
- namespace League\Uri;
- use ValueError;
- /*
- * Supported schemes and corresponding default port.
- *
- * @see https://github.com/python-hyper/hyperlink/blob/master/src/hyperlink/_url.py for the curating list definition
- * @see https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml
- * @see https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml
- */
- enum UriScheme: string
- {
- case About = 'about';
- case Acap = 'acap';
- case Bitcoin = 'bitcoin';
- case Geo = 'geo';
- case Blob = 'blob';
- case Afp = 'afp';
- case Data = 'data';
- case Dict = 'dict';
- case Dns = 'dns';
- case File = 'file';
- case Ftp = 'ftp';
- case Git = 'git';
- case Gopher = 'gopher';
- case Http = 'http';
- case Https = 'https';
- case Imap = 'imap';
- case Imaps = 'imaps';
- case Ipp = 'ipp';
- case Ipps = 'ipps';
- case Irc = 'irc';
- case Ircs = 'ircs';
- case Javascript = 'javascript';
- case Ldap = 'ldap';
- case Ldaps = 'ldaps';
- case Magnet = 'magnet';
- case Mailto = 'mailto';
- case Mms = 'mms';
- case Msrp = 'msrp';
- case Msrps = 'msrps';
- case Mtqp = 'mtqp';
- case News = 'news';
- case Nfs = 'nfs';
- case Nntp = 'nntp';
- case Nntps = 'nntps';
- case Pkcs11 = 'pkcs11';
- case Pop = 'pop';
- case Prospero = 'prospero';
- case Redis = 'redis';
- case Rsync = 'rsync';
- case Rtsp = 'rtsp';
- case Rtsps = 'rtsps';
- case Rtspu = 'rtspu';
- case Sftp = 'sftp';
- case Wss = 'wss';
- case Ws = 'ws';
- case Sip = 'sip';
- case Sips = 'sips';
- case Smb = 'smb';
- case Smtp = 'smtp';
- case Snmp = 'snmp';
- case Ssh = 'ssh';
- case Steam = 'steam';
- case Svn = 'svn';
- case Tel = 'tel';
- case Telnet = 'telnet';
- case Tn3270 = 'tn3270';
- case Urn = 'urn';
- case Ventrilo = 'ventrilo';
- case Vnc = 'vnc';
- case Wais = 'wais';
- case Xmpp = 'xmpp';
- public function port(): ?int
- {
- return match ($this) {
- self::Acap => 674,
- self::Afp => 548,
- self::Dict => 2628,
- self::Dns => 53,
- self::Ftp => 21,
- self::Http, self::Ws => 80,
- self::Https, self::Wss => 443,
- self::Git => 9418,
- self::Gopher => 70,
- self::Imap => 143,
- self::Imaps => 993,
- self::Ipp, self::Ipps => 631,
- self::Irc => 194,
- self::Ircs => 6697,
- self::Ldap => 389,
- self::Ldaps => 636,
- self::Mms => 1755,
- self::Msrp, self::Msrps => 2855,
- self::Mtqp => 1038,
- self::Nfs => 111,
- self::Nntp => 119,
- self::Nntps => 563,
- self::Pop => 110,
- self::Prospero => 1525,
- self::Redis => 6379,
- self::Rsync => 873,
- self::Rtsp => 554,
- self::Rtsps => 322,
- self::Rtspu => 5005,
- self::Sftp, self::Ssh => 22,
- self::Smb => 445,
- self::Smtp => 25,
- self::Snmp => 161,
- self::Svn => 3690,
- self::Telnet, self::Tn3270 => 23,
- self::Ventrilo => 3784,
- self::Vnc => 5900,
- self::Wais => 210,
- self::Xmpp => 80,
- default => null,
- };
- }
- public function type(): SchemeType
- {
- return match ($this) {
- self::Urn,
- self::About,
- self::Bitcoin,
- self::Blob,
- self::Data,
- self::Geo,
- self::Javascript,
- self::Magnet,
- self::Mailto,
- self::Pkcs11,
- self::Sip,
- self::Sips,
- self::Tel => SchemeType::Opaque,
- self::File => SchemeType::Hierarchical,
- self::News => SchemeType::Unknown,
- default => match (true) {
- null !== $this->port() => SchemeType::Hierarchical,
- default => SchemeType::Unknown,
- },
- };
- }
- public function isWhatWgSpecial(): bool
- {
- return match ($this) {
- self::Ftp,
- self::Http,
- self::Https,
- self::Ws,
- self::Wss => true,
- default => false,
- };
- }
- /**
- * @return list<self>
- */
- public static function fromPort(?int $port): array
- {
- null === $port || 0 <= $port || throw new ValueError('The submitted port cannot be negative.');
- static $reverse = [];
- if ([] === $reverse) {
- foreach (self::cases() as $case) {
- $defaultPort = $case->port();
- if (null === $defaultPort) {
- continue;
- }
- $reverse[$defaultPort] ??= [];
- $reverse[$defaultPort][] = $case;
- }
- }
- return $reverse[$port] ?? [];
- }
- public function builder(): Builder
- {
- return new Builder(scheme: $this);
- }
- }
|