wp/wp-includes/Requests/src/Autoload.php
changeset 21 48c4eec2b7e6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wp/wp-includes/Requests/src/Autoload.php	Fri Sep 05 18:40:08 2025 +0200
@@ -0,0 +1,187 @@
+<?php
+/**
+ * Autoloader for Requests for PHP.
+ *
+ * Include this file if you'd like to avoid having to create your own autoloader.
+ *
+ * @package Requests
+ * @since   2.0.0
+ *
+ * @codeCoverageIgnore
+ */
+
+namespace WpOrg\Requests;
+
+/*
+ * Ensure the autoloader is only declared once.
+ * This safeguard is in place as this is the typical entry point for this library
+ * and this file being required unconditionally could easily cause
+ * fatal "Class already declared" errors.
+ */
+if (class_exists('WpOrg\Requests\Autoload') === false) {
+
+	/**
+	 * Autoloader for Requests for PHP.
+	 *
+	 * This autoloader supports the PSR-4 based Requests 2.0.0 classes in a case-sensitive manner
+	 * as the most common server OS-es are case-sensitive and the file names are in mixed case.
+	 *
+	 * For the PSR-0 Requests 1.x BC-layer, requested classes will be treated case-insensitively.
+	 *
+	 * @package Requests
+	 */
+	final class Autoload {
+
+		/**
+		 * List of the old PSR-0 class names in lowercase as keys with their PSR-4 case-sensitive name as a value.
+		 *
+		 * @var array
+		 */
+		private static $deprecated_classes = [
+			// Interfaces.
+			'requests_auth'                              => '\WpOrg\Requests\Auth',
+			'requests_hooker'                            => '\WpOrg\Requests\HookManager',
+			'requests_proxy'                             => '\WpOrg\Requests\Proxy',
+			'requests_transport'                         => '\WpOrg\Requests\Transport',
+
+			// Classes.
+			'requests_cookie'                            => '\WpOrg\Requests\Cookie',
+			'requests_exception'                         => '\WpOrg\Requests\Exception',
+			'requests_hooks'                             => '\WpOrg\Requests\Hooks',
+			'requests_idnaencoder'                       => '\WpOrg\Requests\IdnaEncoder',
+			'requests_ipv6'                              => '\WpOrg\Requests\Ipv6',
+			'requests_iri'                               => '\WpOrg\Requests\Iri',
+			'requests_response'                          => '\WpOrg\Requests\Response',
+			'requests_session'                           => '\WpOrg\Requests\Session',
+			'requests_ssl'                               => '\WpOrg\Requests\Ssl',
+			'requests_auth_basic'                        => '\WpOrg\Requests\Auth\Basic',
+			'requests_cookie_jar'                        => '\WpOrg\Requests\Cookie\Jar',
+			'requests_proxy_http'                        => '\WpOrg\Requests\Proxy\Http',
+			'requests_response_headers'                  => '\WpOrg\Requests\Response\Headers',
+			'requests_transport_curl'                    => '\WpOrg\Requests\Transport\Curl',
+			'requests_transport_fsockopen'               => '\WpOrg\Requests\Transport\Fsockopen',
+			'requests_utility_caseinsensitivedictionary' => '\WpOrg\Requests\Utility\CaseInsensitiveDictionary',
+			'requests_utility_filterediterator'          => '\WpOrg\Requests\Utility\FilteredIterator',
+			'requests_exception_http'                    => '\WpOrg\Requests\Exception\Http',
+			'requests_exception_transport'               => '\WpOrg\Requests\Exception\Transport',
+			'requests_exception_transport_curl'          => '\WpOrg\Requests\Exception\Transport\Curl',
+			'requests_exception_http_304'                => '\WpOrg\Requests\Exception\Http\Status304',
+			'requests_exception_http_305'                => '\WpOrg\Requests\Exception\Http\Status305',
+			'requests_exception_http_306'                => '\WpOrg\Requests\Exception\Http\Status306',
+			'requests_exception_http_400'                => '\WpOrg\Requests\Exception\Http\Status400',
+			'requests_exception_http_401'                => '\WpOrg\Requests\Exception\Http\Status401',
+			'requests_exception_http_402'                => '\WpOrg\Requests\Exception\Http\Status402',
+			'requests_exception_http_403'                => '\WpOrg\Requests\Exception\Http\Status403',
+			'requests_exception_http_404'                => '\WpOrg\Requests\Exception\Http\Status404',
+			'requests_exception_http_405'                => '\WpOrg\Requests\Exception\Http\Status405',
+			'requests_exception_http_406'                => '\WpOrg\Requests\Exception\Http\Status406',
+			'requests_exception_http_407'                => '\WpOrg\Requests\Exception\Http\Status407',
+			'requests_exception_http_408'                => '\WpOrg\Requests\Exception\Http\Status408',
+			'requests_exception_http_409'                => '\WpOrg\Requests\Exception\Http\Status409',
+			'requests_exception_http_410'                => '\WpOrg\Requests\Exception\Http\Status410',
+			'requests_exception_http_411'                => '\WpOrg\Requests\Exception\Http\Status411',
+			'requests_exception_http_412'                => '\WpOrg\Requests\Exception\Http\Status412',
+			'requests_exception_http_413'                => '\WpOrg\Requests\Exception\Http\Status413',
+			'requests_exception_http_414'                => '\WpOrg\Requests\Exception\Http\Status414',
+			'requests_exception_http_415'                => '\WpOrg\Requests\Exception\Http\Status415',
+			'requests_exception_http_416'                => '\WpOrg\Requests\Exception\Http\Status416',
+			'requests_exception_http_417'                => '\WpOrg\Requests\Exception\Http\Status417',
+			'requests_exception_http_418'                => '\WpOrg\Requests\Exception\Http\Status418',
+			'requests_exception_http_428'                => '\WpOrg\Requests\Exception\Http\Status428',
+			'requests_exception_http_429'                => '\WpOrg\Requests\Exception\Http\Status429',
+			'requests_exception_http_431'                => '\WpOrg\Requests\Exception\Http\Status431',
+			'requests_exception_http_500'                => '\WpOrg\Requests\Exception\Http\Status500',
+			'requests_exception_http_501'                => '\WpOrg\Requests\Exception\Http\Status501',
+			'requests_exception_http_502'                => '\WpOrg\Requests\Exception\Http\Status502',
+			'requests_exception_http_503'                => '\WpOrg\Requests\Exception\Http\Status503',
+			'requests_exception_http_504'                => '\WpOrg\Requests\Exception\Http\Status504',
+			'requests_exception_http_505'                => '\WpOrg\Requests\Exception\Http\Status505',
+			'requests_exception_http_511'                => '\WpOrg\Requests\Exception\Http\Status511',
+			'requests_exception_http_unknown'            => '\WpOrg\Requests\Exception\Http\StatusUnknown',
+		];
+
+		/**
+		 * Register the autoloader.
+		 *
+		 * Note: the autoloader is *prepended* in the autoload queue.
+		 * This is done to ensure that the Requests 2.0 autoloader takes precedence
+		 * over a potentially (dependency-registered) Requests 1.x autoloader.
+		 *
+		 * @internal This method contains a safeguard against the autoloader being
+		 * registered multiple times. This safeguard uses a global constant to
+		 * (hopefully/in most cases) still function correctly, even if the
+		 * class would be renamed.
+		 *
+		 * @return void
+		 */
+		public static function register() {
+			if (defined('REQUESTS_AUTOLOAD_REGISTERED') === false) {
+				spl_autoload_register([self::class, 'load'], true);
+				define('REQUESTS_AUTOLOAD_REGISTERED', true);
+			}
+		}
+
+		/**
+		 * Autoloader.
+		 *
+		 * @param string $class_name Name of the class name to load.
+		 *
+		 * @return bool Whether a class was loaded or not.
+		 */
+		public static function load($class_name) {
+			// Check that the class starts with "Requests" (PSR-0) or "WpOrg\Requests" (PSR-4).
+			$psr_4_prefix_pos = strpos($class_name, 'WpOrg\\Requests\\');
+
+			if (stripos($class_name, 'Requests') !== 0 && $psr_4_prefix_pos !== 0) {
+				return false;
+			}
+
+			$class_lower = strtolower($class_name);
+
+			if ($class_lower === 'requests') {
+				// Reference to the original PSR-0 Requests class.
+				$file = dirname(__DIR__) . '/library/Requests.php';
+			} elseif ($psr_4_prefix_pos === 0) {
+				// PSR-4 classname.
+				$file = __DIR__ . '/' . strtr(substr($class_name, 15), '\\', '/') . '.php';
+			}
+
+			if (isset($file) && file_exists($file)) {
+				include $file;
+				return true;
+			}
+
+			/*
+			 * Okay, so the class starts with "Requests", but we couldn't find the file.
+			 * If this is one of the deprecated/renamed PSR-0 classes being requested,
+			 * let's alias it to the new name and throw a deprecation notice.
+			 */
+			if (isset(self::$deprecated_classes[$class_lower])) {
+				/*
+				 * Integrators who cannot yet upgrade to the PSR-4 class names can silence deprecations
+				 * by defining a `REQUESTS_SILENCE_PSR0_DEPRECATIONS` constant and setting it to `true`.
+				 * The constant needs to be defined before the first deprecated class is requested
+				 * via this autoloader.
+				 */
+				if (!defined('REQUESTS_SILENCE_PSR0_DEPRECATIONS') || REQUESTS_SILENCE_PSR0_DEPRECATIONS !== true) {
+					// phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_trigger_error
+					trigger_error(
+						'The PSR-0 `Requests_...` class names in the Requests library are deprecated.'
+						. ' Switch to the PSR-4 `WpOrg\Requests\...` class names at your earliest convenience.',
+						E_USER_DEPRECATED
+					);
+
+					// Prevent the deprecation notice from being thrown twice.
+					if (!defined('REQUESTS_SILENCE_PSR0_DEPRECATIONS')) {
+						define('REQUESTS_SILENCE_PSR0_DEPRECATIONS', true);
+					}
+				}
+
+				// Create an alias and let the autoloader recursively kick in to load the PSR-4 class.
+				return class_alias(self::$deprecated_classes[$class_lower], $class_name, true);
+			}
+
+			return false;
+		}
+	}
+}