Uri::__construct()   A
last analyzed

Complexity

Conditions 5
Paths 16

Size

Total Lines 28
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 5
eloc 13
c 1
b 0
f 0
nc 16
nop 2
dl 0
loc 28
rs 9.5222
1
<?php
2
3
declare(strict_types=1);
4
5
namespace BEAR\Resource;
6
7
use BEAR\Resource\Exception\UriException;
8
9
use function array_key_exists;
10
use function count;
11
use function filter_var;
12
use function parse_str;
13
use function parse_url;
14
use function sprintf;
15
use function uri_template;
16
17
use const FILTER_FLAG_PATH_REQUIRED;
18
use const FILTER_VALIDATE_URL;
19
20
/** @psalm-import-type Query from Types */
21
final class Uri extends AbstractUri
22
{
23
    /**
24
     * @param Query $query
0 ignored issues
show
Bug introduced by
The type BEAR\Resource\Query was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
25
     *
26
     * @throws UriException
27
     */
28
    public function __construct(
29
        string $uri,
30
        array $query = [],
31
    ) {
32
        $this->validate($uri);
33
        if (count($query) !== 0) {
34
            $uri = uri_template($uri, $query);
35
        }
36
37
        $parts = (array) parse_url($uri);
38
        // parse_url() returns array<string>|false but we cast to array
39
        $host = isset($parts['port']) ? sprintf('%s:%s', $parts['host'] ?? '', $parts['port'] ?? '') : $parts['host'] ?? ''; // @phpstan-ignore-line
40
        [$this->scheme, $this->host, $this->path] = [$parts['scheme'] ?? '', $host, $parts['path'] ?? ''];
41
        $parseQuery = $this->query;
42
        if (array_key_exists('query', $parts)) {
43
            parse_str($parts['query'], $parseQuery);
0 ignored issues
show
Bug introduced by
$parseQuery of type BEAR\Resource\Query is incompatible with the type array expected by parameter $result of parse_str(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

43
            parse_str($parts['query'], /** @scrutinizer ignore-type */ $parseQuery);
Loading history...
44
            // parse_str() outputs array<int|string, array|string> but Query is array<string, mixed>
45
            /** @psalm-suppress MixedPropertyTypeCoercion */
46
            $this->query = $parseQuery; // @phpstan-ignore-line
47
        }
48
49
        if (count($query) === 0) {
50
            return;
51
        }
52
53
        // Array union may contain int keys from parse_str output
54
        /** @psalm-suppress MixedPropertyTypeCoercion */
55
        $this->query = $query + $parseQuery; // @phpstan-ignore-line
56
    }
57
58
    /** @throws UriException */
59
    private function validate(string $uri): void
60
    {
61
        if (filter_var($uri, FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED)) {
62
            return;
63
        }
64
65
        throw new UriException($uri, 500);
66
    }
67
}
68