@@ -321,12 +321,20 @@ PHPAPI php_url *php_url_parse_ex2(char const *str, size_t length, bool *has_port
321321 return ret ;
322322}
323323
324+ static void parse_url_decode_component (zval * zv , uri_component_read_mode_t read_mode )
325+ {
326+ if (read_mode == URI_COMPONENT_READ_NORMALIZED_ASCII || read_mode == URI_COMPONENT_READ_NORMALIZED_UNICODE ) {
327+ php_url_decode (Z_STRVAL_P (zv ), Z_STRLEN_P (zv ));
328+ }
329+ }
330+
324331static zend_result parse_url_read_scheme (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
325332{
326333 php_url * parse_url_uri = internal_uri -> uri ;
327334
328335 if (parse_url_uri -> scheme ) {
329336 ZVAL_STR_COPY (retval , parse_url_uri -> scheme );
337+ parse_url_decode_component (retval , read_mode );
330338 } else {
331339 ZVAL_NULL (retval );
332340 }
@@ -340,6 +348,7 @@ static zend_result parse_url_read_username(const uri_internal_t *internal_uri, u
340348
341349 if (parse_url_uri -> user ) {
342350 ZVAL_STR_COPY (retval , parse_url_uri -> user );
351+ parse_url_decode_component (retval , read_mode );
343352 } else {
344353 ZVAL_NULL (retval );
345354 }
@@ -353,6 +362,7 @@ static zend_result parse_url_read_password(const uri_internal_t *internal_uri, u
353362
354363 if (parse_url_uri -> pass ) {
355364 ZVAL_STR_COPY (retval , parse_url_uri -> pass );
365+ parse_url_decode_component (retval , read_mode );
356366 } else {
357367 ZVAL_NULL (retval );
358368 }
@@ -366,6 +376,7 @@ static zend_result parse_url_read_host(const uri_internal_t *internal_uri, uri_c
366376
367377 if (parse_url_uri -> host ) {
368378 ZVAL_STR_COPY (retval , parse_url_uri -> host );
379+ parse_url_decode_component (retval , read_mode );
369380 } else {
370381 ZVAL_NULL (retval );
371382 }
@@ -379,6 +390,7 @@ static zend_result parse_url_read_port(const uri_internal_t *internal_uri, uri_c
379390
380391 if (parse_url_uri -> port ) {
381392 ZVAL_LONG (retval , parse_url_uri -> port );
393+ parse_url_decode_component (retval , read_mode );
382394 } else {
383395 ZVAL_NULL (retval );
384396 }
@@ -392,6 +404,7 @@ static zend_result parse_url_read_path(const uri_internal_t *internal_uri, uri_c
392404
393405 if (parse_url_uri -> path ) {
394406 ZVAL_STR_COPY (retval , parse_url_uri -> path );
407+ parse_url_decode_component (retval , read_mode );
395408 } else {
396409 ZVAL_NULL (retval );
397410 }
@@ -405,6 +418,7 @@ static zend_result parse_url_read_query(const uri_internal_t *internal_uri, uri_
405418
406419 if (parse_url_uri -> query ) {
407420 ZVAL_STR_COPY (retval , parse_url_uri -> query );
421+ parse_url_decode_component (retval , read_mode );
408422 } else {
409423 ZVAL_NULL (retval );
410424 }
@@ -418,18 +432,14 @@ static zend_result parse_url_read_fragment(const uri_internal_t *internal_uri, u
418432
419433 if (parse_url_uri -> fragment ) {
420434 ZVAL_STR_COPY (retval , parse_url_uri -> fragment );
435+ parse_url_decode_component (retval , read_mode );
421436 } else {
422437 ZVAL_NULL (retval );
423438 }
424439
425440 return SUCCESS ;
426441}
427442
428- static void * parse_url_clone_uri (void * uri )
429- {
430- ZEND_UNREACHABLE ();
431- }
432-
433443static void throw_invalid_uri_exception (void )
434444{
435445 zend_throw_exception (uri_invalid_uri_exception_ce , "The specified URI is malformed" , 0 );
@@ -447,16 +457,11 @@ static void *parse_url_parse_uri(const char *uri_str, size_t uri_str_len, const
447457 return url ;
448458}
449459
450- static zend_string * parse_url_uri_to_string (void * uri , uri_recomposition_mode_t recomposition_mode , bool exclude_fragment )
451- {
452- ZEND_UNREACHABLE ();
453- }
454-
455460const uri_handler_t parse_url_uri_handler = {
456461 .name = URI_PARSER_PHP ,
457462 .parse_uri = parse_url_parse_uri ,
458- .clone_uri = parse_url_clone_uri ,
459- .uri_to_string = parse_url_uri_to_string ,
463+ .clone_uri = NULL ,
464+ .uri_to_string = NULL ,
460465 .free_uri = parse_url_free_uri ,
461466 {
462467 .scheme = {.read_func = parse_url_read_scheme , .write_func = NULL },
0 commit comments