Issues (108)

src/Uri.php (2 issues)

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
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
        $host = isset($parts['port']) ? sprintf('%s:%s', $parts['host'] ?? '', $parts['port'] ?? '') : $parts['host'] ?? ''; // @phpstan-ignore-line
39
        [$this->scheme, $this->host, $this->path] = [$parts['scheme'] ?? '', $host, $parts['path'] ?? ''];
40
        $parseQuery = $this->query;
41
        if (array_key_exists('query', $parts)) {
42
            parse_str($parts['query'], $parseQuery);
0 ignored issues
show
$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

42
            parse_str($parts['query'], /** @scrutinizer ignore-type */ $parseQuery);
Loading history...
43
            /** @var Query $parseQuery */ // phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.NoAssignment
44
            $this->query = $parseQuery;
45
        }
46
47
        if (count($query) === 0) {
48
            return;
49
        }
50
51
        $this->query = $query + $parseQuery;
52
    }
53
54
    /** @throws UriException */
55
    private function validate(string $uri): void
56
    {
57
        if (filter_var($uri, FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED)) {
58
            return;
59
        }
60
61
        throw new UriException($uri, 500);
62
    }
63
}
64