From 3329a90819bd1d0662b2848d36bb8605fd4bc6fa Mon Sep 17 00:00:00 2001 From: yggverse Date: Fri, 5 Apr 2024 11:17:14 +0300 Subject: [PATCH] fix data types, add fragment support, draft absolute method --- README.md | 10 +++- src/Address.php | 153 +++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 145 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 5bce5aa..348946e 100644 --- a/README.md +++ b/README.md @@ -78,12 +78,18 @@ $address = new \Yggverse\Net\Address( ); var_dump( - $address->getScheme() // Just scheme substring + $address->getScheme() // Scheme substring +); + +... + +$subject = new \Yggverse\Net\Address( + './some/uri' ); var_dump( $address->absolute( - './some/uri' + $subject ) // return http://yo.ygg/some/uri ); ``` diff --git a/src/Address.php b/src/Address.php index 1e9b3ea..4c1977e 100644 --- a/src/Address.php +++ b/src/Address.php @@ -13,6 +13,7 @@ class Address private ?int $_port = null; private ?string $_path = null; private ?string $_query = null; + private ?string $_fragment = null; private array $_dirs = []; @@ -70,6 +71,13 @@ class Address (string) $query ); } + + if ($fragment = parse_url($address, PHP_URL_FRAGMENT)) + { + $this->setFragment( + (string) $fragment + ); + } } } @@ -83,62 +91,62 @@ class Address return !$this->isAbsolute(); } - public function getScheme(): string + public function getScheme(): ?string { return $this->_scheme; } - public function setScheme(string $value): void + public function setScheme(?string $value): void { $this->_scheme = $value; } - public function getHost(): string + public function getHost(): ?string { return $this->_host; } - public function setHost(string $value): void + public function setHost(?string $value): void { $this->_host = $value; } - public function getUser(): string + public function getUser(): ?string { return $this->_user; } - public function setUser(string $value): void + public function setUser(?string $value): void { $this->_user = $value; } - public function getPass(): string + public function getPass(): ?string { return $this->_pass; } - public function setPass(string $value): void + public function setPass(?string $value): void { $this->_pass = $value; } - public function getPort(): int + public function getPort(): ?int { return $this->_port; } - public function setPort(int $value): void + public function setPort(?int $value): void { $this->_port = $value; } - public function getPath(): string + public function getPath(): ?string { return $this->_path; } - public function setPath(string $value): void + public function setPath(?string $value): void { if (false !== strpos($value, '\\')) { @@ -158,23 +166,136 @@ class Address return $this->_dirs; } - public function getQuery(): string + public function getQuery(): ?string { return $this->_query; } - public function setQuery(string $value): void + public function setQuery(?string $value): void { $this->_query = $value; } + public function getFragment(): ?string + { + return $this->_fragment; + } + + public function setFragment(?string $value): void + { + $this->_fragment = $value; + } + public function getSeparator(): string { return $this->_separator; } - public function absolute(string $address): string + public function get(): string { - // @TODO + $address = ''; + + if ($scheme = $this->getScheme()) + { + $address .= sprintf( + '%s://', + $scheme + ); + } + + if ($user = $this->getUser()) + { + if ($pass = $this->getPass()) + { + $address .= sprintf( + '%s:%s@', + $user, + pass + ); + } + + else + { + $address .= sprintf( + '%s@', + $user + ); + } + } + + if ($host = $this->getHost()) + { + $address .= $host; + } + + if ($port = $this->getPort()) + { + $address .= sprintf( + ':%d', + $port + ); + } + + if ($path = $this->getPath()) + { + $address .= sprintf( + '%s%s', + $this->getSeparator(), + trim( + $path, + $this->getSeparator() + ) + ); + } + + if ($query = $this->getQuery()) + { + $address .= sprintf( + '?%s', + $query + ); + } + + if ($fragment = $this->getFragment()) + { + $address .= sprintf( + '#%s', + $fragment + ); + } + + return $address; + } + + public function absolute( + \Yggverse\Net\Address $address + ): string + { + if ($address->isAbsolute()) + { + return $address->get(); + } + + $address->setScheme( + $this->getScheme() + ); + + $address->setUser( + $this->getUser() + ); + + $address->setPass( + $this->getPass() + ); + + $address->setHost( + $this->getHost() + ); + + $address->setPort( + $this->getPort() + ); + + return ''; // @TODO } } \ No newline at end of file