@@ -296,20 +296,22 @@ public static function parseNormalized(Stringable|string $uri): array
296
296
static $ isSupported = null ;
297
297
$ isSupported ??= (function_exists ('\idn_to_ascii ' ) && defined ('\INTL_IDNA_VARIANT_UTS46 ' ));
298
298
299
- if (null !== $ components ['host ' ] &&
300
- false === filter_var ($ components ['host ' ], FILTER_VALIDATE_IP , FILTER_FLAG_IPV4 ) &&
301
- !IPv6Converter::isIpv6 ($ components ['host ' ])
302
- ) {
303
- $ decodedHost = rawurldecode ($ components ['host ' ]);
304
- $ components ['host ' ] = (string ) preg_replace_callback (
305
- '/%[0-9A-F]{2}/i ' ,
306
- fn (array $ matches ): string => strtoupper ($ matches [0 ]),
307
- strtolower ($ components ['host ' ])
308
- );
309
- if ($ isSupported ) {
310
- $ host = IdnaConverter::toAscii ($ decodedHost );
311
- if (!$ host ->hasErrors ()) {
312
- $ components ['host ' ] = $ host ->domain ();
299
+ if (null !== $ components ['host ' ] && false === filter_var ($ components ['host ' ], FILTER_VALIDATE_IP , FILTER_FLAG_IPV4 )) {
300
+ // if host is IPv6 it should be lowercased according to
301
+ // https://www.rfc-editor.org/rfc/rfc5952#section-4.3
302
+ $ components ['host ' ] = strtolower ($ components ['host ' ]);
303
+ if (!IPv6Converter::isIpv6 ($ components ['host ' ])) {
304
+ $ decodedHost = rawurldecode ($ components ['host ' ]);
305
+ $ components ['host ' ] = (string ) preg_replace_callback (
306
+ '/%[0-9A-F]{2}/i ' ,
307
+ fn (array $ matches ): string => strtoupper ($ matches [0 ]),
308
+ $ components ['host ' ]
309
+ );
310
+ if ($ isSupported ) {
311
+ $ host = IdnaConverter::toAscii ($ decodedHost );
312
+ if (!$ host ->hasErrors ()) {
313
+ $ components ['host ' ] = $ host ->domain ();
314
+ }
313
315
}
314
316
}
315
317
}
0 commit comments