4
4
5
5
namespace Codeception \Util ;
6
6
7
- use GuzzleHttp \Psr7 \Uri as Psr7Uri ;
8
7
use InvalidArgumentException ;
9
8
10
9
use function dirname ;
@@ -28,13 +27,13 @@ class Uri
28
27
*/
29
28
public static function mergeUrls (string $ baseUri , string $ uri ): string
30
29
{
31
- $ base = new Psr7Uri ($ baseUri );
30
+ $ base = self :: parseUrl ($ baseUri );
32
31
$ parts = parse_url ($ uri );
33
32
34
33
//If the relative URL does not parse, attempt to parse the entire URL.
35
34
//PHP Known bug ( https://bugs.php.net/bug.php?id=70942 )
36
35
if ($ parts === false ) {
37
- $ parts = parse_url ($ base . $ uri );
36
+ $ parts = parse_url ($ baseUri . $ uri );
38
37
}
39
38
40
39
if ($ parts === false ) {
@@ -47,14 +46,14 @@ public static function mergeUrls(string $baseUri, string $uri): string
47
46
}
48
47
49
48
if (isset ($ parts ['host ' ])) {
50
- $ base = $ base -> withHost ( $ parts ['host ' ]) ;
51
- $ base = $ base -> withPath ( '' ) ;
52
- $ base = $ base -> withQuery ( '' ) ;
53
- $ base = $ base -> withFragment ( '' ) ;
49
+ $ base[ ' host ' ] = $ parts ['host ' ];
50
+ $ base[ ' path ' ] = '' ;
51
+ $ base[ ' query ' ] = '' ;
52
+ $ base[ ' fragment ' ] = '' ;
54
53
}
55
54
if (isset ($ parts ['path ' ])) {
56
55
$ path = $ parts ['path ' ];
57
- $ basePath = $ base-> getPath () ;
56
+ $ basePath = $ base[ ' path ' ] ?? '' ;
58
57
if ((!str_starts_with ($ path , '/ ' )) && !empty ($ path )) {
59
58
if ($ basePath !== '' ) {
60
59
// if it ends with a slash, relative paths are below it
@@ -69,36 +68,38 @@ public static function mergeUrls(string $baseUri, string $uri): string
69
68
$ path = '/ ' . ltrim ($ path , '/ ' );
70
69
}
71
70
}
72
- $ base = $ base -> withPath ( $ path) ;
73
- $ base = $ base -> withQuery ( '' ) ;
74
- $ base = $ base -> withFragment ( '' ) ;
71
+ $ base[ ' path ' ] = $ path ;
72
+ $ base[ ' query ' ] = '' ;
73
+ $ base[ ' fragment ' ] = '' ;
75
74
}
76
75
if (isset ($ parts ['query ' ])) {
77
- $ base = $ base -> withQuery ( $ parts ['query ' ]) ;
78
- $ base = $ base -> withFragment ( '' ) ;
76
+ $ base[ ' query ' ] = $ parts ['query ' ];
77
+ $ base[ ' fragment ' ] = '' ;
79
78
}
80
79
if (isset ($ parts ['fragment ' ])) {
81
- $ base = $ base -> withFragment ( $ parts ['fragment ' ]) ;
80
+ $ base[ ' fragment ' ] = $ parts ['fragment ' ];
82
81
}
83
82
84
- return ( string ) $ base ;
83
+ return self :: phpUrlPartsToString ( $ base) ;
85
84
}
86
85
87
86
/**
88
87
* Retrieve /path?query#fragment part of URL
89
88
*/
90
89
public static function retrieveUri (string $ url ): string
91
90
{
92
- $ uri = new Psr7Uri ($ url );
93
- return (string )(new Psr7Uri ())
94
- ->withPath ($ uri ->getPath ())
95
- ->withQuery ($ uri ->getQuery ())
96
- ->withFragment ($ uri ->getFragment ());
91
+ $ urlParts = self ::parseUrl ($ url );
92
+
93
+ return self ::phpUrlPartsToString ([
94
+ 'path ' => $ urlParts ['path ' ],
95
+ 'query ' => $ urlParts ['query ' ] ?? '' ,
96
+ 'fragment ' => $ urlParts ['fragment ' ] ?? '' ,
97
+ ]);
97
98
}
98
99
99
100
public static function retrieveHost (string $ url ): string
100
101
{
101
- $ urlParts = parse_url ($ url );
102
+ $ urlParts = self :: parseUrl ($ url );
102
103
if (!isset ($ urlParts ['host ' ]) || !isset ($ urlParts ['scheme ' ])) {
103
104
throw new InvalidArgumentException ("Wrong URL passes, host and scheme not set " );
104
105
}
@@ -111,13 +112,88 @@ public static function retrieveHost(string $url): string
111
112
112
113
public static function appendPath (string $ url , string $ path ): string
113
114
{
114
- $ uri = new Psr7Uri ($ url );
115
- $ cutUrl = (string )$ uri ->withQuery ('' )->withFragment ('' );
115
+ $ cutUrl = parse_url ($ url );
116
+ unset(
117
+ $ cutUrl ['query ' ],
118
+ $ cutUrl ['fragment ' ],
119
+ );
120
+ $ cutUrl = self ::phpUrlPartsToString ($ cutUrl );
116
121
117
122
if ($ path === '' || $ path [0 ] === '# ' ) {
118
123
return $ cutUrl . $ path ;
119
124
}
120
125
121
126
return rtrim ($ cutUrl , '/ ' ) . '/ ' . ltrim ($ path , '/ ' );
122
127
}
128
+
129
+ /**
130
+ * @return array{
131
+ * scheme?: string,
132
+ * host?: string,
133
+ * port?: int,
134
+ * user?: string,
135
+ * pass?: string,
136
+ * query?: string,
137
+ * path?: string,
138
+ * fragment?: string,
139
+ * }
140
+ */
141
+ public static function parseUrl (string $ uri ): array
142
+ {
143
+ $ parts = parse_url ($ uri );
144
+
145
+ if ($ parts === false ) {
146
+ throw new InvalidArgumentException ("Invalid URI {$ uri }" );
147
+ }
148
+
149
+ return $ parts ;
150
+ }
151
+
152
+ /**
153
+ * @param array{
154
+ * scheme?: string,
155
+ * host?: string,
156
+ * port?: int,
157
+ * user?: string,
158
+ * pass?: string,
159
+ * query?: string,
160
+ * path?: string,
161
+ * fragment?: string,
162
+ * } $urlParts
163
+ */
164
+ public static function phpUrlPartsToString (array $ urlParts ): string
165
+ {
166
+ $ uri = '' ;
167
+ $ scheme = $ urlParts ['scheme ' ] ?? '' ;
168
+ $ host = $ urlParts ['host ' ] ?? '' ;
169
+ $ path = $ urlParts ['path ' ] ?? '' ;
170
+
171
+ if ($ scheme !== '' ) {
172
+ $ uri .= $ scheme . ': ' ;
173
+ }
174
+
175
+ if ($ host !== '' || $ scheme === 'file ' ) {
176
+ $ uri .= '// ' . $ host ;
177
+
178
+ if (($ urlParts ['port ' ] ?? '' ) !== '' ) {
179
+ $ uri .= ': ' . $ urlParts ['port ' ];
180
+ }
181
+ }
182
+
183
+ if ($ host !== '' && $ path !== '' && $ path [0 ] !== '/ ' ) {
184
+ $ path = '/ ' . $ path ;
185
+ }
186
+
187
+ $ uri .= $ path ;
188
+
189
+ if (($ urlParts ['query ' ] ?? '' ) !== '' ) {
190
+ $ uri .= '? ' . $ urlParts ['query ' ];
191
+ }
192
+
193
+ if (($ urlParts ['fragment ' ] ?? '' ) !== '' ) {
194
+ $ uri .= '# ' . $ urlParts ['fragment ' ];
195
+ }
196
+
197
+ return $ uri ;
198
+ }
123
199
}
0 commit comments