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