mirror of
https://github.com/YGGverse/net-php.git
synced 2026-03-31 17:15:35 +00:00
implement absolute address converter
This commit is contained in:
parent
3329a90819
commit
92eb9b3ba2
2 changed files with 179 additions and 45 deletions
87
README.md
87
README.md
|
|
@ -70,31 +70,96 @@ var_dump(
|
||||||
|
|
||||||
### Address
|
### Address
|
||||||
|
|
||||||
Includes useful methods to work with network addresses
|
Includes methods to work with network addresses.
|
||||||
|
|
||||||
|
#### Base address methods
|
||||||
|
|
||||||
|
Different operations with address parts:
|
||||||
|
|
||||||
|
* `scheme`
|
||||||
|
* `user`
|
||||||
|
* `password`
|
||||||
|
* `host`
|
||||||
|
* `protocol`
|
||||||
|
* `path`
|
||||||
|
* `query`
|
||||||
|
* `fragment`
|
||||||
|
|
||||||
|
#### Address conversion from relative to absolute format
|
||||||
|
|
||||||
|
**Document root**
|
||||||
|
|
||||||
```
|
```
|
||||||
|
$base = new \Yggverse\Net\Address(
|
||||||
|
'http://yo.ygg/a1/b1/c1'
|
||||||
|
);
|
||||||
|
|
||||||
$address = new \Yggverse\Net\Address(
|
$address = new \Yggverse\Net\Address(
|
||||||
'http://yo.ygg'
|
'/a2'
|
||||||
);
|
);
|
||||||
|
|
||||||
var_dump(
|
var_dump(
|
||||||
$address->getScheme() // Scheme substring
|
$address->getAbsolute(
|
||||||
|
$base
|
||||||
|
) // return http://yo.ygg/a2
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Current folder**
|
||||||
|
|
||||||
|
```
|
||||||
|
$base = new \Yggverse\Net\Address(
|
||||||
|
'http://yo.ygg/a1/b1/c1'
|
||||||
);
|
);
|
||||||
|
|
||||||
...
|
$address = new \Yggverse\Net\Address(
|
||||||
|
'c2'
|
||||||
$subject = new \Yggverse\Net\Address(
|
|
||||||
'./some/uri'
|
|
||||||
);
|
);
|
||||||
|
|
||||||
var_dump(
|
var_dump(
|
||||||
$address->absolute(
|
$address->getAbsolute(
|
||||||
$subject
|
$base
|
||||||
) // return http://yo.ygg/some/uri
|
) // return http://yo.ygg/a1/b1/c2
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Ending slash**
|
||||||
|
|
||||||
|
```
|
||||||
|
$base = new \Yggverse\Net\Address(
|
||||||
|
'http://yo.ygg/a1/b1/c1/'
|
||||||
|
);
|
||||||
|
|
||||||
|
$address = new \Yggverse\Net\Address(
|
||||||
|
'../../b2/c2'
|
||||||
|
);
|
||||||
|
|
||||||
|
var_dump(
|
||||||
|
$address->getAbsolute(
|
||||||
|
$base
|
||||||
|
) // return http://yo.ygg/a1/b2/c2
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
**All options**
|
||||||
|
|
||||||
|
```
|
||||||
|
$base = new \Yggverse\Net\Address(
|
||||||
|
'http://user:password@yo.ygg/a1/b1/c1?attribute=value#anchor'
|
||||||
|
);
|
||||||
|
|
||||||
|
$address = new \Yggverse\Net\Address(
|
||||||
|
'../../a2/b2?attribute2=value2#anchor2'
|
||||||
|
);
|
||||||
|
|
||||||
|
var_dump(
|
||||||
|
$address->getAbsolute(
|
||||||
|
$base
|
||||||
|
) // return http://user:password@yo.ygg/a2/b2?attribute2=value2#anchor2
|
||||||
);
|
);
|
||||||
```
|
```
|
||||||
|
|
||||||
## Integrations
|
## Integrations
|
||||||
|
|
||||||
* [Network API with native Yggdrasil/IPv6 support](https://github.com/YGGverse/web-api)
|
* [Network API with native Yggdrasil/IPv6 support](https://github.com/YGGverse/web-api)
|
||||||
* [Yo! Search Crawler for different networks](https://github.com/YGGverse/Yo)
|
* [Yo! Crawler for different networks](https://github.com/YGGverse/Yo)
|
||||||
|
|
|
||||||
137
src/Address.php
137
src/Address.php
|
|
@ -15,10 +15,10 @@ class Address
|
||||||
private ?string $_query = null;
|
private ?string $_query = null;
|
||||||
private ?string $_fragment = null;
|
private ?string $_fragment = null;
|
||||||
|
|
||||||
private array $_dirs = [];
|
|
||||||
|
|
||||||
private string $_separator = '/';
|
private string $_separator = '/';
|
||||||
|
|
||||||
|
private array $_segments = [];
|
||||||
|
|
||||||
public function __construct(?string $address = null)
|
public function __construct(?string $address = null)
|
||||||
{
|
{
|
||||||
if ($address)
|
if ($address)
|
||||||
|
|
@ -39,7 +39,7 @@ class Address
|
||||||
|
|
||||||
if ($pass = parse_url($address, PHP_URL_PASS))
|
if ($pass = parse_url($address, PHP_URL_PASS))
|
||||||
{
|
{
|
||||||
$this->setPath(
|
$this->setPass(
|
||||||
(string) $pass
|
(string) $pass
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -150,10 +150,12 @@ class Address
|
||||||
{
|
{
|
||||||
if (false !== strpos($value, '\\'))
|
if (false !== strpos($value, '\\'))
|
||||||
{
|
{
|
||||||
$this->_separator = '\\';
|
$this->setSeparator(
|
||||||
|
'\\'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->_dirs = explode(
|
$this->_segments = explode(
|
||||||
$this->_separator,
|
$this->_separator,
|
||||||
$value
|
$value
|
||||||
);
|
);
|
||||||
|
|
@ -161,9 +163,9 @@ class Address
|
||||||
$this->_path = $value;
|
$this->_path = $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getDirs(): array
|
public function getSegments(): array
|
||||||
{
|
{
|
||||||
return $this->_dirs;
|
return $this->_segments;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getQuery(): ?string
|
public function getQuery(): ?string
|
||||||
|
|
@ -191,6 +193,11 @@ class Address
|
||||||
return $this->_separator;
|
return $this->_separator;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function setSeparator(?string $value): void
|
||||||
|
{
|
||||||
|
$this->_separator = $value;
|
||||||
|
}
|
||||||
|
|
||||||
public function get(): string
|
public function get(): string
|
||||||
{
|
{
|
||||||
$address = '';
|
$address = '';
|
||||||
|
|
@ -198,8 +205,10 @@ class Address
|
||||||
if ($scheme = $this->getScheme())
|
if ($scheme = $this->getScheme())
|
||||||
{
|
{
|
||||||
$address .= sprintf(
|
$address .= sprintf(
|
||||||
'%s://',
|
'%s:%s%s',
|
||||||
$scheme
|
$scheme,
|
||||||
|
$this->getSeparator(),
|
||||||
|
$this->getSeparator()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -210,7 +219,7 @@ class Address
|
||||||
$address .= sprintf(
|
$address .= sprintf(
|
||||||
'%s:%s@',
|
'%s:%s@',
|
||||||
$user,
|
$user,
|
||||||
pass
|
$pass
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -238,14 +247,7 @@ class Address
|
||||||
|
|
||||||
if ($path = $this->getPath())
|
if ($path = $this->getPath())
|
||||||
{
|
{
|
||||||
$address .= sprintf(
|
$address .= $path;
|
||||||
'%s%s',
|
|
||||||
$this->getSeparator(),
|
|
||||||
trim(
|
|
||||||
$path,
|
|
||||||
$this->getSeparator()
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($query = $this->getQuery())
|
if ($query = $this->getQuery())
|
||||||
|
|
@ -267,35 +269,102 @@ class Address
|
||||||
return $address;
|
return $address;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function absolute(
|
public function getAbsolute(
|
||||||
\Yggverse\Net\Address $address
|
\Yggverse\Net\Address $base
|
||||||
): string
|
): ?string
|
||||||
{
|
{
|
||||||
if ($address->isAbsolute())
|
if ($this->isAbsolute())
|
||||||
{
|
{
|
||||||
return $address->get();
|
return $this->get();
|
||||||
}
|
}
|
||||||
|
|
||||||
$address->setScheme(
|
if ($base->isRelative())
|
||||||
$this->getScheme()
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->setScheme(
|
||||||
|
$base->getScheme()
|
||||||
);
|
);
|
||||||
|
|
||||||
$address->setUser(
|
$this->setUser(
|
||||||
$this->getUser()
|
$base->getUser()
|
||||||
);
|
);
|
||||||
|
|
||||||
$address->setPass(
|
$this->setPass(
|
||||||
$this->getPass()
|
$base->getPass()
|
||||||
);
|
);
|
||||||
|
|
||||||
$address->setHost(
|
$this->setHost(
|
||||||
$this->getHost()
|
$base->getHost()
|
||||||
);
|
);
|
||||||
|
|
||||||
$address->setPort(
|
$this->setPort(
|
||||||
$this->getPort()
|
$base->getPort()
|
||||||
);
|
);
|
||||||
|
|
||||||
return ''; // @TODO
|
$this->setSeparator(
|
||||||
|
$base->getSeparator()
|
||||||
|
);
|
||||||
|
|
||||||
|
if (str_starts_with((string) $this->getPath(), $this->getSeparator()))
|
||||||
|
{
|
||||||
|
return $this->get();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($path = $this->getPath())
|
||||||
|
{
|
||||||
|
$prefix = array_reverse(
|
||||||
|
$base->getSegments()
|
||||||
|
);
|
||||||
|
|
||||||
|
array_shift(
|
||||||
|
$prefix
|
||||||
|
);
|
||||||
|
|
||||||
|
$navigate = true;
|
||||||
|
|
||||||
|
$postfix = [];
|
||||||
|
|
||||||
|
foreach ($this->getSegments() as $index => $segment)
|
||||||
|
{
|
||||||
|
if ($segment == '.')
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($navigate && $segment == '..')
|
||||||
|
{
|
||||||
|
if (empty($prefix[$index]))
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
unset(
|
||||||
|
$prefix[$index]
|
||||||
|
);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$navigate = false;
|
||||||
|
|
||||||
|
$postfix[] = $segment;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->setPath(
|
||||||
|
implode(
|
||||||
|
$this->getSeparator(),
|
||||||
|
array_merge(
|
||||||
|
array_reverse(
|
||||||
|
$prefix
|
||||||
|
),
|
||||||
|
$postfix
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->get();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue