Completed
Push — master ( 6acfe1...0042b2 )
by Radu
11:51 queued 10s
created

Request   A

Complexity

Total Complexity 16

Size/Duplication

Total Lines 128
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 16
eloc 50
c 0
b 0
f 0
dl 0
loc 128
rs 10

7 Methods

Rating   Name   Duplication   Size   Complexity  
A parse() 0 17 3
A format() 0 12 3
A split() 0 5 1
A explode() 0 10 3
A sanitizeString() 0 35 1
A transform() 0 4 1
A removeSuffix() 0 13 4
1
<?php
2
3
declare(strict_types=1);
4
5
namespace WebServCo\Framework\Utils;
6
7
final class Request
8
{
9
10
    /**
11
    * @return array<int,string>
12
    */
13
    public static function explode(string $string): array
14
    {
15
        if (false !== \strpos($string, '?')) {
16
            return \explode('?', $string, 2);
17
        }
18
19
        if (false !== \strpos($string, '&')) {
20
            return \explode('&', $string, 2);
21
        }
22
        return [$string, ''];
23
    }
24
25
    /**
26
    * @return array<string, string|null>
27
    */
28
    public static function format(string $string): array
29
    {
30
        $data = [];
31
        $parts = self::split($string);
32
        $num = \count($parts);
33
        for ($position = 0; $position < $num; $position += 2) {
34
            $data[$parts[$position]] = $position === $num - 1
35
                ? null
36
                :
37
            $parts[$position + 1];
38
        }
39
        return $data;
40
    }
41
42
    /**
43
    * @param array<int,string> $suffixes
44
    * @return array<int,string>
45
    */
46
    public static function parse(string $string, string $path, string $filename, array $suffixes): array
47
    {
48
        $pathLen = \strlen($path);
49
        if (0 === \strncasecmp($path, $string, $pathLen)) {
50
            $string = \substr($string, $pathLen);
51
        }
52
        $filenameLen = \strlen($filename);
53
        if (0 === \strncasecmp($filename, $string, $filenameLen)) {
54
            $string = \substr($string, $filenameLen);
55
        }
56
        [$target, $query] = self::explode($string);
57
        [$target, $suffix] = self::removeSuffix(
58
            self::transform($target),
59
            $suffixes,
60
        );
61
        $query = self::transform($query);
62
        return [$target, $query, $suffix];
63
    }
64
65
    /**
66
    * @param array<int,string> $suffixes
67
    * @return array<int,string>
68
    */
69
    public static function removeSuffix(string $string, array $suffixes = []): array
70
    {
71
        if (\is_array($suffixes)) {
0 ignored issues
show
introduced by
The condition is_array($suffixes) is always true.
Loading history...
72
            $stringRev = \strrev($string);
73
            foreach ($suffixes as $suffix) {
74
                $suffixRev = \strrev($suffix);
75
                $suffixLen = \strlen($suffix);
76
                if (0 === \strncasecmp($suffixRev, $stringRev, $suffixLen)) {
77
                    return [\strrev(\substr($stringRev, $suffixLen)), $suffix];
78
                }
79
            }
80
        }
81
        return [$string, ''];
82
    }
83
84
    public static function sanitizeString(string $string): string
85
    {
86
        // Strip tags, optionally strip or encode special characters.
87
        $string = \filter_var($string, \FILTER_SANITIZE_STRING);
88
        $unwanted = [
89
            "`",
90
            //"'",
91
            //'"',
92
            "\b",
93
            "\n",
94
            "\r",
95
            "\t",
96
            //"?",
97
            //"!",
98
            //"~",
99
            //"#",
100
            //"^",
101
            //"&",
102
            //"*",
103
            //"=",
104
            //"[",
105
            //"]",
106
            //":",
107
            //";",
108
            //",",
109
            //"|",
110
            "\\",
111
            //"{",
112
            //"}",
113
            //"(",
114
            //")",
115
            "\$",
116
        ];
117
        $string = \str_replace($unwanted, '', (string) $string);
118
        return $string;
119
    }
120
121
    /**
122
    * @return array<int,string>
123
    */
124
    public static function split(string $string): array
125
    {
126
        $parts = \explode('/', $string);
127
        $parts = \array_map('urldecode', $parts);
128
        return \array_diff($parts, ['']);
129
    }
130
131
    public static function transform(string $string): string
132
    {
133
        $string = \str_replace(['?', '&', '=', '//'], ['', '/', '/', '/0/'], $string);
134
        return \trim($string, ' /');
135
    }
136
}
137