PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.1-beta
Jetpack – WP Security, Backup, Speed, & Growth v16.1-beta
16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / vendor / wp-php-toolkit / data-liberation / URL / class-wpwhatwgurlsearchparams.php
jetpack / vendor / wp-php-toolkit / data-liberation / URL Last commit date
PHP 2 weeks ago class-convertedurl.php 2 weeks ago class-cssurlprocessor.php 2 weeks ago class-nativeurlintextprocessorwrapper.php 2 weeks ago class-urlintextprocessor.php 2 weeks ago class-urlrewritecache.php 2 weeks ago class-wpurl.php 2 weeks ago class-wpwhatwgurl.php 2 weeks ago class-wpwhatwgurlsearchparams.php 2 weeks ago functions.php 2 weeks ago public-suffix-list.php 2 weeks ago
class-wpwhatwgurlsearchparams.php
176 lines
1 <?php
2
3 namespace WordPress\DataLiberation\URL;
4
5 /**
6 * Adapter that exposes the WHATWG URLSearchParams API on top of WPWhatwgUrl.
7 *
8 * The PHP 8.5 native Uri\WhatWg\Url parser does not expose a URLSearchParams
9 * counterpart, but the rest of the codebase (and Rowbot's URL implementation)
10 * relies on $url->searchParams->get()/has()/set()/delete()/append(). This
11 * class reads from and writes to the owning URL's query string so callers can
12 * keep using the familiar property-based API regardless of which parser
13 * backs WPURL::parse().
14 *
15 * Pairs are serialized as application/x-www-form-urlencoded — that matches
16 * the WHATWG URLSearchParams stringifier and what Rowbot produces.
17 */
18 class WPWhatwgUrlSearchParams implements \Countable, \IteratorAggregate {
19
20 /** @var WPWhatwgUrl */
21 private $owner;
22
23 public function __construct( WPWhatwgUrl $owner ) {
24 $this->owner = $owner;
25 }
26
27 public function __get( $name ) {
28 if ( 'size' === $name ) {
29 return count( $this->read_pairs() );
30 }
31 return null;
32 }
33
34 public function get( $name ) {
35 foreach ( $this->read_pairs() as $pair ) {
36 if ( $pair[0] === (string) $name ) {
37 return $pair[1];
38 }
39 }
40 return null;
41 }
42
43 public function getAll( $name ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid
44 $values = array();
45 foreach ( $this->read_pairs() as $pair ) {
46 if ( $pair[0] === (string) $name ) {
47 $values[] = $pair[1];
48 }
49 }
50 return $values;
51 }
52
53 public function has( $name ) {
54 foreach ( $this->read_pairs() as $pair ) {
55 if ( $pair[0] === (string) $name ) {
56 return true;
57 }
58 }
59 return false;
60 }
61
62 public function set( $name, $value ) {
63 $name = (string) $name;
64 $value = (string) $value;
65 $pairs = $this->read_pairs();
66 $result = array();
67 $found = false;
68 foreach ( $pairs as $pair ) {
69 if ( $pair[0] === $name ) {
70 if ( ! $found ) {
71 $result[] = array( $name, $value );
72 $found = true;
73 }
74 continue;
75 }
76 $result[] = $pair;
77 }
78 if ( ! $found ) {
79 $result[] = array( $name, $value );
80 }
81 $this->write_pairs( $result );
82 }
83
84 public function append( $name, $value ) {
85 $pairs = $this->read_pairs();
86 $pairs[] = array( (string) $name, (string) $value );
87 $this->write_pairs( $pairs );
88 }
89
90 public function delete( $name ) {
91 $name = (string) $name;
92 $result = array();
93 foreach ( $this->read_pairs() as $pair ) {
94 if ( $pair[0] === $name ) {
95 continue;
96 }
97 $result[] = $pair;
98 }
99 $this->write_pairs( $result );
100 }
101
102 public function count(): int {
103 return count( $this->read_pairs() );
104 }
105
106 public function getIterator(): \Iterator { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid
107 return new \ArrayIterator( $this->read_pairs() );
108 }
109
110 // Method name mirrors the WHATWG URLSearchParams API.
111 // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid
112 public function toString(): string {
113 return $this->serialize( $this->read_pairs() );
114 }
115
116 public function __toString(): string {
117 return $this->toString();
118 }
119
120 /**
121 * @return array<int, array{0: string, 1: string}>
122 */
123 private function read_pairs() {
124 $search = $this->owner->__get( 'search' );
125 if ( '' === $search || '?' === $search ) {
126 return array();
127 }
128 $query = '?' === $search[0] ? substr( $search, 1 ) : $search;
129 $pairs = array();
130 foreach ( explode( '&', $query ) as $segment ) {
131 if ( '' === $segment ) {
132 continue;
133 }
134 $eq = strpos( $segment, '=' );
135 if ( false === $eq ) {
136 $pairs[] = array( self::decode( $segment ), '' );
137 } else {
138 $pairs[] = array(
139 self::decode( substr( $segment, 0, $eq ) ),
140 self::decode( substr( $segment, $eq + 1 ) ),
141 );
142 }
143 }
144 return $pairs;
145 }
146
147 private function write_pairs( array $pairs ) {
148 if ( empty( $pairs ) ) {
149 $this->owner->__set( 'search', '' );
150 return;
151 }
152 $this->owner->__set( 'search', '?' . $this->serialize( $pairs ) );
153 }
154
155 private function serialize( array $pairs ) {
156 $parts = array();
157 foreach ( $pairs as $pair ) {
158 $parts[] = self::encode( $pair[0] ) . '=' . self::encode( $pair[1] );
159 }
160 return implode( '&', $parts );
161 }
162
163 private static function encode( $value ) {
164 // urlencode() produces application/x-www-form-urlencoded output —
165 // spaces become "+" and the rest is percent-encoded — matching the
166 // WHATWG URLSearchParams stringifier. rawurlencode() would percent-
167 // encode spaces as %20 instead, which is wrong here.
168 // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.urlencode_urlencode
169 return urlencode( $value );
170 }
171
172 private static function decode( $value ) {
173 return urldecode( $value );
174 }
175 }
176