Autoload.php 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. <?php
  2. /**
  3. * Autoloader for Requests for PHP.
  4. *
  5. * Include this file if you'd like to avoid having to create your own autoloader.
  6. *
  7. * @package Requests
  8. * @since 2.0.0
  9. *
  10. * @codeCoverageIgnore
  11. */
  12. namespace WpOrg\Requests;
  13. /*
  14. * Ensure the autoloader is only declared once.
  15. * This safeguard is in place as this is the typical entry point for this library
  16. * and this file being required unconditionally could easily cause
  17. * fatal "Class already declared" errors.
  18. */
  19. if (class_exists('WpOrg\Requests\Autoload') === false) {
  20. /**
  21. * Autoloader for Requests for PHP.
  22. *
  23. * This autoloader supports the PSR-4 based Requests 2.0.0 classes in a case-sensitive manner
  24. * as the most common server OS-es are case-sensitive and the file names are in mixed case.
  25. *
  26. * For the PSR-0 Requests 1.x BC-layer, requested classes will be treated case-insensitively.
  27. *
  28. * @package Requests
  29. */
  30. final class Autoload {
  31. /**
  32. * List of the old PSR-0 class names in lowercase as keys with their PSR-4 case-sensitive name as a value.
  33. *
  34. * @var array
  35. */
  36. private static $deprecated_classes = [
  37. // Interfaces.
  38. 'requests_auth' => '\WpOrg\Requests\Auth',
  39. 'requests_hooker' => '\WpOrg\Requests\HookManager',
  40. 'requests_proxy' => '\WpOrg\Requests\Proxy',
  41. 'requests_transport' => '\WpOrg\Requests\Transport',
  42. // Classes.
  43. 'requests_cookie' => '\WpOrg\Requests\Cookie',
  44. 'requests_exception' => '\WpOrg\Requests\Exception',
  45. 'requests_hooks' => '\WpOrg\Requests\Hooks',
  46. 'requests_idnaencoder' => '\WpOrg\Requests\IdnaEncoder',
  47. 'requests_ipv6' => '\WpOrg\Requests\Ipv6',
  48. 'requests_iri' => '\WpOrg\Requests\Iri',
  49. 'requests_response' => '\WpOrg\Requests\Response',
  50. 'requests_session' => '\WpOrg\Requests\Session',
  51. 'requests_ssl' => '\WpOrg\Requests\Ssl',
  52. 'requests_auth_basic' => '\WpOrg\Requests\Auth\Basic',
  53. 'requests_cookie_jar' => '\WpOrg\Requests\Cookie\Jar',
  54. 'requests_proxy_http' => '\WpOrg\Requests\Proxy\Http',
  55. 'requests_response_headers' => '\WpOrg\Requests\Response\Headers',
  56. 'requests_transport_curl' => '\WpOrg\Requests\Transport\Curl',
  57. 'requests_transport_fsockopen' => '\WpOrg\Requests\Transport\Fsockopen',
  58. 'requests_utility_caseinsensitivedictionary' => '\WpOrg\Requests\Utility\CaseInsensitiveDictionary',
  59. 'requests_utility_filterediterator' => '\WpOrg\Requests\Utility\FilteredIterator',
  60. 'requests_exception_http' => '\WpOrg\Requests\Exception\Http',
  61. 'requests_exception_transport' => '\WpOrg\Requests\Exception\Transport',
  62. 'requests_exception_transport_curl' => '\WpOrg\Requests\Exception\Transport\Curl',
  63. 'requests_exception_http_304' => '\WpOrg\Requests\Exception\Http\Status304',
  64. 'requests_exception_http_305' => '\WpOrg\Requests\Exception\Http\Status305',
  65. 'requests_exception_http_306' => '\WpOrg\Requests\Exception\Http\Status306',
  66. 'requests_exception_http_400' => '\WpOrg\Requests\Exception\Http\Status400',
  67. 'requests_exception_http_401' => '\WpOrg\Requests\Exception\Http\Status401',
  68. 'requests_exception_http_402' => '\WpOrg\Requests\Exception\Http\Status402',
  69. 'requests_exception_http_403' => '\WpOrg\Requests\Exception\Http\Status403',
  70. 'requests_exception_http_404' => '\WpOrg\Requests\Exception\Http\Status404',
  71. 'requests_exception_http_405' => '\WpOrg\Requests\Exception\Http\Status405',
  72. 'requests_exception_http_406' => '\WpOrg\Requests\Exception\Http\Status406',
  73. 'requests_exception_http_407' => '\WpOrg\Requests\Exception\Http\Status407',
  74. 'requests_exception_http_408' => '\WpOrg\Requests\Exception\Http\Status408',
  75. 'requests_exception_http_409' => '\WpOrg\Requests\Exception\Http\Status409',
  76. 'requests_exception_http_410' => '\WpOrg\Requests\Exception\Http\Status410',
  77. 'requests_exception_http_411' => '\WpOrg\Requests\Exception\Http\Status411',
  78. 'requests_exception_http_412' => '\WpOrg\Requests\Exception\Http\Status412',
  79. 'requests_exception_http_413' => '\WpOrg\Requests\Exception\Http\Status413',
  80. 'requests_exception_http_414' => '\WpOrg\Requests\Exception\Http\Status414',
  81. 'requests_exception_http_415' => '\WpOrg\Requests\Exception\Http\Status415',
  82. 'requests_exception_http_416' => '\WpOrg\Requests\Exception\Http\Status416',
  83. 'requests_exception_http_417' => '\WpOrg\Requests\Exception\Http\Status417',
  84. 'requests_exception_http_418' => '\WpOrg\Requests\Exception\Http\Status418',
  85. 'requests_exception_http_428' => '\WpOrg\Requests\Exception\Http\Status428',
  86. 'requests_exception_http_429' => '\WpOrg\Requests\Exception\Http\Status429',
  87. 'requests_exception_http_431' => '\WpOrg\Requests\Exception\Http\Status431',
  88. 'requests_exception_http_500' => '\WpOrg\Requests\Exception\Http\Status500',
  89. 'requests_exception_http_501' => '\WpOrg\Requests\Exception\Http\Status501',
  90. 'requests_exception_http_502' => '\WpOrg\Requests\Exception\Http\Status502',
  91. 'requests_exception_http_503' => '\WpOrg\Requests\Exception\Http\Status503',
  92. 'requests_exception_http_504' => '\WpOrg\Requests\Exception\Http\Status504',
  93. 'requests_exception_http_505' => '\WpOrg\Requests\Exception\Http\Status505',
  94. 'requests_exception_http_511' => '\WpOrg\Requests\Exception\Http\Status511',
  95. 'requests_exception_http_unknown' => '\WpOrg\Requests\Exception\Http\StatusUnknown',
  96. ];
  97. /**
  98. * Register the autoloader.
  99. *
  100. * Note: the autoloader is *prepended* in the autoload queue.
  101. * This is done to ensure that the Requests 2.0 autoloader takes precedence
  102. * over a potentially (dependency-registered) Requests 1.x autoloader.
  103. *
  104. * @internal This method contains a safeguard against the autoloader being
  105. * registered multiple times. This safeguard uses a global constant to
  106. * (hopefully/in most cases) still function correctly, even if the
  107. * class would be renamed.
  108. *
  109. * @return void
  110. */
  111. public static function register() {
  112. if (defined('REQUESTS_AUTOLOAD_REGISTERED') === false) {
  113. spl_autoload_register([self::class, 'load'], true);
  114. define('REQUESTS_AUTOLOAD_REGISTERED', true);
  115. }
  116. }
  117. /**
  118. * Autoloader.
  119. *
  120. * @param string $class_name Name of the class name to load.
  121. *
  122. * @return bool Whether a class was loaded or not.
  123. */
  124. public static function load($class_name) {
  125. // Check that the class starts with "Requests" (PSR-0) or "WpOrg\Requests" (PSR-4).
  126. $psr_4_prefix_pos = strpos($class_name, 'WpOrg\\Requests\\');
  127. if (stripos($class_name, 'Requests') !== 0 && $psr_4_prefix_pos !== 0) {
  128. return false;
  129. }
  130. $class_lower = strtolower($class_name);
  131. if ($class_lower === 'requests') {
  132. // Reference to the original PSR-0 Requests class.
  133. $file = dirname(__DIR__) . '/library/Requests.php';
  134. } elseif ($psr_4_prefix_pos === 0) {
  135. // PSR-4 classname.
  136. $file = __DIR__ . '/' . strtr(substr($class_name, 15), '\\', '/') . '.php';
  137. }
  138. if (isset($file) && file_exists($file)) {
  139. include $file;
  140. return true;
  141. }
  142. /*
  143. * Okay, so the class starts with "Requests", but we couldn't find the file.
  144. * If this is one of the deprecated/renamed PSR-0 classes being requested,
  145. * let's alias it to the new name and throw a deprecation notice.
  146. */
  147. if (isset(self::$deprecated_classes[$class_lower])) {
  148. /*
  149. * Integrators who cannot yet upgrade to the PSR-4 class names can silence deprecations
  150. * by defining a `REQUESTS_SILENCE_PSR0_DEPRECATIONS` constant and setting it to `true`.
  151. * The constant needs to be defined before the first deprecated class is requested
  152. * via this autoloader.
  153. */
  154. if (!defined('REQUESTS_SILENCE_PSR0_DEPRECATIONS') || REQUESTS_SILENCE_PSR0_DEPRECATIONS !== true) {
  155. // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_trigger_error
  156. trigger_error(
  157. 'The PSR-0 `Requests_...` class names in the Request library are deprecated.'
  158. . ' Switch to the PSR-4 `WpOrg\Requests\...` class names at your earliest convenience.',
  159. E_USER_DEPRECATED
  160. );
  161. // Prevent the deprecation notice from being thrown twice.
  162. if (!defined('REQUESTS_SILENCE_PSR0_DEPRECATIONS')) {
  163. define('REQUESTS_SILENCE_PSR0_DEPRECATIONS', true);
  164. }
  165. }
  166. // Create an alias and let the autoloader recursively kick in to load the PSR-4 class.
  167. return class_alias(self::$deprecated_classes[$class_lower], $class_name, true);
  168. }
  169. return false;
  170. }
  171. }
  172. }