11
11
12
12
namespace Symfony \Component \HttpClient ;
13
13
14
- use RecursiveArrayIterator ;
15
- use RecursiveIteratorIterator ;
16
14
use Symfony \Component \HttpClient \Exception \InvalidArgumentException ;
17
15
18
16
/**
@@ -473,97 +471,33 @@ private static function mergeQueryString(?string $queryString, array $queryArray
473
471
}
474
472
475
473
$ query = [];
476
- if (null !== $ queryString && '' !== $ queryString ) {
477
- $ query = self ::parseQueryString ($ queryString );
478
- }
479
-
480
- if (!empty ($ queryArray )) {
481
- $ query = self ::mergeQueryParams ($ query , $ queryArray , $ replace );
482
- }
483
474
484
- $ finalQueryString = '' ;
485
- if (! empty ( $ query ) ) {
486
- $ iterator = new RecursiveIteratorIterator ( new RecursiveArrayIterator ( $ query ));
487
- $ iterator -> rewind ( );
488
- foreach ( $ iterator as $ v ) {
489
- $ finalQueryString .= ( $ finalQueryString ? ' & ' : '' ). $ v ;
475
+ if ( null !== $ queryString ) {
476
+ foreach ( explode ( ' & ' , $ queryString ) as $ v ) {
477
+ if ( '' !== $ v ) {
478
+ $ k = urldecode ( explode ( ' = ' , $ v , 2 )[ 0 ] );
479
+ $ query [ $ k ] = ( isset ( $ query [ $ k ]) ? $ query [ $ k ]. ' & ' : '' ). $ v ;
480
+ }
490
481
}
491
482
}
492
483
493
- return $ finalQueryString ;
494
- }
495
-
496
- /**
497
- * Custom query string parser.
498
- * We cannot use parse_str() here as it replaces some characters and breaks legit query strings.
499
- *
500
- * @param string $queryString
501
- *
502
- * @return array
503
- */
504
- private static function parseQueryString ($ queryString )
505
- {
506
- $ query = [];
507
- foreach (explode ('& ' , $ queryString ) as $ v ) {
508
- if ('' == $ v ) {
509
- continue ;
510
- }
511
-
512
- if (false === $ n = strpos ($ v , '= ' )) {
513
- $ k = $ v ;
514
- } else {
515
- $ k = substr ($ v , 0 , $ n );
516
- }
517
-
518
- if (preg_match ('/^(?P<key>[^\[]*)(?P<keys>\[.*\])$/ ' , $ k , $ matches )) {
519
- $ firstKey = $ matches ['key ' ];
520
- preg_match_all ('/(?<=\[).+?(?=\])/ ' , $ matches ['keys ' ], $ matches );
521
- $ keys = array_reverse ($ matches [0 ]);
522
- $ query [urldecode ($ firstKey )] = array_reduce ($ keys , function ($ array , $ item ) {
523
- return [$ item => $ array ];
524
- }, $ v );
525
- } else {
526
- $ query [urldecode ($ k )] = (isset ($ query [$ k ]) ? $ query [$ k ].'& ' : '' ).$ v ;
484
+ if ($ replace ) {
485
+ foreach ($ queryArray as $ k => $ v ) {
486
+ if (null === $ v ) {
487
+ unset($ query [$ k ]);
488
+ }
527
489
}
528
490
}
529
491
530
- return $ query ;
531
- }
532
-
533
- /**
534
- * @param array $query
535
- * @param array $queryArray
536
- * @param bool $replace
537
- * @param string $parentPath
538
- *
539
- * @return array
540
- */
541
- private static function mergeQueryParams (array $ query , array $ queryArray , bool $ replace , string $ parentPath = '' ): array
542
- {
543
- foreach ($ queryArray as $ k => $ v ) {
544
- if (!$ replace && isset ($ query [$ k ]) && (!\is_array ($ v ) || is_scalar ($ query [$ k ]))) {
545
- continue ;
546
- }
547
-
548
- $ path = $ parentPath .($ parentPath ? '[ ' : '' ).$ k .($ parentPath ? '] ' : '' );
549
-
550
- if ($ replace || !isset ($ query [$ k ])) {
551
- if (\is_array ($ v ) && (!isset ($ query [$ k ]) || !\is_array ($ query [$ k ]))) {
552
- $ query [$ k ] = [];
553
- }
492
+ $ queryString = http_build_query ($ queryArray , '' , '& ' , PHP_QUERY_RFC3986 );
493
+ $ queryArray = [];
554
494
555
- if (null === $ v ) {
556
- unset($ query [$ k ]);
557
- } elseif (is_scalar ($ v )) {
558
- $ query [$ k ] = rawurlencode ($ path ).'= ' .rawurlencode ($ v );
559
- } elseif (\is_array ($ v )) {
560
- $ query [$ k ] = self ::mergeQueryParams ($ query [$ k ], $ v , $ replace , $ path );
561
- } else {
562
- throw new InvalidArgumentException (sprintf ('Unsupported value for query parameter "%s": scalar or null expected, %s given. ' , $ path , \gettype ($ v )));
563
- }
495
+ if ($ queryString ) {
496
+ foreach (explode ('& ' , $ queryString ) as $ v ) {
497
+ $ queryArray [rawurldecode (explode ('= ' , $ v , 2 )[0 ])] = $ v ;
564
498
}
565
499
}
566
500
567
- return $ query ;
501
+ return implode ( ' & ' , $ replace ? array_replace ( $ query, $ queryArray ) : ( $ query + $ queryArray )) ;
568
502
}
569
503
}
0 commit comments