Changeset 3562098
- Timestamp:
- 06/05/2026 08:55:56 AM (5 months ago)
- Location:
- sg-ai-studio/trunk
- Files:
-
- 32 added
- 68 edited
-
composer.json (modified) (2 diffs)
-
composer.lock (modified) (15 diffs)
-
core/Helper/HelperAuth.php (modified) (5 diffs)
-
readme.txt (modified) (2 diffs)
-
sg-ai-studio.php (modified) (2 diffs)
-
vendor/autoload.php (modified) (1 diff)
-
vendor/charles-rumley/php-po-to-json/composer.json (added)
-
vendor/charles-rumley/php-po-to-json/composer.lock (added)
-
vendor/composer/autoload_classmap.php (modified) (1 diff)
-
vendor/composer/autoload_files.php (modified) (1 diff)
-
vendor/composer/autoload_psr4.php (modified) (1 diff)
-
vendor/composer/autoload_real.php (modified) (2 diffs)
-
vendor/composer/autoload_static.php (modified) (5 diffs)
-
vendor/composer/installed.json (modified) (14 diffs)
-
vendor/composer/installed.php (modified) (7 diffs)
-
vendor/composer/platform_check.php (modified) (1 diff)
-
vendor/firebase/php-jwt/CHANGELOG.md (modified) (1 diff)
-
vendor/firebase/php-jwt/README.md (modified) (19 diffs)
-
vendor/firebase/php-jwt/composer.json (added)
-
vendor/firebase/php-jwt/src/CachedKeySet.php (modified) (3 diffs)
-
vendor/firebase/php-jwt/src/ExpiredException.php (modified) (2 diffs)
-
vendor/firebase/php-jwt/src/JWK.php (modified) (5 diffs)
-
vendor/firebase/php-jwt/src/JWT.php (modified) (21 diffs)
-
vendor/firebase/php-jwt/src/Key.php (modified) (4 diffs)
-
vendor/guzzlehttp/guzzle/CHANGELOG.md (modified) (3 diffs)
-
vendor/guzzlehttp/guzzle/README.md (modified) (2 diffs)
-
vendor/guzzlehttp/guzzle/UPGRADING.md (modified) (6 diffs)
-
vendor/guzzlehttp/guzzle/composer.json (added)
-
vendor/guzzlehttp/guzzle/src/Client.php (modified) (14 diffs)
-
vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php (modified) (6 diffs)
-
vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php (modified) (10 diffs)
-
vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php (modified) (1 diff)
-
vendor/guzzlehttp/guzzle/src/Exception/RequestException.php (modified) (1 diff)
-
vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php (modified) (15 diffs)
-
vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php (modified) (2 diffs)
-
vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php (modified) (6 diffs)
-
vendor/guzzlehttp/guzzle/src/Handler/CurlShareHandleState.php (added)
-
vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php (modified) (1 diff)
-
vendor/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php (modified) (3 diffs)
-
vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php (modified) (14 diffs)
-
vendor/guzzlehttp/guzzle/src/HandlerStack.php (modified) (1 diff)
-
vendor/guzzlehttp/guzzle/src/Pool.php (modified) (1 diff)
-
vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php (modified) (1 diff)
-
vendor/guzzlehttp/guzzle/src/RequestOptions.php (modified) (12 diffs)
-
vendor/guzzlehttp/guzzle/src/RetryMiddleware.php (modified) (2 diffs)
-
vendor/guzzlehttp/guzzle/src/TransportSharing.php (added)
-
vendor/guzzlehttp/guzzle/src/Utils.php (modified) (9 diffs)
-
vendor/guzzlehttp/promises/CHANGELOG.md (modified) (1 diff)
-
vendor/guzzlehttp/promises/README.md (modified) (4 diffs)
-
vendor/guzzlehttp/promises/composer.json (added)
-
vendor/guzzlehttp/promises/src/Create.php (modified) (1 diff)
-
vendor/guzzlehttp/promises/src/Each.php (modified) (4 diffs)
-
vendor/guzzlehttp/promises/src/EachPromise.php (modified) (1 diff)
-
vendor/guzzlehttp/promises/src/Utils.php (modified) (7 diffs)
-
vendor/guzzlehttp/psr7/CHANGELOG.md (modified) (1 diff)
-
vendor/guzzlehttp/psr7/README.md (modified) (7 diffs)
-
vendor/guzzlehttp/psr7/composer.json (added)
-
vendor/guzzlehttp/psr7/src/AppendStream.php (modified) (4 diffs)
-
vendor/guzzlehttp/psr7/src/BufferStream.php (modified) (4 diffs)
-
vendor/guzzlehttp/psr7/src/CachingStream.php (modified) (3 diffs)
-
vendor/guzzlehttp/psr7/src/DroppingStream.php (modified) (1 diff)
-
vendor/guzzlehttp/psr7/src/FnStream.php (modified) (7 diffs)
-
vendor/guzzlehttp/psr7/src/Header.php (modified) (2 diffs)
-
vendor/guzzlehttp/psr7/src/LimitStream.php (modified) (2 diffs)
-
vendor/guzzlehttp/psr7/src/MessageTrait.php (modified) (5 diffs)
-
vendor/guzzlehttp/psr7/src/MultipartStream.php (modified) (7 diffs)
-
vendor/guzzlehttp/psr7/src/NoSeekStream.php (modified) (1 diff)
-
vendor/guzzlehttp/psr7/src/PumpStream.php (modified) (6 diffs)
-
vendor/guzzlehttp/psr7/src/Request.php (modified) (4 diffs)
-
vendor/guzzlehttp/psr7/src/Response.php (modified) (1 diff)
-
vendor/guzzlehttp/psr7/src/ServerRequest.php (modified) (6 diffs)
-
vendor/guzzlehttp/psr7/src/Stream.php (modified) (4 diffs)
-
vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php (modified) (4 diffs)
-
vendor/guzzlehttp/psr7/src/Uri.php (modified) (2 diffs)
-
vendor/guzzlehttp/psr7/src/UriComparator.php (modified) (2 diffs)
-
vendor/guzzlehttp/psr7/src/Utils.php (modified) (8 diffs)
-
vendor/psr/http-client/composer.json (added)
-
vendor/psr/http-factory/composer.json (added)
-
vendor/psr/http-message/composer.json (added)
-
vendor/ralouphie/getallheaders/composer.json (added)
-
vendor/sepia/po-parser/composer.json (added)
-
vendor/siteground/siteground-helper/composer.json (added)
-
vendor/siteground/siteground-helper/composer.lock (added)
-
vendor/siteground/siteground-i18n/composer.json (added)
-
vendor/siteground/siteground-i18n/composer.lock (added)
-
vendor/symfony/deprecation-contracts/composer.json (added)
-
vendor/symfony/polyfill-php80 (added)
-
vendor/symfony/polyfill-php80/LICENSE (added)
-
vendor/symfony/polyfill-php80/Php80.php (added)
-
vendor/symfony/polyfill-php80/PhpToken.php (added)
-
vendor/symfony/polyfill-php80/README.md (added)
-
vendor/symfony/polyfill-php80/Resources (added)
-
vendor/symfony/polyfill-php80/Resources/stubs (added)
-
vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php (added)
-
vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php (added)
-
vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php (added)
-
vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php (added)
-
vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php (added)
-
vendor/symfony/polyfill-php80/bootstrap.php (added)
-
vendor/symfony/polyfill-php80/composer.json (added)
Legend:
- Unmodified
- Added
- Removed
-
sg-ai-studio/trunk/composer.json
r3561022 r3562098 3 3 "type": "wordpress-plugin", 4 4 "autoload": { 5 "psr-4": {"SG_AI_Studio\\": "core/"}, 6 "classmap": ["vendor-prefixed/sepia/po-parser/src/"] 7 }, 8 "require-dev": { 9 "brianhenryie/strauss": "^0.27" 10 }, 11 "scripts": { 12 "strauss": [ 13 "vendor/bin/strauss", 14 "@composer dump-autoload" 15 ], 16 "pre-autoload-dump": [ 17 "@php -r \"is_dir('vendor-prefixed/sepia/po-parser/src') || @mkdir('vendor-prefixed/sepia/po-parser/src', 0775, true);\"" 18 ], 19 "post-install-cmd": ["@strauss"], 20 "post-update-cmd": ["@strauss"] 21 }, 22 "extra": { 23 "strauss": { 24 "target_directory": "vendor-prefixed", 25 "namespace_prefix": "SG_AI_Studio\\Vendor\\", 26 "classmap_prefix": "SG_AI_Studio_", 27 "constant_prefix": "SG_AI_STUDIO_", 28 "delete_vendor_packages": true, 29 "packages": [ 30 "guzzlehttp/guzzle", 31 "guzzlehttp/promises", 32 "guzzlehttp/psr7", 33 "psr/http-client", 34 "psr/http-factory", 35 "psr/http-message", 36 "firebase/php-jwt", 37 "symfony/deprecation-contracts", 38 "ralouphie/getallheaders", 39 "sepia/po-parser", 40 "charles-rumley/php-po-to-json", 41 "siteground/siteground-helper", 42 "siteground/siteground-i18n" 43 ] 44 } 5 "psr-4": {"SG_AI_Studio\\": "core/"} 45 6 }, 46 7 "config": { … … 65 26 "prefer-stable": true, 66 27 "require": { 67 "firebase/php-jwt": "^6. 0",28 "firebase/php-jwt": "^6.10", 68 29 "charles-rumley/php-po-to-json": "master@dev", 69 30 "guzzlehttp/guzzle": "^7.0", -
sg-ai-studio/trunk/composer.lock
r3561022 r3562098 5 5 "This file is @generated automatically" 6 6 ], 7 "content-hash": " 8be3fd6875add557d1a6d9f58df101c7",7 "content-hash": "2b259b51f87deb57726fd6be9f32d885", 8 8 "packages": [ 9 9 { … … 124 124 { 125 125 "name": "guzzlehttp/guzzle", 126 "version": "7.1 0.0",126 "version": "7.11.0", 127 127 "source": { 128 128 "type": "git", 129 129 "url": "https://github.com/guzzle/guzzle.git", 130 "reference": " b51ac707cfa420b7bfd4e4d5e510ba8008e822b4"131 }, 132 "dist": { 133 "type": "zip", 134 "url": "https://api.github.com/repos/guzzle/guzzle/zipball/ b51ac707cfa420b7bfd4e4d5e510ba8008e822b4",135 "reference": " b51ac707cfa420b7bfd4e4d5e510ba8008e822b4",130 "reference": "c987f8ce84b8434fa430795eca0f3430663da72b" 131 }, 132 "dist": { 133 "type": "zip", 134 "url": "https://api.github.com/repos/guzzle/guzzle/zipball/c987f8ce84b8434fa430795eca0f3430663da72b", 135 "reference": "c987f8ce84b8434fa430795eca0f3430663da72b", 136 136 "shasum": "" 137 137 }, 138 138 "require": { 139 139 "ext-json": "*", 140 "guzzlehttp/promises": "^2. 3",141 "guzzlehttp/psr7": "^2. 8",140 "guzzlehttp/promises": "^2.5", 141 "guzzlehttp/psr7": "^2.11", 142 142 "php": "^7.2.5 || ^8.0", 143 143 "psr/http-client": "^1.0", 144 "symfony/deprecation-contracts": "^2.2 || ^3.0" 144 "symfony/deprecation-contracts": "^2.5 || ^3.0", 145 "symfony/polyfill-php80": "^1.24" 145 146 }, 146 147 "provide": { … … 151 152 "ext-curl": "*", 152 153 "guzzle/client-integration-tests": "3.0.2", 154 "guzzlehttp/test-server": "^0.4", 153 155 "php-http/message-factory": "^1.1", 154 "phpunit/phpunit": "^8.5. 39 || ^9.6.20",156 "phpunit/phpunit": "^8.5.52 || ^9.6.34", 155 157 "psr/log": "^1.1 || ^2.0 || ^3.0" 156 158 }, … … 230 232 "support": { 231 233 "issues": "https://github.com/guzzle/guzzle/issues", 232 "source": "https://github.com/guzzle/guzzle/tree/7.1 0.0"234 "source": "https://github.com/guzzle/guzzle/tree/7.11.0" 233 235 }, 234 236 "funding": [ … … 246 248 } 247 249 ], 248 "time": "202 5-08-23T22:36:01+00:00"250 "time": "2026-06-02T12:40:51+00:00" 249 251 }, 250 252 { 251 253 "name": "guzzlehttp/promises", 252 "version": "2. 3.0",254 "version": "2.5.0", 253 255 "source": { 254 256 "type": "git", 255 257 "url": "https://github.com/guzzle/promises.git", 256 "reference": "481557b130ef3790cf82b713667b43030dc9c957" 257 }, 258 "dist": { 259 "type": "zip", 260 "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957", 261 "reference": "481557b130ef3790cf82b713667b43030dc9c957", 262 "shasum": "" 263 }, 264 "require": { 265 "php": "^7.2.5 || ^8.0" 258 "reference": "4360e982f87f5f258bf872d094647791db2f4c8e" 259 }, 260 "dist": { 261 "type": "zip", 262 "url": "https://api.github.com/repos/guzzle/promises/zipball/4360e982f87f5f258bf872d094647791db2f4c8e", 263 "reference": "4360e982f87f5f258bf872d094647791db2f4c8e", 264 "shasum": "" 265 }, 266 "require": { 267 "php": "^7.2.5 || ^8.0", 268 "symfony/deprecation-contracts": "^2.5 || ^3.0" 266 269 }, 267 270 "require-dev": { 268 271 "bamarni/composer-bin-plugin": "^1.8.2", 269 "phpunit/phpunit": "^8.5. 44 || ^9.6.25"272 "phpunit/phpunit": "^8.5.52 || ^9.6.34" 270 273 }, 271 274 "type": "library", … … 313 316 "support": { 314 317 "issues": "https://github.com/guzzle/promises/issues", 315 "source": "https://github.com/guzzle/promises/tree/2. 3.0"318 "source": "https://github.com/guzzle/promises/tree/2.5.0" 316 319 }, 317 320 "funding": [ … … 329 332 } 330 333 ], 331 "time": "202 5-08-22T14:34:08+00:00"334 "time": "2026-06-02T12:23:43+00:00" 332 335 }, 333 336 { 334 337 "name": "guzzlehttp/psr7", 335 "version": "2. 9.0",338 "version": "2.11.0", 336 339 "source": { 337 340 "type": "git", 338 341 "url": "https://github.com/guzzle/psr7.git", 339 "reference": " 7d0ed42f28e42d61352a7a79de682e5e67fec884"340 }, 341 "dist": { 342 "type": "zip", 343 "url": "https://api.github.com/repos/guzzle/psr7/zipball/ 7d0ed42f28e42d61352a7a79de682e5e67fec884",344 "reference": " 7d0ed42f28e42d61352a7a79de682e5e67fec884",342 "reference": "bbb5e61349fa5cb822b3e87842b951088b76b81f" 343 }, 344 "dist": { 345 "type": "zip", 346 "url": "https://api.github.com/repos/guzzle/psr7/zipball/bbb5e61349fa5cb822b3e87842b951088b76b81f", 347 "reference": "bbb5e61349fa5cb822b3e87842b951088b76b81f", 345 348 "shasum": "" 346 349 }, … … 349 352 "psr/http-factory": "^1.0", 350 353 "psr/http-message": "^1.1 || ^2.0", 351 "ralouphie/getallheaders": "^3.0" 354 "ralouphie/getallheaders": "^3.0", 355 "symfony/deprecation-contracts": "^2.5 || ^3.0", 356 "symfony/polyfill-php80": "^1.24" 352 357 }, 353 358 "provide": { … … 357 362 "require-dev": { 358 363 "bamarni/composer-bin-plugin": "^1.8.2", 359 "http-interop/http-factory-tests": " 0.9.0",364 "http-interop/http-factory-tests": "1.1.0", 360 365 "jshttp/mime-db": "1.54.0.1", 361 "phpunit/phpunit": "^8.5. 44 || ^9.6.25"366 "phpunit/phpunit": "^8.5.52 || ^9.6.34" 362 367 }, 363 368 "suggest": { … … 430 435 "support": { 431 436 "issues": "https://github.com/guzzle/psr7/issues", 432 "source": "https://github.com/guzzle/psr7/tree/2. 9.0"437 "source": "https://github.com/guzzle/psr7/tree/2.11.0" 433 438 }, 434 439 "funding": [ … … 446 451 } 447 452 ], 448 "time": "2026-0 3-10T16:41:02+00:00"453 "time": "2026-06-02T12:30:48+00:00" 449 454 }, 450 455 { … … 710 715 "type": "git", 711 716 "url": "git@gitlab.siteground.com:wordpress/siteground-helper.git", 712 "reference": " 5601ba384a643e54359b8249e2be591e90161a7d"717 "reference": "1766f2fe043a0b4f3ce42bae0dcd3d7e50754b86" 713 718 }, 714 719 "default-branch": true, … … 724 729 "description": "Helper package used for Siteground wordpress plugins", 725 730 "homepage": "https://github.com/SiteGround/siteground-i18n", 726 "time": "202 3-09-07T11:49:29+00:00"731 "time": "2026-06-02T10:22:53+00:00" 727 732 }, 728 733 { … … 809 814 ], 810 815 "time": "2024-09-25T14:11:13+00:00" 811 }812 ],813 "packages-dev": [814 {815 "name": "brianhenryie/simple-php-code-parser",816 "version": "0.15.5",817 "source": {818 "type": "git",819 "url": "https://github.com/BrianHenryIE/Simple-PHP-Code-Parser.git",820 "reference": "60e50b128697ffee4efdac9881bbbbdb0722e256"821 },822 "dist": {823 "type": "zip",824 "url": "https://api.github.com/repos/BrianHenryIE/Simple-PHP-Code-Parser/zipball/60e50b128697ffee4efdac9881bbbbdb0722e256",825 "reference": "60e50b128697ffee4efdac9881bbbbdb0722e256",826 "shasum": ""827 },828 "require": {829 "nikic/php-parser": "^4.18 || ^5",830 "php": ">=7.4",831 "phpdocumentor/reflection-common": "~2.2",832 "phpdocumentor/reflection-docblock": "~5.3",833 "phpdocumentor/type-resolver": "~1.7.2",834 "phpstan/phpdoc-parser": "~1.23",835 "voku/simple-cache": "^4.1|^5"836 },837 "require-dev": {838 "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0"839 },840 "type": "library",841 "autoload": {842 "psr-4": {843 "BrianHenryIE\\SimplePhpParser\\": "src"844 }845 },846 "notification-url": "https://packagist.org/downloads/",847 "license": [848 "Apache-2.0"849 ],850 "authors": [851 {852 "name": "Lars Moelleken",853 "homepage": "https://www.moelleken.org/"854 },855 {856 "name": "Brian Henry",857 "homepage": "https://BrianHenry.ie"858 }859 ],860 "description": "Get a simple data structure from your php code.",861 "homepage": "https://github.com/BrianHenryIE/Simple-PHP-Code-Parser",862 "keywords": [863 "parser",864 "php",865 "phpdoc"866 ],867 "support": {868 "source": "https://github.com/BrianHenryIE/Simple-PHP-Code-Parser/tree/0.15.5"869 },870 "funding": [871 {872 "url": "https://www.paypal.me/moelleken",873 "type": "custom"874 },875 {876 "url": "https://github.com/voku",877 "type": "github"878 },879 {880 "url": "https://www.patreon.com/voku",881 "type": "patreon"882 }883 ],884 "time": "2026-04-22T21:31:34+00:00"885 },886 {887 "name": "brianhenryie/strauss",888 "version": "0.27.3",889 "source": {890 "type": "git",891 "url": "https://github.com/BrianHenryIE/strauss.git",892 "reference": "26a8fdb5dee0d747247471023832af522d3082f1"893 },894 "dist": {895 "type": "zip",896 "url": "https://api.github.com/repos/BrianHenryIE/strauss/zipball/26a8fdb5dee0d747247471023832af522d3082f1",897 "reference": "26a8fdb5dee0d747247471023832af522d3082f1",898 "shasum": ""899 },900 "require": {901 "brianhenryie/simple-php-code-parser": "^0.15.3",902 "composer-runtime-api": "^2.0",903 "composer/class-map-generator": "^1.6.0",904 "composer/composer": "^2.10",905 "elazar/flystream": "^0.5.0|^1",906 "ext-json": "*",907 "json-mapper/json-mapper": "^2.0.0",908 "league/flysystem": "^2.1|^3.0",909 "league/flysystem-memory": "*",910 "monolog/monolog": "^2.10",911 "nikic/php-parser": "^5.4.0",912 "symfony/console": "^4|^5|^6|^7",913 "symfony/finder": "^4|^5|^6|^7"914 },915 "conflict": {916 "json-mapper/json-mapper": "2.23.0 | 2.24.0"917 },918 "replace": {919 "coenjacobs/mozart": "*"920 },921 "require-dev": {922 "brianhenryie/color-logger": "*",923 "brianhenryie/php-codecoverage-markdown": "^0.1.0",924 "clue/phar-composer": "^1.4",925 "jaschilz/php-coverage-badger": "^2.0",926 "mockery/mockery": "^1.6",927 "php": "^7.4|^8.0",928 "phpstan/extension-installer": "^1.4",929 "phpstan/phpstan": "^1.10",930 "phpstan/phpstan-mockery": "^1.1",931 "phpunit/phpcov": "*",932 "phpunit/phpunit": "^9|^10",933 "squizlabs/php_codesniffer": "^3.5"934 },935 "bin": [936 "bin/strauss"937 ],938 "type": "library",939 "autoload": {940 "files": [941 "bootstrap.php"942 ],943 "psr-4": {944 "BrianHenryIE\\Strauss\\": "src/"945 }946 },947 "notification-url": "https://packagist.org/downloads/",948 "license": [949 "MIT"950 ],951 "authors": [952 {953 "name": "Brian Henry",954 "email": "BrianHenryIE@gmail.com"955 },956 {957 "name": "Coen Jacobs",958 "email": "coenjacobs@gmail.com"959 }960 ],961 "description": "Prefixes dependencies namespaces so they are unique to your plugin",962 "support": {963 "issues": "https://github.com/BrianHenryIE/strauss/issues",964 "source": "https://github.com/BrianHenryIE/strauss/tree/0.27.3"965 },966 "time": "2026-06-02T21:45:32+00:00"967 },968 {969 "name": "composer/ca-bundle",970 "version": "1.5.12",971 "source": {972 "type": "git",973 "url": "https://github.com/composer/ca-bundle.git",974 "reference": "00a2f4201641d5c53f7fc0195e6c8d9fcc321a78"975 },976 "dist": {977 "type": "zip",978 "url": "https://api.github.com/repos/composer/ca-bundle/zipball/00a2f4201641d5c53f7fc0195e6c8d9fcc321a78",979 "reference": "00a2f4201641d5c53f7fc0195e6c8d9fcc321a78",980 "shasum": ""981 },982 "require": {983 "ext-openssl": "*",984 "ext-pcre": "*",985 "php": "^7.2 || ^8.0"986 },987 "require-dev": {988 "phpstan/phpstan": "^1.10",989 "phpunit/phpunit": "^8 || ^9",990 "psr/log": "^1.0 || ^2.0 || ^3.0",991 "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0"992 },993 "type": "library",994 "extra": {995 "branch-alias": {996 "dev-main": "1.x-dev"997 }998 },999 "autoload": {1000 "psr-4": {1001 "Composer\\CaBundle\\": "src"1002 }1003 },1004 "notification-url": "https://packagist.org/downloads/",1005 "license": [1006 "MIT"1007 ],1008 "authors": [1009 {1010 "name": "Jordi Boggiano",1011 "email": "j.boggiano@seld.be",1012 "homepage": "http://seld.be"1013 }1014 ],1015 "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",1016 "keywords": [1017 "cabundle",1018 "cacert",1019 "certificate",1020 "ssl",1021 "tls"1022 ],1023 "support": {1024 "irc": "irc://irc.freenode.org/composer",1025 "issues": "https://github.com/composer/ca-bundle/issues",1026 "source": "https://github.com/composer/ca-bundle/tree/1.5.12"1027 },1028 "funding": [1029 {1030 "url": "https://packagist.com",1031 "type": "custom"1032 },1033 {1034 "url": "https://github.com/composer",1035 "type": "github"1036 }1037 ],1038 "time": "2026-05-19T11:26:22+00:00"1039 },1040 {1041 "name": "composer/class-map-generator",1042 "version": "1.7.3",1043 "source": {1044 "type": "git",1045 "url": "https://github.com/composer/class-map-generator.git",1046 "reference": "86d8208fc3c649a3a999daf1a63c25201be2990f"1047 },1048 "dist": {1049 "type": "zip",1050 "url": "https://api.github.com/repos/composer/class-map-generator/zipball/86d8208fc3c649a3a999daf1a63c25201be2990f",1051 "reference": "86d8208fc3c649a3a999daf1a63c25201be2990f",1052 "shasum": ""1053 },1054 "require": {1055 "composer/pcre": "^2.1 || ^3.1",1056 "php": "^7.2 || ^8.0",1057 "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7 || ^8"1058 },1059 "require-dev": {1060 "phpstan/phpstan": "^1.12 || ^2",1061 "phpstan/phpstan-deprecation-rules": "^1 || ^2",1062 "phpstan/phpstan-phpunit": "^1 || ^2",1063 "phpstan/phpstan-strict-rules": "^1.1 || ^2",1064 "phpunit/phpunit": "^8",1065 "symfony/filesystem": "^5.4 || ^6 || ^7 || ^8"1066 },1067 "type": "library",1068 "extra": {1069 "branch-alias": {1070 "dev-main": "1.x-dev"1071 }1072 },1073 "autoload": {1074 "psr-4": {1075 "Composer\\ClassMapGenerator\\": "src"1076 }1077 },1078 "notification-url": "https://packagist.org/downloads/",1079 "license": [1080 "MIT"1081 ],1082 "authors": [1083 {1084 "name": "Jordi Boggiano",1085 "email": "j.boggiano@seld.be",1086 "homepage": "https://seld.be"1087 }1088 ],1089 "description": "Utilities to scan PHP code and generate class maps.",1090 "keywords": [1091 "classmap"1092 ],1093 "support": {1094 "issues": "https://github.com/composer/class-map-generator/issues",1095 "source": "https://github.com/composer/class-map-generator/tree/1.7.3"1096 },1097 "funding": [1098 {1099 "url": "https://packagist.com",1100 "type": "custom"1101 },1102 {1103 "url": "https://github.com/composer",1104 "type": "github"1105 }1106 ],1107 "time": "2026-05-05T09:17:07+00:00"1108 },1109 {1110 "name": "composer/composer",1111 "version": "2.10.1",1112 "source": {1113 "type": "git",1114 "url": "https://github.com/composer/composer.git",1115 "reference": "4120703b9bda8795075047b40361d7ec4d2abe49"1116 },1117 "dist": {1118 "type": "zip",1119 "url": "https://api.github.com/repos/composer/composer/zipball/4120703b9bda8795075047b40361d7ec4d2abe49",1120 "reference": "4120703b9bda8795075047b40361d7ec4d2abe49",1121 "shasum": ""1122 },1123 "require": {1124 "composer/ca-bundle": "^1.5",1125 "composer/class-map-generator": "^1.4.0",1126 "composer/metadata-minifier": "^1.0",1127 "composer/pcre": "^2.3 || ^3.3",1128 "composer/semver": "^3.3",1129 "composer/spdx-licenses": "^1.5.7",1130 "composer/xdebug-handler": "^2.0.2 || ^3.0.3",1131 "ext-json": "*",1132 "justinrainbow/json-schema": "^6.5.1",1133 "php": "^7.2.5 || ^8.0",1134 "psr/log": "^1.0 || ^2.0 || ^3.0",1135 "react/promise": "^3.3",1136 "seld/jsonlint": "^1.4",1137 "seld/phar-utils": "^1.2",1138 "seld/signal-handler": "^2.0",1139 "symfony/console": "^5.4.47 || ^6.4.25 || ^7.1.10 || ^8.0",1140 "symfony/filesystem": "^5.4.45 || ^6.4.24 || ^7.1.10 || ^8.0",1141 "symfony/finder": "^5.4.45 || ^6.4.24 || ^7.1.10 || ^8.0",1142 "symfony/polyfill-php73": "^1.24",1143 "symfony/polyfill-php80": "^1.24",1144 "symfony/polyfill-php81": "^1.24",1145 "symfony/polyfill-php84": "^1.30",1146 "symfony/process": "^5.4.47 || ^6.4.25 || ^7.1.10 || ^8.0"1147 },1148 "require-dev": {1149 "phpstan/phpstan": "^1.11.8",1150 "phpstan/phpstan-deprecation-rules": "^1.2.0",1151 "phpstan/phpstan-phpunit": "^1.4.0",1152 "phpstan/phpstan-strict-rules": "^1.6.0",1153 "phpstan/phpstan-symfony": "^1.4.0",1154 "symfony/phpunit-bridge": "^6.4.25 || ^7.3.3 || ^8.0"1155 },1156 "suggest": {1157 "ext-curl": "Provides HTTP support (will fallback to PHP streams if missing)",1158 "ext-openssl": "Enables access to repositories and packages over HTTPS",1159 "ext-zip": "Allows direct extraction of ZIP archives (unzip/7z binaries will be used instead if available)",1160 "ext-zlib": "Enables gzip for HTTP requests"1161 },1162 "bin": [1163 "bin/composer"1164 ],1165 "type": "library",1166 "extra": {1167 "phpstan": {1168 "includes": [1169 "phpstan/rules.neon"1170 ]1171 },1172 "branch-alias": {1173 "dev-main": "2.10-dev"1174 }1175 },1176 "autoload": {1177 "psr-4": {1178 "Composer\\": "src/Composer/"1179 }1180 },1181 "notification-url": "https://packagist.org/downloads/",1182 "license": [1183 "MIT"1184 ],1185 "authors": [1186 {1187 "name": "Nils Adermann",1188 "email": "naderman@naderman.de",1189 "homepage": "https://www.naderman.de"1190 },1191 {1192 "name": "Jordi Boggiano",1193 "email": "j.boggiano@seld.be",1194 "homepage": "https://seld.be"1195 }1196 ],1197 "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.",1198 "homepage": "https://getcomposer.org/",1199 "keywords": [1200 "autoload",1201 "dependency",1202 "package"1203 ],1204 "support": {1205 "irc": "ircs://irc.libera.chat:6697/composer",1206 "issues": "https://github.com/composer/composer/issues",1207 "security": "https://github.com/composer/composer/security/policy",1208 "source": "https://github.com/composer/composer/tree/2.10.1"1209 },1210 "funding": [1211 {1212 "url": "https://packagist.com",1213 "type": "custom"1214 },1215 {1216 "url": "https://github.com/composer",1217 "type": "github"1218 }1219 ],1220 "time": "2026-06-04T08:25:59+00:00"1221 },1222 {1223 "name": "composer/metadata-minifier",1224 "version": "1.0.0",1225 "source": {1226 "type": "git",1227 "url": "https://github.com/composer/metadata-minifier.git",1228 "reference": "c549d23829536f0d0e984aaabbf02af91f443207"1229 },1230 "dist": {1231 "type": "zip",1232 "url": "https://api.github.com/repos/composer/metadata-minifier/zipball/c549d23829536f0d0e984aaabbf02af91f443207",1233 "reference": "c549d23829536f0d0e984aaabbf02af91f443207",1234 "shasum": ""1235 },1236 "require": {1237 "php": "^5.3.2 || ^7.0 || ^8.0"1238 },1239 "require-dev": {1240 "composer/composer": "^2",1241 "phpstan/phpstan": "^0.12.55",1242 "symfony/phpunit-bridge": "^4.2 || ^5"1243 },1244 "type": "library",1245 "extra": {1246 "branch-alias": {1247 "dev-main": "1.x-dev"1248 }1249 },1250 "autoload": {1251 "psr-4": {1252 "Composer\\MetadataMinifier\\": "src"1253 }1254 },1255 "notification-url": "https://packagist.org/downloads/",1256 "license": [1257 "MIT"1258 ],1259 "authors": [1260 {1261 "name": "Jordi Boggiano",1262 "email": "j.boggiano@seld.be",1263 "homepage": "http://seld.be"1264 }1265 ],1266 "description": "Small utility library that handles metadata minification and expansion.",1267 "keywords": [1268 "composer",1269 "compression"1270 ],1271 "support": {1272 "issues": "https://github.com/composer/metadata-minifier/issues",1273 "source": "https://github.com/composer/metadata-minifier/tree/1.0.0"1274 },1275 "funding": [1276 {1277 "url": "https://packagist.com",1278 "type": "custom"1279 },1280 {1281 "url": "https://github.com/composer",1282 "type": "github"1283 },1284 {1285 "url": "https://tidelift.com/funding/github/packagist/composer/composer",1286 "type": "tidelift"1287 }1288 ],1289 "time": "2021-04-07T13:37:33+00:00"1290 },1291 {1292 "name": "composer/pcre",1293 "version": "3.3.2",1294 "source": {1295 "type": "git",1296 "url": "https://github.com/composer/pcre.git",1297 "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e"1298 },1299 "dist": {1300 "type": "zip",1301 "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e",1302 "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e",1303 "shasum": ""1304 },1305 "require": {1306 "php": "^7.4 || ^8.0"1307 },1308 "conflict": {1309 "phpstan/phpstan": "<1.11.10"1310 },1311 "require-dev": {1312 "phpstan/phpstan": "^1.12 || ^2",1313 "phpstan/phpstan-strict-rules": "^1 || ^2",1314 "phpunit/phpunit": "^8 || ^9"1315 },1316 "type": "library",1317 "extra": {1318 "phpstan": {1319 "includes": [1320 "extension.neon"1321 ]1322 },1323 "branch-alias": {1324 "dev-main": "3.x-dev"1325 }1326 },1327 "autoload": {1328 "psr-4": {1329 "Composer\\Pcre\\": "src"1330 }1331 },1332 "notification-url": "https://packagist.org/downloads/",1333 "license": [1334 "MIT"1335 ],1336 "authors": [1337 {1338 "name": "Jordi Boggiano",1339 "email": "j.boggiano@seld.be",1340 "homepage": "http://seld.be"1341 }1342 ],1343 "description": "PCRE wrapping library that offers type-safe preg_* replacements.",1344 "keywords": [1345 "PCRE",1346 "preg",1347 "regex",1348 "regular expression"1349 ],1350 "support": {1351 "issues": "https://github.com/composer/pcre/issues",1352 "source": "https://github.com/composer/pcre/tree/3.3.2"1353 },1354 "funding": [1355 {1356 "url": "https://packagist.com",1357 "type": "custom"1358 },1359 {1360 "url": "https://github.com/composer",1361 "type": "github"1362 },1363 {1364 "url": "https://tidelift.com/funding/github/packagist/composer/composer",1365 "type": "tidelift"1366 }1367 ],1368 "time": "2024-11-12T16:29:46+00:00"1369 },1370 {1371 "name": "composer/semver",1372 "version": "3.4.4",1373 "source": {1374 "type": "git",1375 "url": "https://github.com/composer/semver.git",1376 "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95"1377 },1378 "dist": {1379 "type": "zip",1380 "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95",1381 "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95",1382 "shasum": ""1383 },1384 "require": {1385 "php": "^5.3.2 || ^7.0 || ^8.0"1386 },1387 "require-dev": {1388 "phpstan/phpstan": "^1.11",1389 "symfony/phpunit-bridge": "^3 || ^7"1390 },1391 "type": "library",1392 "extra": {1393 "branch-alias": {1394 "dev-main": "3.x-dev"1395 }1396 },1397 "autoload": {1398 "psr-4": {1399 "Composer\\Semver\\": "src"1400 }1401 },1402 "notification-url": "https://packagist.org/downloads/",1403 "license": [1404 "MIT"1405 ],1406 "authors": [1407 {1408 "name": "Nils Adermann",1409 "email": "naderman@naderman.de",1410 "homepage": "http://www.naderman.de"1411 },1412 {1413 "name": "Jordi Boggiano",1414 "email": "j.boggiano@seld.be",1415 "homepage": "http://seld.be"1416 },1417 {1418 "name": "Rob Bast",1419 "email": "rob.bast@gmail.com",1420 "homepage": "http://robbast.nl"1421 }1422 ],1423 "description": "Semver library that offers utilities, version constraint parsing and validation.",1424 "keywords": [1425 "semantic",1426 "semver",1427 "validation",1428 "versioning"1429 ],1430 "support": {1431 "irc": "ircs://irc.libera.chat:6697/composer",1432 "issues": "https://github.com/composer/semver/issues",1433 "source": "https://github.com/composer/semver/tree/3.4.4"1434 },1435 "funding": [1436 {1437 "url": "https://packagist.com",1438 "type": "custom"1439 },1440 {1441 "url": "https://github.com/composer",1442 "type": "github"1443 }1444 ],1445 "time": "2025-08-20T19:15:30+00:00"1446 },1447 {1448 "name": "composer/spdx-licenses",1449 "version": "1.6.0",1450 "source": {1451 "type": "git",1452 "url": "https://github.com/composer/spdx-licenses.git",1453 "reference": "5ecd0cb4177696f9fd48f1605dda81db3dee7889"1454 },1455 "dist": {1456 "type": "zip",1457 "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/5ecd0cb4177696f9fd48f1605dda81db3dee7889",1458 "reference": "5ecd0cb4177696f9fd48f1605dda81db3dee7889",1459 "shasum": ""1460 },1461 "require": {1462 "php": "^7.2 || ^8.0"1463 },1464 "require-dev": {1465 "phpstan/phpstan": "^1.11",1466 "symfony/phpunit-bridge": "^6.4.25 || ^7.3.3 || ^8.0"1467 },1468 "type": "library",1469 "extra": {1470 "branch-alias": {1471 "dev-main": "1.x-dev"1472 }1473 },1474 "autoload": {1475 "psr-4": {1476 "Composer\\Spdx\\": "src"1477 }1478 },1479 "notification-url": "https://packagist.org/downloads/",1480 "license": [1481 "MIT"1482 ],1483 "authors": [1484 {1485 "name": "Nils Adermann",1486 "email": "naderman@naderman.de",1487 "homepage": "http://www.naderman.de"1488 },1489 {1490 "name": "Jordi Boggiano",1491 "email": "j.boggiano@seld.be",1492 "homepage": "http://seld.be"1493 },1494 {1495 "name": "Rob Bast",1496 "email": "rob.bast@gmail.com",1497 "homepage": "http://robbast.nl"1498 }1499 ],1500 "description": "SPDX licenses list and validation library.",1501 "keywords": [1502 "license",1503 "spdx",1504 "validator"1505 ],1506 "support": {1507 "irc": "ircs://irc.libera.chat:6697/composer",1508 "issues": "https://github.com/composer/spdx-licenses/issues",1509 "source": "https://github.com/composer/spdx-licenses/tree/1.6.0"1510 },1511 "funding": [1512 {1513 "url": "https://packagist.com",1514 "type": "custom"1515 },1516 {1517 "url": "https://github.com/composer",1518 "type": "github"1519 }1520 ],1521 "time": "2026-04-08T20:18:39+00:00"1522 },1523 {1524 "name": "composer/xdebug-handler",1525 "version": "3.0.5",1526 "source": {1527 "type": "git",1528 "url": "https://github.com/composer/xdebug-handler.git",1529 "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef"1530 },1531 "dist": {1532 "type": "zip",1533 "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef",1534 "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef",1535 "shasum": ""1536 },1537 "require": {1538 "composer/pcre": "^1 || ^2 || ^3",1539 "php": "^7.2.5 || ^8.0",1540 "psr/log": "^1 || ^2 || ^3"1541 },1542 "require-dev": {1543 "phpstan/phpstan": "^1.0",1544 "phpstan/phpstan-strict-rules": "^1.1",1545 "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5"1546 },1547 "type": "library",1548 "autoload": {1549 "psr-4": {1550 "Composer\\XdebugHandler\\": "src"1551 }1552 },1553 "notification-url": "https://packagist.org/downloads/",1554 "license": [1555 "MIT"1556 ],1557 "authors": [1558 {1559 "name": "John Stevenson",1560 "email": "john-stevenson@blueyonder.co.uk"1561 }1562 ],1563 "description": "Restarts a process without Xdebug.",1564 "keywords": [1565 "Xdebug",1566 "performance"1567 ],1568 "support": {1569 "irc": "ircs://irc.libera.chat:6697/composer",1570 "issues": "https://github.com/composer/xdebug-handler/issues",1571 "source": "https://github.com/composer/xdebug-handler/tree/3.0.5"1572 },1573 "funding": [1574 {1575 "url": "https://packagist.com",1576 "type": "custom"1577 },1578 {1579 "url": "https://github.com/composer",1580 "type": "github"1581 },1582 {1583 "url": "https://tidelift.com/funding/github/packagist/composer/composer",1584 "type": "tidelift"1585 }1586 ],1587 "time": "2024-05-06T16:37:16+00:00"1588 },1589 {1590 "name": "doctrine/deprecations",1591 "version": "1.1.6",1592 "source": {1593 "type": "git",1594 "url": "https://github.com/doctrine/deprecations.git",1595 "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca"1596 },1597 "dist": {1598 "type": "zip",1599 "url": "https://api.github.com/repos/doctrine/deprecations/zipball/d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca",1600 "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca",1601 "shasum": ""1602 },1603 "require": {1604 "php": "^7.1 || ^8.0"1605 },1606 "conflict": {1607 "phpunit/phpunit": "<=7.5 || >=14"1608 },1609 "require-dev": {1610 "doctrine/coding-standard": "^9 || ^12 || ^14",1611 "phpstan/phpstan": "1.4.10 || 2.1.30",1612 "phpstan/phpstan-phpunit": "^1.0 || ^2",1613 "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12.4 || ^13.0",1614 "psr/log": "^1 || ^2 || ^3"1615 },1616 "suggest": {1617 "psr/log": "Allows logging deprecations via PSR-3 logger implementation"1618 },1619 "type": "library",1620 "autoload": {1621 "psr-4": {1622 "Doctrine\\Deprecations\\": "src"1623 }1624 },1625 "notification-url": "https://packagist.org/downloads/",1626 "license": [1627 "MIT"1628 ],1629 "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.",1630 "homepage": "https://www.doctrine-project.org/",1631 "support": {1632 "issues": "https://github.com/doctrine/deprecations/issues",1633 "source": "https://github.com/doctrine/deprecations/tree/1.1.6"1634 },1635 "time": "2026-02-07T07:09:04+00:00"1636 },1637 {1638 "name": "elazar/flystream",1639 "version": "0.5.0",1640 "source": {1641 "type": "git",1642 "url": "https://github.com/elazar/flystream.git",1643 "reference": "795026ac724e5b8fe827696497aff12e7935311c"1644 },1645 "dist": {1646 "type": "zip",1647 "url": "https://api.github.com/repos/elazar/flystream/zipball/795026ac724e5b8fe827696497aff12e7935311c",1648 "reference": "795026ac724e5b8fe827696497aff12e7935311c",1649 "shasum": ""1650 },1651 "require": {1652 "league/flysystem": "^2.1 || ^3.0",1653 "php": ">=7.4",1654 "pimple/pimple": "^3.4",1655 "psr/log": "^1"1656 },1657 "require-dev": {1658 "friendsofphp/php-cs-fixer": "^3.0",1659 "league/flysystem-memory": "^2.0 || ^3.0",1660 "mockery/mockery": "^1.4",1661 "monolog/monolog": "^2.3",1662 "pestphp/pest": "^1.9"1663 },1664 "type": "library",1665 "autoload": {1666 "psr-4": {1667 "Elazar\\Flystream\\": "src/"1668 }1669 },1670 "notification-url": "https://packagist.org/downloads/",1671 "license": [1672 "MIT"1673 ],1674 "authors": [1675 {1676 "name": "Matthew Turland",1677 "email": "me@matthewturland.com"1678 }1679 ],1680 "description": "PHP stream wrapper for Flysystem v2",1681 "support": {1682 "issues": "https://github.com/elazar/flystream/issues",1683 "source": "https://github.com/elazar/flystream/tree/0.5.0"1684 },1685 "time": "2025-02-15T00:35:13+00:00"1686 },1687 {1688 "name": "json-mapper/json-mapper",1689 "version": "2.25.1",1690 "source": {1691 "type": "git",1692 "url": "https://github.com/JsonMapper/JsonMapper.git",1693 "reference": "4fd6cb5ccfece349ed1aeb52c818bdf84ba75b61"1694 },1695 "dist": {1696 "type": "zip",1697 "url": "https://api.github.com/repos/JsonMapper/JsonMapper/zipball/4fd6cb5ccfece349ed1aeb52c818bdf84ba75b61",1698 "reference": "4fd6cb5ccfece349ed1aeb52c818bdf84ba75b61",1699 "shasum": ""1700 },1701 "require": {1702 "ext-json": "*",1703 "myclabs/php-enum": "^1.7",1704 "nikic/php-parser": "^4.13 || ^5.0",1705 "php": "^7.4 || ^8.0",1706 "phpdocumentor/reflection-docblock": "^5.6",1707 "psr/log": "^1.1 || ^2.0 || ^3.0",1708 "psr/simple-cache": " ^1.0 || ^2.0 || ^3.0",1709 "symfony/cache": "^4.4 || ^5.0 || ^6.0 || ^7.0",1710 "symfony/polyfill-php73": "^1.18"1711 },1712 "require-dev": {1713 "guzzlehttp/guzzle": "^6.5 || ^7.0",1714 "php-coveralls/php-coveralls": "^2.4",1715 "phpstan/phpstan": "^0.12.14",1716 "phpstan/phpstan-phpunit": "^0.12.17",1717 "phpunit/phpunit": "^7.5 || ^8.5 || ^9.0",1718 "squizlabs/php_codesniffer": "^3.5",1719 "symfony/console": "^2.1 || ^3.0 || ^4.0 || ^5.0",1720 "vimeo/psalm": "^4.10 || ^5.0"1721 },1722 "suggest": {1723 "json-mapper/laravel-package": "Use JsonMapper directly with Laravel",1724 "json-mapper/symfony-bundle": "Use JsonMapper directly with Symfony"1725 },1726 "type": "library",1727 "autoload": {1728 "psr-4": {1729 "JsonMapper\\": "src/"1730 }1731 },1732 "notification-url": "https://packagist.org/downloads/",1733 "license": [1734 "MIT"1735 ],1736 "description": "Map JSON structures to PHP classes",1737 "homepage": "https://jsonmapper.net",1738 "keywords": [1739 "json",1740 "jsonmapper",1741 "mapper",1742 "middleware"1743 ],1744 "support": {1745 "docs": "https://jsonmapper.net",1746 "issues": "https://github.com/JsonMapper/JsonMapper/issues",1747 "source": "https://github.com/JsonMapper/JsonMapper"1748 },1749 "funding": [1750 {1751 "url": "https://github.com/DannyvdSluijs",1752 "type": "github"1753 }1754 ],1755 "time": "2025-05-26T09:51:24+00:00"1756 },1757 {1758 "name": "justinrainbow/json-schema",1759 "version": "6.8.2",1760 "source": {1761 "type": "git",1762 "url": "https://github.com/jsonrainbow/json-schema.git",1763 "reference": "2c89ebb95ca9cedc9347f780333f7b25792dcb76"1764 },1765 "dist": {1766 "type": "zip",1767 "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/2c89ebb95ca9cedc9347f780333f7b25792dcb76",1768 "reference": "2c89ebb95ca9cedc9347f780333f7b25792dcb76",1769 "shasum": ""1770 },1771 "require": {1772 "ext-json": "*",1773 "marc-mabe/php-enum": "^4.4",1774 "php": "^7.2 || ^8.0"1775 },1776 "require-dev": {1777 "friendsofphp/php-cs-fixer": "3.3.0",1778 "json-schema/json-schema-test-suite": "dev-main",1779 "marc-mabe/php-enum-phpstan": "^2.0",1780 "phpspec/prophecy": "^1.19",1781 "phpstan/phpstan": "^1.12",1782 "phpunit/phpunit": "^8.5"1783 },1784 "bin": [1785 "bin/validate-json"1786 ],1787 "type": "library",1788 "extra": {1789 "branch-alias": {1790 "dev-master": "6.x-dev"1791 }1792 },1793 "autoload": {1794 "psr-4": {1795 "JsonSchema\\": "src/JsonSchema/"1796 }1797 },1798 "notification-url": "https://packagist.org/downloads/",1799 "license": [1800 "MIT"1801 ],1802 "authors": [1803 {1804 "name": "Bruno Prieto Reis",1805 "email": "bruno.p.reis@gmail.com"1806 },1807 {1808 "name": "Justin Rainbow",1809 "email": "justin.rainbow@gmail.com"1810 },1811 {1812 "name": "Igor Wiedler",1813 "email": "igor@wiedler.ch"1814 },1815 {1816 "name": "Robert Schönthal",1817 "email": "seroscho@googlemail.com"1818 }1819 ],1820 "description": "A library to validate a json schema.",1821 "homepage": "https://github.com/jsonrainbow/json-schema",1822 "keywords": [1823 "json",1824 "schema"1825 ],1826 "support": {1827 "issues": "https://github.com/jsonrainbow/json-schema/issues",1828 "source": "https://github.com/jsonrainbow/json-schema/tree/6.8.2"1829 },1830 "time": "2026-05-05T05:39:01+00:00"1831 },1832 {1833 "name": "league/flysystem",1834 "version": "2.5.0",1835 "source": {1836 "type": "git",1837 "url": "https://github.com/thephpleague/flysystem.git",1838 "reference": "8aaffb653c5777781b0f7f69a5d937baf7ab6cdb"1839 },1840 "dist": {1841 "type": "zip",1842 "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/8aaffb653c5777781b0f7f69a5d937baf7ab6cdb",1843 "reference": "8aaffb653c5777781b0f7f69a5d937baf7ab6cdb",1844 "shasum": ""1845 },1846 "require": {1847 "ext-json": "*",1848 "league/mime-type-detection": "^1.0.0",1849 "php": "^7.2 || ^8.0"1850 },1851 "conflict": {1852 "guzzlehttp/ringphp": "<1.1.1"1853 },1854 "require-dev": {1855 "async-aws/s3": "^1.5",1856 "async-aws/simple-s3": "^1.0",1857 "aws/aws-sdk-php": "^3.132.4",1858 "composer/semver": "^3.0",1859 "ext-fileinfo": "*",1860 "ext-ftp": "*",1861 "friendsofphp/php-cs-fixer": "^3.2",1862 "google/cloud-storage": "^1.23",1863 "phpseclib/phpseclib": "^2.0",1864 "phpstan/phpstan": "^0.12.26",1865 "phpunit/phpunit": "^8.5 || ^9.4",1866 "sabre/dav": "^4.1"1867 },1868 "type": "library",1869 "autoload": {1870 "psr-4": {1871 "League\\Flysystem\\": "src"1872 }1873 },1874 "notification-url": "https://packagist.org/downloads/",1875 "license": [1876 "MIT"1877 ],1878 "authors": [1879 {1880 "name": "Frank de Jonge",1881 "email": "info@frankdejonge.nl"1882 }1883 ],1884 "description": "File storage abstraction for PHP",1885 "keywords": [1886 "WebDAV",1887 "aws",1888 "cloud",1889 "file",1890 "files",1891 "filesystem",1892 "filesystems",1893 "ftp",1894 "s3",1895 "sftp",1896 "storage"1897 ],1898 "support": {1899 "issues": "https://github.com/thephpleague/flysystem/issues",1900 "source": "https://github.com/thephpleague/flysystem/tree/2.5.0"1901 },1902 "funding": [1903 {1904 "url": "https://ecologi.com/frankdejonge",1905 "type": "custom"1906 },1907 {1908 "url": "https://github.com/frankdejonge",1909 "type": "github"1910 },1911 {1912 "url": "https://tidelift.com/funding/github/packagist/league/flysystem",1913 "type": "tidelift"1914 }1915 ],1916 "time": "2022-09-17T21:02:32+00:00"1917 },1918 {1919 "name": "league/flysystem-memory",1920 "version": "2.0.6",1921 "source": {1922 "type": "git",1923 "url": "https://github.com/thephpleague/flysystem-memory.git",1924 "reference": "f644026c705b8a501543f38cb8b745a603aa4952"1925 },1926 "dist": {1927 "type": "zip",1928 "url": "https://api.github.com/repos/thephpleague/flysystem-memory/zipball/f644026c705b8a501543f38cb8b745a603aa4952",1929 "reference": "f644026c705b8a501543f38cb8b745a603aa4952",1930 "shasum": ""1931 },1932 "require": {1933 "ext-fileinfo": "*",1934 "league/flysystem": "^2.0.0",1935 "php": "^7.2 || ^8.0"1936 },1937 "type": "library",1938 "autoload": {1939 "psr-4": {1940 "League\\Flysystem\\InMemory\\": ""1941 }1942 },1943 "notification-url": "https://packagist.org/downloads/",1944 "license": [1945 "MIT"1946 ],1947 "authors": [1948 {1949 "name": "Frank de Jonge",1950 "email": "info@frankdejonge.nl"1951 }1952 ],1953 "description": "In-memory filesystem adapter for Flysystem.",1954 "keywords": [1955 "Flysystem",1956 "file",1957 "files",1958 "filesystem",1959 "memory"1960 ],1961 "support": {1962 "issues": "https://github.com/thephpleague/flysystem-memory/issues",1963 "source": "https://github.com/thephpleague/flysystem-memory/tree/2.0.6"1964 },1965 "time": "2021-02-12T19:24:17+00:00"1966 },1967 {1968 "name": "league/mime-type-detection",1969 "version": "1.16.0",1970 "source": {1971 "type": "git",1972 "url": "https://github.com/thephpleague/mime-type-detection.git",1973 "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9"1974 },1975 "dist": {1976 "type": "zip",1977 "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9",1978 "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9",1979 "shasum": ""1980 },1981 "require": {1982 "ext-fileinfo": "*",1983 "php": "^7.4 || ^8.0"1984 },1985 "require-dev": {1986 "friendsofphp/php-cs-fixer": "^3.2",1987 "phpstan/phpstan": "^0.12.68",1988 "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0"1989 },1990 "type": "library",1991 "autoload": {1992 "psr-4": {1993 "League\\MimeTypeDetection\\": "src"1994 }1995 },1996 "notification-url": "https://packagist.org/downloads/",1997 "license": [1998 "MIT"1999 ],2000 "authors": [2001 {2002 "name": "Frank de Jonge",2003 "email": "info@frankdejonge.nl"2004 }2005 ],2006 "description": "Mime-type detection for Flysystem",2007 "support": {2008 "issues": "https://github.com/thephpleague/mime-type-detection/issues",2009 "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0"2010 },2011 "funding": [2012 {2013 "url": "https://github.com/frankdejonge",2014 "type": "github"2015 },2016 {2017 "url": "https://tidelift.com/funding/github/packagist/league/flysystem",2018 "type": "tidelift"2019 }2020 ],2021 "time": "2024-09-21T08:32:55+00:00"2022 },2023 {2024 "name": "marc-mabe/php-enum",2025 "version": "v4.7.2",2026 "source": {2027 "type": "git",2028 "url": "https://github.com/marc-mabe/php-enum.git",2029 "reference": "bb426fcdd65c60fb3638ef741e8782508fda7eef"2030 },2031 "dist": {2032 "type": "zip",2033 "url": "https://api.github.com/repos/marc-mabe/php-enum/zipball/bb426fcdd65c60fb3638ef741e8782508fda7eef",2034 "reference": "bb426fcdd65c60fb3638ef741e8782508fda7eef",2035 "shasum": ""2036 },2037 "require": {2038 "ext-reflection": "*",2039 "php": "^7.1 | ^8.0"2040 },2041 "require-dev": {2042 "phpbench/phpbench": "^0.16.10 || ^1.0.4",2043 "phpstan/phpstan": "^1.3.1",2044 "phpunit/phpunit": "^7.5.20 | ^8.5.22 | ^9.5.11",2045 "vimeo/psalm": "^4.17.0 | ^5.26.1"2046 },2047 "type": "library",2048 "extra": {2049 "branch-alias": {2050 "dev-3.x": "3.2-dev",2051 "dev-master": "4.7-dev"2052 }2053 },2054 "autoload": {2055 "psr-4": {2056 "MabeEnum\\": "src/"2057 },2058 "classmap": [2059 "stubs/Stringable.php"2060 ]2061 },2062 "notification-url": "https://packagist.org/downloads/",2063 "license": [2064 "BSD-3-Clause"2065 ],2066 "authors": [2067 {2068 "name": "Marc Bennewitz",2069 "email": "dev@mabe.berlin",2070 "homepage": "https://mabe.berlin/",2071 "role": "Lead"2072 }2073 ],2074 "description": "Simple and fast implementation of enumerations with native PHP",2075 "homepage": "https://github.com/marc-mabe/php-enum",2076 "keywords": [2077 "enum",2078 "enum-map",2079 "enum-set",2080 "enumeration",2081 "enumerator",2082 "enummap",2083 "enumset",2084 "map",2085 "set",2086 "type",2087 "type-hint",2088 "typehint"2089 ],2090 "support": {2091 "issues": "https://github.com/marc-mabe/php-enum/issues",2092 "source": "https://github.com/marc-mabe/php-enum/tree/v4.7.2"2093 },2094 "time": "2025-09-14T11:18:39+00:00"2095 },2096 {2097 "name": "monolog/monolog",2098 "version": "2.11.0",2099 "source": {2100 "type": "git",2101 "url": "https://github.com/Seldaek/monolog.git",2102 "reference": "37308608e599f34a1a4845b16440047ec98a172a"2103 },2104 "dist": {2105 "type": "zip",2106 "url": "https://api.github.com/repos/Seldaek/monolog/zipball/37308608e599f34a1a4845b16440047ec98a172a",2107 "reference": "37308608e599f34a1a4845b16440047ec98a172a",2108 "shasum": ""2109 },2110 "require": {2111 "php": ">=7.2",2112 "psr/log": "^1.0.1 || ^2.0 || ^3.0"2113 },2114 "provide": {2115 "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0"2116 },2117 "require-dev": {2118 "aws/aws-sdk-php": "^2.4.9 || ^3.0",2119 "doctrine/couchdb": "~1.0@dev",2120 "elasticsearch/elasticsearch": "^7 || ^8",2121 "ext-json": "*",2122 "graylog2/gelf-php": "^1.4.2 || ^2@dev",2123 "guzzlehttp/guzzle": "^7.4",2124 "guzzlehttp/psr7": "^2.2",2125 "mongodb/mongodb": "^1.8 || ^2.0",2126 "php-amqplib/php-amqplib": "~2.4 || ^3",2127 "phpspec/prophecy": "^1.15",2128 "phpstan/phpstan": "^1.10",2129 "phpunit/phpunit": "^8.5.38 || ^9.6.19",2130 "predis/predis": "^1.1 || ^2.0",2131 "rollbar/rollbar": "^1.3 || ^2 || ^3",2132 "ruflin/elastica": "^7",2133 "swiftmailer/swiftmailer": "^5.3|^6.0",2134 "symfony/mailer": "^5.4 || ^6",2135 "symfony/mime": "^5.4 || ^6"2136 },2137 "suggest": {2138 "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",2139 "doctrine/couchdb": "Allow sending log messages to a CouchDB server",2140 "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client",2141 "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",2142 "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler",2143 "ext-mbstring": "Allow to work properly with unicode symbols",2144 "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)",2145 "ext-openssl": "Required to send log messages using SSL",2146 "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)",2147 "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",2148 "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)",2149 "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",2150 "rollbar/rollbar": "Allow sending log messages to Rollbar",2151 "ruflin/elastica": "Allow sending log messages to an Elastic Search server"2152 },2153 "type": "library",2154 "extra": {2155 "branch-alias": {2156 "dev-main": "2.x-dev"2157 }2158 },2159 "autoload": {2160 "psr-4": {2161 "Monolog\\": "src/Monolog"2162 }2163 },2164 "notification-url": "https://packagist.org/downloads/",2165 "license": [2166 "MIT"2167 ],2168 "authors": [2169 {2170 "name": "Jordi Boggiano",2171 "email": "j.boggiano@seld.be",2172 "homepage": "https://seld.be"2173 }2174 ],2175 "description": "Sends your logs to files, sockets, inboxes, databases and various web services",2176 "homepage": "https://github.com/Seldaek/monolog",2177 "keywords": [2178 "log",2179 "logging",2180 "psr-3"2181 ],2182 "support": {2183 "issues": "https://github.com/Seldaek/monolog/issues",2184 "source": "https://github.com/Seldaek/monolog/tree/2.11.0"2185 },2186 "funding": [2187 {2188 "url": "https://github.com/Seldaek",2189 "type": "github"2190 },2191 {2192 "url": "https://tidelift.com/funding/github/packagist/monolog/monolog",2193 "type": "tidelift"2194 }2195 ],2196 "time": "2026-01-01T13:05:00+00:00"2197 },2198 {2199 "name": "myclabs/php-enum",2200 "version": "1.8.5",2201 "source": {2202 "type": "git",2203 "url": "https://github.com/myclabs/php-enum.git",2204 "reference": "e7be26966b7398204a234f8673fdad5ac6277802"2205 },2206 "dist": {2207 "type": "zip",2208 "url": "https://api.github.com/repos/myclabs/php-enum/zipball/e7be26966b7398204a234f8673fdad5ac6277802",2209 "reference": "e7be26966b7398204a234f8673fdad5ac6277802",2210 "shasum": ""2211 },2212 "require": {2213 "ext-json": "*",2214 "php": "^7.3 || ^8.0"2215 },2216 "require-dev": {2217 "phpunit/phpunit": "^9.5",2218 "squizlabs/php_codesniffer": "1.*",2219 "vimeo/psalm": "^4.6.2 || ^5.2"2220 },2221 "type": "library",2222 "autoload": {2223 "psr-4": {2224 "MyCLabs\\Enum\\": "src/"2225 },2226 "classmap": [2227 "stubs/Stringable.php"2228 ]2229 },2230 "notification-url": "https://packagist.org/downloads/",2231 "license": [2232 "MIT"2233 ],2234 "authors": [2235 {2236 "name": "PHP Enum contributors",2237 "homepage": "https://github.com/myclabs/php-enum/graphs/contributors"2238 }2239 ],2240 "description": "PHP Enum implementation",2241 "homepage": "https://github.com/myclabs/php-enum",2242 "keywords": [2243 "enum"2244 ],2245 "support": {2246 "issues": "https://github.com/myclabs/php-enum/issues",2247 "source": "https://github.com/myclabs/php-enum/tree/1.8.5"2248 },2249 "funding": [2250 {2251 "url": "https://github.com/mnapoli",2252 "type": "github"2253 },2254 {2255 "url": "https://tidelift.com/funding/github/packagist/myclabs/php-enum",2256 "type": "tidelift"2257 }2258 ],2259 "time": "2025-01-14T11:49:03+00:00"2260 },2261 {2262 "name": "nikic/php-parser",2263 "version": "v5.7.0",2264 "source": {2265 "type": "git",2266 "url": "https://github.com/nikic/PHP-Parser.git",2267 "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82"2268 },2269 "dist": {2270 "type": "zip",2271 "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82",2272 "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82",2273 "shasum": ""2274 },2275 "require": {2276 "ext-ctype": "*",2277 "ext-json": "*",2278 "ext-tokenizer": "*",2279 "php": ">=7.4"2280 },2281 "require-dev": {2282 "ircmaxell/php-yacc": "^0.0.7",2283 "phpunit/phpunit": "^9.0"2284 },2285 "bin": [2286 "bin/php-parse"2287 ],2288 "type": "library",2289 "extra": {2290 "branch-alias": {2291 "dev-master": "5.x-dev"2292 }2293 },2294 "autoload": {2295 "psr-4": {2296 "PhpParser\\": "lib/PhpParser"2297 }2298 },2299 "notification-url": "https://packagist.org/downloads/",2300 "license": [2301 "BSD-3-Clause"2302 ],2303 "authors": [2304 {2305 "name": "Nikita Popov"2306 }2307 ],2308 "description": "A PHP parser written in PHP",2309 "keywords": [2310 "parser",2311 "php"2312 ],2313 "support": {2314 "issues": "https://github.com/nikic/PHP-Parser/issues",2315 "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0"2316 },2317 "time": "2025-12-06T11:56:16+00:00"2318 },2319 {2320 "name": "phpdocumentor/reflection-common",2321 "version": "2.2.0",2322 "source": {2323 "type": "git",2324 "url": "https://github.com/phpDocumentor/ReflectionCommon.git",2325 "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"2326 },2327 "dist": {2328 "type": "zip",2329 "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",2330 "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",2331 "shasum": ""2332 },2333 "require": {2334 "php": "^7.2 || ^8.0"2335 },2336 "type": "library",2337 "extra": {2338 "branch-alias": {2339 "dev-2.x": "2.x-dev"2340 }2341 },2342 "autoload": {2343 "psr-4": {2344 "phpDocumentor\\Reflection\\": "src/"2345 }2346 },2347 "notification-url": "https://packagist.org/downloads/",2348 "license": [2349 "MIT"2350 ],2351 "authors": [2352 {2353 "name": "Jaap van Otterdijk",2354 "email": "opensource@ijaap.nl"2355 }2356 ],2357 "description": "Common reflection classes used by phpdocumentor to reflect the code structure",2358 "homepage": "http://www.phpdoc.org",2359 "keywords": [2360 "FQSEN",2361 "phpDocumentor",2362 "phpdoc",2363 "reflection",2364 "static analysis"2365 ],2366 "support": {2367 "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",2368 "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"2369 },2370 "time": "2020-06-27T09:03:43+00:00"2371 },2372 {2373 "name": "phpdocumentor/reflection-docblock",2374 "version": "5.6.7",2375 "source": {2376 "type": "git",2377 "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",2378 "reference": "31a105931bc8ffa3a123383829772e832fd8d903"2379 },2380 "dist": {2381 "type": "zip",2382 "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/31a105931bc8ffa3a123383829772e832fd8d903",2383 "reference": "31a105931bc8ffa3a123383829772e832fd8d903",2384 "shasum": ""2385 },2386 "require": {2387 "doctrine/deprecations": "^1.1",2388 "ext-filter": "*",2389 "php": "^7.4 || ^8.0",2390 "phpdocumentor/reflection-common": "^2.2",2391 "phpdocumentor/type-resolver": "^1.7",2392 "phpstan/phpdoc-parser": "^1.7|^2.0",2393 "webmozart/assert": "^1.9.1 || ^2"2394 },2395 "require-dev": {2396 "mockery/mockery": "~1.3.5 || ~1.6.0",2397 "phpstan/extension-installer": "^1.1",2398 "phpstan/phpstan": "^1.8",2399 "phpstan/phpstan-mockery": "^1.1",2400 "phpstan/phpstan-webmozart-assert": "^1.2",2401 "phpunit/phpunit": "^9.5",2402 "psalm/phar": "^5.26"2403 },2404 "type": "library",2405 "extra": {2406 "branch-alias": {2407 "dev-master": "5.x-dev"2408 }2409 },2410 "autoload": {2411 "psr-4": {2412 "phpDocumentor\\Reflection\\": "src"2413 }2414 },2415 "notification-url": "https://packagist.org/downloads/",2416 "license": [2417 "MIT"2418 ],2419 "authors": [2420 {2421 "name": "Mike van Riel",2422 "email": "me@mikevanriel.com"2423 },2424 {2425 "name": "Jaap van Otterdijk",2426 "email": "opensource@ijaap.nl"2427 }2428 ],2429 "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",2430 "support": {2431 "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",2432 "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.7"2433 },2434 "time": "2026-03-18T20:47:46+00:00"2435 },2436 {2437 "name": "phpdocumentor/type-resolver",2438 "version": "1.7.4",2439 "source": {2440 "type": "git",2441 "url": "https://github.com/phpDocumentor/TypeResolver.git",2442 "reference": "8430ca5c93b5b933ef1aaf8dd93f80d0c55d2349"2443 },2444 "dist": {2445 "type": "zip",2446 "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/8430ca5c93b5b933ef1aaf8dd93f80d0c55d2349",2447 "reference": "8430ca5c93b5b933ef1aaf8dd93f80d0c55d2349",2448 "shasum": ""2449 },2450 "require": {2451 "doctrine/deprecations": "^1.0",2452 "php": "^7.4 || ^8.0",2453 "phpdocumentor/reflection-common": "^2.0",2454 "phpstan/phpdoc-parser": "^1.13"2455 },2456 "require-dev": {2457 "ext-tokenizer": "*",2458 "phpbench/phpbench": "^1.2",2459 "phpstan/extension-installer": "^1.1",2460 "phpstan/phpstan": "^1.8",2461 "phpstan/phpstan-phpunit": "^1.1",2462 "phpunit/phpunit": "^9.5",2463 "rector/rector": "^0.13.9",2464 "vimeo/psalm": "^4.25"2465 },2466 "type": "library",2467 "extra": {2468 "branch-alias": {2469 "dev-1.x": "1.x-dev"2470 }2471 },2472 "autoload": {2473 "psr-4": {2474 "phpDocumentor\\Reflection\\": "src"2475 }2476 },2477 "notification-url": "https://packagist.org/downloads/",2478 "license": [2479 "MIT"2480 ],2481 "authors": [2482 {2483 "name": "Mike van Riel",2484 "email": "me@mikevanriel.com"2485 }2486 ],2487 "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",2488 "support": {2489 "issues": "https://github.com/phpDocumentor/TypeResolver/issues",2490 "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.7.4"2491 },2492 "time": "2024-01-11T11:21:11+00:00"2493 },2494 {2495 "name": "phpstan/phpdoc-parser",2496 "version": "1.33.0",2497 "source": {2498 "type": "git",2499 "url": "https://github.com/phpstan/phpdoc-parser.git",2500 "reference": "82a311fd3690fb2bf7b64d5c98f912b3dd746140"2501 },2502 "dist": {2503 "type": "zip",2504 "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/82a311fd3690fb2bf7b64d5c98f912b3dd746140",2505 "reference": "82a311fd3690fb2bf7b64d5c98f912b3dd746140",2506 "shasum": ""2507 },2508 "require": {2509 "php": "^7.2 || ^8.0"2510 },2511 "require-dev": {2512 "doctrine/annotations": "^2.0",2513 "nikic/php-parser": "^4.15",2514 "php-parallel-lint/php-parallel-lint": "^1.2",2515 "phpstan/extension-installer": "^1.0",2516 "phpstan/phpstan": "^1.5",2517 "phpstan/phpstan-phpunit": "^1.1",2518 "phpstan/phpstan-strict-rules": "^1.0",2519 "phpunit/phpunit": "^9.5",2520 "symfony/process": "^5.2"2521 },2522 "type": "library",2523 "autoload": {2524 "psr-4": {2525 "PHPStan\\PhpDocParser\\": [2526 "src/"2527 ]2528 }2529 },2530 "notification-url": "https://packagist.org/downloads/",2531 "license": [2532 "MIT"2533 ],2534 "description": "PHPDoc parser with support for nullable, intersection and generic types",2535 "support": {2536 "issues": "https://github.com/phpstan/phpdoc-parser/issues",2537 "source": "https://github.com/phpstan/phpdoc-parser/tree/1.33.0"2538 },2539 "time": "2024-10-13T11:25:22+00:00"2540 },2541 {2542 "name": "pimple/pimple",2543 "version": "v3.6.2",2544 "source": {2545 "type": "git",2546 "url": "https://github.com/silexphp/Pimple.git",2547 "reference": "8cfe7f74ac22a433d303914eba9ea4c2a834edce"2548 },2549 "dist": {2550 "type": "zip",2551 "url": "https://api.github.com/repos/silexphp/Pimple/zipball/8cfe7f74ac22a433d303914eba9ea4c2a834edce",2552 "reference": "8cfe7f74ac22a433d303914eba9ea4c2a834edce",2553 "shasum": ""2554 },2555 "require": {2556 "php": ">=7.2.5",2557 "psr/container": "^1.1 || ^2.0"2558 },2559 "require-dev": {2560 "phpunit/phpunit": "*"2561 },2562 "type": "library",2563 "extra": {2564 "branch-alias": {2565 "dev-master": "3.x-dev"2566 }2567 },2568 "autoload": {2569 "psr-0": {2570 "Pimple": "src/"2571 }2572 },2573 "notification-url": "https://packagist.org/downloads/",2574 "license": [2575 "MIT"2576 ],2577 "authors": [2578 {2579 "name": "Fabien Potencier",2580 "email": "fabien@symfony.com"2581 }2582 ],2583 "description": "Pimple, a simple Dependency Injection Container",2584 "homepage": "https://pimple.symfony.com",2585 "keywords": [2586 "container",2587 "dependency injection"2588 ],2589 "support": {2590 "source": "https://github.com/silexphp/Pimple/tree/v3.6.2"2591 },2592 "time": "2026-02-26T08:23:44+00:00"2593 },2594 {2595 "name": "psr/cache",2596 "version": "1.0.1",2597 "source": {2598 "type": "git",2599 "url": "https://github.com/php-fig/cache.git",2600 "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8"2601 },2602 "dist": {2603 "type": "zip",2604 "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8",2605 "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8",2606 "shasum": ""2607 },2608 "require": {2609 "php": ">=5.3.0"2610 },2611 "type": "library",2612 "extra": {2613 "branch-alias": {2614 "dev-master": "1.0.x-dev"2615 }2616 },2617 "autoload": {2618 "psr-4": {2619 "Psr\\Cache\\": "src/"2620 }2621 },2622 "notification-url": "https://packagist.org/downloads/",2623 "license": [2624 "MIT"2625 ],2626 "authors": [2627 {2628 "name": "PHP-FIG",2629 "homepage": "http://www.php-fig.org/"2630 }2631 ],2632 "description": "Common interface for caching libraries",2633 "keywords": [2634 "cache",2635 "psr",2636 "psr-6"2637 ],2638 "support": {2639 "source": "https://github.com/php-fig/cache/tree/master"2640 },2641 "time": "2016-08-06T20:24:11+00:00"2642 },2643 {2644 "name": "psr/container",2645 "version": "1.1.2",2646 "source": {2647 "type": "git",2648 "url": "https://github.com/php-fig/container.git",2649 "reference": "513e0666f7216c7459170d56df27dfcefe1689ea"2650 },2651 "dist": {2652 "type": "zip",2653 "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea",2654 "reference": "513e0666f7216c7459170d56df27dfcefe1689ea",2655 "shasum": ""2656 },2657 "require": {2658 "php": ">=7.4.0"2659 },2660 "type": "library",2661 "autoload": {2662 "psr-4": {2663 "Psr\\Container\\": "src/"2664 }2665 },2666 "notification-url": "https://packagist.org/downloads/",2667 "license": [2668 "MIT"2669 ],2670 "authors": [2671 {2672 "name": "PHP-FIG",2673 "homepage": "https://www.php-fig.org/"2674 }2675 ],2676 "description": "Common Container Interface (PHP FIG PSR-11)",2677 "homepage": "https://github.com/php-fig/container",2678 "keywords": [2679 "PSR-11",2680 "container",2681 "container-interface",2682 "container-interop",2683 "psr"2684 ],2685 "support": {2686 "issues": "https://github.com/php-fig/container/issues",2687 "source": "https://github.com/php-fig/container/tree/1.1.2"2688 },2689 "time": "2021-11-05T16:50:12+00:00"2690 },2691 {2692 "name": "psr/log",2693 "version": "1.1.4",2694 "source": {2695 "type": "git",2696 "url": "https://github.com/php-fig/log.git",2697 "reference": "d49695b909c3b7628b6289db5479a1c204601f11"2698 },2699 "dist": {2700 "type": "zip",2701 "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11",2702 "reference": "d49695b909c3b7628b6289db5479a1c204601f11",2703 "shasum": ""2704 },2705 "require": {2706 "php": ">=5.3.0"2707 },2708 "type": "library",2709 "extra": {2710 "branch-alias": {2711 "dev-master": "1.1.x-dev"2712 }2713 },2714 "autoload": {2715 "psr-4": {2716 "Psr\\Log\\": "Psr/Log/"2717 }2718 },2719 "notification-url": "https://packagist.org/downloads/",2720 "license": [2721 "MIT"2722 ],2723 "authors": [2724 {2725 "name": "PHP-FIG",2726 "homepage": "https://www.php-fig.org/"2727 }2728 ],2729 "description": "Common interface for logging libraries",2730 "homepage": "https://github.com/php-fig/log",2731 "keywords": [2732 "log",2733 "psr",2734 "psr-3"2735 ],2736 "support": {2737 "source": "https://github.com/php-fig/log/tree/1.1.4"2738 },2739 "time": "2021-05-03T11:20:27+00:00"2740 },2741 {2742 "name": "psr/simple-cache",2743 "version": "1.0.1",2744 "source": {2745 "type": "git",2746 "url": "https://github.com/php-fig/simple-cache.git",2747 "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"2748 },2749 "dist": {2750 "type": "zip",2751 "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",2752 "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",2753 "shasum": ""2754 },2755 "require": {2756 "php": ">=5.3.0"2757 },2758 "type": "library",2759 "extra": {2760 "branch-alias": {2761 "dev-master": "1.0.x-dev"2762 }2763 },2764 "autoload": {2765 "psr-4": {2766 "Psr\\SimpleCache\\": "src/"2767 }2768 },2769 "notification-url": "https://packagist.org/downloads/",2770 "license": [2771 "MIT"2772 ],2773 "authors": [2774 {2775 "name": "PHP-FIG",2776 "homepage": "http://www.php-fig.org/"2777 }2778 ],2779 "description": "Common interfaces for simple caching",2780 "keywords": [2781 "cache",2782 "caching",2783 "psr",2784 "psr-16",2785 "simple-cache"2786 ],2787 "support": {2788 "source": "https://github.com/php-fig/simple-cache/tree/master"2789 },2790 "time": "2017-10-23T01:57:42+00:00"2791 },2792 {2793 "name": "react/promise",2794 "version": "v3.3.0",2795 "source": {2796 "type": "git",2797 "url": "https://github.com/reactphp/promise.git",2798 "reference": "23444f53a813a3296c1368bb104793ce8d88f04a"2799 },2800 "dist": {2801 "type": "zip",2802 "url": "https://api.github.com/repos/reactphp/promise/zipball/23444f53a813a3296c1368bb104793ce8d88f04a",2803 "reference": "23444f53a813a3296c1368bb104793ce8d88f04a",2804 "shasum": ""2805 },2806 "require": {2807 "php": ">=7.1.0"2808 },2809 "require-dev": {2810 "phpstan/phpstan": "1.12.28 || 1.4.10",2811 "phpunit/phpunit": "^9.6 || ^7.5"2812 },2813 "type": "library",2814 "autoload": {2815 "files": [2816 "src/functions_include.php"2817 ],2818 "psr-4": {2819 "React\\Promise\\": "src/"2820 }2821 },2822 "notification-url": "https://packagist.org/downloads/",2823 "license": [2824 "MIT"2825 ],2826 "authors": [2827 {2828 "name": "Jan Sorgalla",2829 "email": "jsorgalla@gmail.com",2830 "homepage": "https://sorgalla.com/"2831 },2832 {2833 "name": "Christian Lück",2834 "email": "christian@clue.engineering",2835 "homepage": "https://clue.engineering/"2836 },2837 {2838 "name": "Cees-Jan Kiewiet",2839 "email": "reactphp@ceesjankiewiet.nl",2840 "homepage": "https://wyrihaximus.net/"2841 },2842 {2843 "name": "Chris Boden",2844 "email": "cboden@gmail.com",2845 "homepage": "https://cboden.dev/"2846 }2847 ],2848 "description": "A lightweight implementation of CommonJS Promises/A for PHP",2849 "keywords": [2850 "promise",2851 "promises"2852 ],2853 "support": {2854 "issues": "https://github.com/reactphp/promise/issues",2855 "source": "https://github.com/reactphp/promise/tree/v3.3.0"2856 },2857 "funding": [2858 {2859 "url": "https://opencollective.com/reactphp",2860 "type": "open_collective"2861 }2862 ],2863 "time": "2025-08-19T18:57:03+00:00"2864 },2865 {2866 "name": "seld/jsonlint",2867 "version": "1.11.0",2868 "source": {2869 "type": "git",2870 "url": "https://github.com/Seldaek/jsonlint.git",2871 "reference": "1748aaf847fc731cfad7725aec413ee46f0cc3a2"2872 },2873 "dist": {2874 "type": "zip",2875 "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/1748aaf847fc731cfad7725aec413ee46f0cc3a2",2876 "reference": "1748aaf847fc731cfad7725aec413ee46f0cc3a2",2877 "shasum": ""2878 },2879 "require": {2880 "php": "^5.3 || ^7.0 || ^8.0"2881 },2882 "require-dev": {2883 "phpstan/phpstan": "^1.11",2884 "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13"2885 },2886 "bin": [2887 "bin/jsonlint"2888 ],2889 "type": "library",2890 "autoload": {2891 "psr-4": {2892 "Seld\\JsonLint\\": "src/Seld/JsonLint/"2893 }2894 },2895 "notification-url": "https://packagist.org/downloads/",2896 "license": [2897 "MIT"2898 ],2899 "authors": [2900 {2901 "name": "Jordi Boggiano",2902 "email": "j.boggiano@seld.be",2903 "homepage": "https://seld.be"2904 }2905 ],2906 "description": "JSON Linter",2907 "keywords": [2908 "json",2909 "linter",2910 "parser",2911 "validator"2912 ],2913 "support": {2914 "issues": "https://github.com/Seldaek/jsonlint/issues",2915 "source": "https://github.com/Seldaek/jsonlint/tree/1.11.0"2916 },2917 "funding": [2918 {2919 "url": "https://github.com/Seldaek",2920 "type": "github"2921 },2922 {2923 "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint",2924 "type": "tidelift"2925 }2926 ],2927 "time": "2024-07-11T14:55:45+00:00"2928 },2929 {2930 "name": "seld/phar-utils",2931 "version": "1.2.1",2932 "source": {2933 "type": "git",2934 "url": "https://github.com/Seldaek/phar-utils.git",2935 "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c"2936 },2937 "dist": {2938 "type": "zip",2939 "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/ea2f4014f163c1be4c601b9b7bd6af81ba8d701c",2940 "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c",2941 "shasum": ""2942 },2943 "require": {2944 "php": ">=5.3"2945 },2946 "type": "library",2947 "extra": {2948 "branch-alias": {2949 "dev-master": "1.x-dev"2950 }2951 },2952 "autoload": {2953 "psr-4": {2954 "Seld\\PharUtils\\": "src/"2955 }2956 },2957 "notification-url": "https://packagist.org/downloads/",2958 "license": [2959 "MIT"2960 ],2961 "authors": [2962 {2963 "name": "Jordi Boggiano",2964 "email": "j.boggiano@seld.be"2965 }2966 ],2967 "description": "PHAR file format utilities, for when PHP phars you up",2968 "keywords": [2969 "phar"2970 ],2971 "support": {2972 "issues": "https://github.com/Seldaek/phar-utils/issues",2973 "source": "https://github.com/Seldaek/phar-utils/tree/1.2.1"2974 },2975 "time": "2022-08-31T10:31:18+00:00"2976 },2977 {2978 "name": "seld/signal-handler",2979 "version": "2.0.2",2980 "source": {2981 "type": "git",2982 "url": "https://github.com/Seldaek/signal-handler.git",2983 "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98"2984 },2985 "dist": {2986 "type": "zip",2987 "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98",2988 "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98",2989 "shasum": ""2990 },2991 "require": {2992 "php": ">=7.2.0"2993 },2994 "require-dev": {2995 "phpstan/phpstan": "^1",2996 "phpstan/phpstan-deprecation-rules": "^1.0",2997 "phpstan/phpstan-phpunit": "^1",2998 "phpstan/phpstan-strict-rules": "^1.3",2999 "phpunit/phpunit": "^7.5.20 || ^8.5.23",3000 "psr/log": "^1 || ^2 || ^3"3001 },3002 "type": "library",3003 "extra": {3004 "branch-alias": {3005 "dev-main": "2.x-dev"3006 }3007 },3008 "autoload": {3009 "psr-4": {3010 "Seld\\Signal\\": "src/"3011 }3012 },3013 "notification-url": "https://packagist.org/downloads/",3014 "license": [3015 "MIT"3016 ],3017 "authors": [3018 {3019 "name": "Jordi Boggiano",3020 "email": "j.boggiano@seld.be",3021 "homepage": "http://seld.be"3022 }3023 ],3024 "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development",3025 "keywords": [3026 "posix",3027 "sigint",3028 "signal",3029 "sigterm",3030 "unix"3031 ],3032 "support": {3033 "issues": "https://github.com/Seldaek/signal-handler/issues",3034 "source": "https://github.com/Seldaek/signal-handler/tree/2.0.2"3035 },3036 "time": "2023-09-03T09:24:00+00:00"3037 },3038 {3039 "name": "symfony/cache",3040 "version": "v5.4.53",3041 "source": {3042 "type": "git",3043 "url": "https://github.com/symfony/cache.git",3044 "reference": "bf581474737420d5c932ae80b868e253f465ee5b"3045 },3046 "dist": {3047 "type": "zip",3048 "url": "https://api.github.com/repos/symfony/cache/zipball/bf581474737420d5c932ae80b868e253f465ee5b",3049 "reference": "bf581474737420d5c932ae80b868e253f465ee5b",3050 "shasum": ""3051 },3052 "require": {3053 "php": ">=7.2.5",3054 "psr/cache": "^1.0|^2.0",3055 "psr/log": "^1.1|^2|^3",3056 "symfony/cache-contracts": "^1.1.7|^2",3057 "symfony/deprecation-contracts": "^2.1|^3",3058 "symfony/polyfill-php73": "^1.9",3059 "symfony/polyfill-php80": "^1.16",3060 "symfony/service-contracts": "^1.1|^2|^3",3061 "symfony/var-exporter": "^4.4|^5.0|^6.0"3062 },3063 "conflict": {3064 "doctrine/dbal": "<2.13.1",3065 "symfony/dependency-injection": "<4.4",3066 "symfony/http-kernel": "<4.4",3067 "symfony/var-dumper": "<4.4"3068 },3069 "provide": {3070 "psr/cache-implementation": "1.0|2.0",3071 "psr/simple-cache-implementation": "1.0|2.0",3072 "symfony/cache-implementation": "1.0|2.0"3073 },3074 "require-dev": {3075 "cache/integration-tests": "dev-master",3076 "doctrine/cache": "^1.6|^2.0",3077 "doctrine/dbal": "^2.13.1|^3|^4",3078 "predis/predis": "^1.1|^2.0",3079 "psr/simple-cache": "^1.0|^2.0",3080 "symfony/config": "^4.4|^5.0|^6.0",3081 "symfony/dependency-injection": "^4.4|^5.0|^6.0",3082 "symfony/filesystem": "^4.4|^5.0|^6.0",3083 "symfony/http-kernel": "^4.4|^5.0|^6.0",3084 "symfony/messenger": "^4.4|^5.0|^6.0",3085 "symfony/var-dumper": "^4.4|^5.0|^6.0"3086 },3087 "type": "library",3088 "autoload": {3089 "psr-4": {3090 "Symfony\\Component\\Cache\\": ""3091 },3092 "exclude-from-classmap": [3093 "/Tests/"3094 ]3095 },3096 "notification-url": "https://packagist.org/downloads/",3097 "license": [3098 "MIT"3099 ],3100 "authors": [3101 {3102 "name": "Nicolas Grekas",3103 "email": "p@tchwork.com"3104 },3105 {3106 "name": "Symfony Community",3107 "homepage": "https://symfony.com/contributors"3108 }3109 ],3110 "description": "Provides extended PSR-6, PSR-16 (and tags) implementations",3111 "homepage": "https://symfony.com",3112 "keywords": [3113 "caching",3114 "psr6"3115 ],3116 "support": {3117 "source": "https://github.com/symfony/cache/tree/v5.4.53"3118 },3119 "funding": [3120 {3121 "url": "https://symfony.com/sponsor",3122 "type": "custom"3123 },3124 {3125 "url": "https://github.com/fabpot",3126 "type": "github"3127 },3128 {3129 "url": "https://github.com/nicolas-grekas",3130 "type": "github"3131 },3132 {3133 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",3134 "type": "tidelift"3135 }3136 ],3137 "time": "2026-05-24T08:41:21+00:00"3138 },3139 {3140 "name": "symfony/cache-contracts",3141 "version": "v2.5.4",3142 "source": {3143 "type": "git",3144 "url": "https://github.com/symfony/cache-contracts.git",3145 "reference": "517c3a3619dadfa6952c4651767fcadffb4df65e"3146 },3147 "dist": {3148 "type": "zip",3149 "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/517c3a3619dadfa6952c4651767fcadffb4df65e",3150 "reference": "517c3a3619dadfa6952c4651767fcadffb4df65e",3151 "shasum": ""3152 },3153 "require": {3154 "php": ">=7.2.5",3155 "psr/cache": "^1.0|^2.0|^3.0"3156 },3157 "suggest": {3158 "symfony/cache-implementation": ""3159 },3160 "type": "library",3161 "extra": {3162 "thanks": {3163 "url": "https://github.com/symfony/contracts",3164 "name": "symfony/contracts"3165 },3166 "branch-alias": {3167 "dev-main": "2.5-dev"3168 }3169 },3170 "autoload": {3171 "psr-4": {3172 "Symfony\\Contracts\\Cache\\": ""3173 }3174 },3175 "notification-url": "https://packagist.org/downloads/",3176 "license": [3177 "MIT"3178 ],3179 "authors": [3180 {3181 "name": "Nicolas Grekas",3182 "email": "p@tchwork.com"3183 },3184 {3185 "name": "Symfony Community",3186 "homepage": "https://symfony.com/contributors"3187 }3188 ],3189 "description": "Generic abstractions related to caching",3190 "homepage": "https://symfony.com",3191 "keywords": [3192 "abstractions",3193 "contracts",3194 "decoupling",3195 "interfaces",3196 "interoperability",3197 "standards"3198 ],3199 "support": {3200 "source": "https://github.com/symfony/cache-contracts/tree/v2.5.4"3201 },3202 "funding": [3203 {3204 "url": "https://symfony.com/sponsor",3205 "type": "custom"3206 },3207 {3208 "url": "https://github.com/fabpot",3209 "type": "github"3210 },3211 {3212 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",3213 "type": "tidelift"3214 }3215 ],3216 "time": "2024-09-25T14:11:13+00:00"3217 },3218 {3219 "name": "symfony/console",3220 "version": "v5.4.47",3221 "source": {3222 "type": "git",3223 "url": "https://github.com/symfony/console.git",3224 "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed"3225 },3226 "dist": {3227 "type": "zip",3228 "url": "https://api.github.com/repos/symfony/console/zipball/c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed",3229 "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed",3230 "shasum": ""3231 },3232 "require": {3233 "php": ">=7.2.5",3234 "symfony/deprecation-contracts": "^2.1|^3",3235 "symfony/polyfill-mbstring": "~1.0",3236 "symfony/polyfill-php73": "^1.9",3237 "symfony/polyfill-php80": "^1.16",3238 "symfony/service-contracts": "^1.1|^2|^3",3239 "symfony/string": "^5.1|^6.0"3240 },3241 "conflict": {3242 "psr/log": ">=3",3243 "symfony/dependency-injection": "<4.4",3244 "symfony/dotenv": "<5.1",3245 "symfony/event-dispatcher": "<4.4",3246 "symfony/lock": "<4.4",3247 "symfony/process": "<4.4"3248 },3249 "provide": {3250 "psr/log-implementation": "1.0|2.0"3251 },3252 "require-dev": {3253 "psr/log": "^1|^2",3254 "symfony/config": "^4.4|^5.0|^6.0",3255 "symfony/dependency-injection": "^4.4|^5.0|^6.0",3256 "symfony/event-dispatcher": "^4.4|^5.0|^6.0",3257 "symfony/lock": "^4.4|^5.0|^6.0",3258 "symfony/process": "^4.4|^5.0|^6.0",3259 "symfony/var-dumper": "^4.4|^5.0|^6.0"3260 },3261 "suggest": {3262 "psr/log": "For using the console logger",3263 "symfony/event-dispatcher": "",3264 "symfony/lock": "",3265 "symfony/process": ""3266 },3267 "type": "library",3268 "autoload": {3269 "psr-4": {3270 "Symfony\\Component\\Console\\": ""3271 },3272 "exclude-from-classmap": [3273 "/Tests/"3274 ]3275 },3276 "notification-url": "https://packagist.org/downloads/",3277 "license": [3278 "MIT"3279 ],3280 "authors": [3281 {3282 "name": "Fabien Potencier",3283 "email": "fabien@symfony.com"3284 },3285 {3286 "name": "Symfony Community",3287 "homepage": "https://symfony.com/contributors"3288 }3289 ],3290 "description": "Eases the creation of beautiful and testable command line interfaces",3291 "homepage": "https://symfony.com",3292 "keywords": [3293 "cli",3294 "command-line",3295 "console",3296 "terminal"3297 ],3298 "support": {3299 "source": "https://github.com/symfony/console/tree/v5.4.47"3300 },3301 "funding": [3302 {3303 "url": "https://symfony.com/sponsor",3304 "type": "custom"3305 },3306 {3307 "url": "https://github.com/fabpot",3308 "type": "github"3309 },3310 {3311 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",3312 "type": "tidelift"3313 }3314 ],3315 "time": "2024-11-06T11:30:55+00:00"3316 },3317 {3318 "name": "symfony/filesystem",3319 "version": "v5.4.45",3320 "source": {3321 "type": "git",3322 "url": "https://github.com/symfony/filesystem.git",3323 "reference": "57c8294ed37d4a055b77057827c67f9558c95c54"3324 },3325 "dist": {3326 "type": "zip",3327 "url": "https://api.github.com/repos/symfony/filesystem/zipball/57c8294ed37d4a055b77057827c67f9558c95c54",3328 "reference": "57c8294ed37d4a055b77057827c67f9558c95c54",3329 "shasum": ""3330 },3331 "require": {3332 "php": ">=7.2.5",3333 "symfony/polyfill-ctype": "~1.8",3334 "symfony/polyfill-mbstring": "~1.8",3335 "symfony/polyfill-php80": "^1.16"3336 },3337 "require-dev": {3338 "symfony/process": "^5.4|^6.4"3339 },3340 "type": "library",3341 "autoload": {3342 "psr-4": {3343 "Symfony\\Component\\Filesystem\\": ""3344 },3345 "exclude-from-classmap": [3346 "/Tests/"3347 ]3348 },3349 "notification-url": "https://packagist.org/downloads/",3350 "license": [3351 "MIT"3352 ],3353 "authors": [3354 {3355 "name": "Fabien Potencier",3356 "email": "fabien@symfony.com"3357 },3358 {3359 "name": "Symfony Community",3360 "homepage": "https://symfony.com/contributors"3361 }3362 ],3363 "description": "Provides basic utilities for the filesystem",3364 "homepage": "https://symfony.com",3365 "support": {3366 "source": "https://github.com/symfony/filesystem/tree/v5.4.45"3367 },3368 "funding": [3369 {3370 "url": "https://symfony.com/sponsor",3371 "type": "custom"3372 },3373 {3374 "url": "https://github.com/fabpot",3375 "type": "github"3376 },3377 {3378 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",3379 "type": "tidelift"3380 }3381 ],3382 "time": "2024-10-22T13:05:35+00:00"3383 },3384 {3385 "name": "symfony/finder",3386 "version": "v5.4.45",3387 "source": {3388 "type": "git",3389 "url": "https://github.com/symfony/finder.git",3390 "reference": "63741784cd7b9967975eec610b256eed3ede022b"3391 },3392 "dist": {3393 "type": "zip",3394 "url": "https://api.github.com/repos/symfony/finder/zipball/63741784cd7b9967975eec610b256eed3ede022b",3395 "reference": "63741784cd7b9967975eec610b256eed3ede022b",3396 "shasum": ""3397 },3398 "require": {3399 "php": ">=7.2.5",3400 "symfony/deprecation-contracts": "^2.1|^3",3401 "symfony/polyfill-php80": "^1.16"3402 },3403 "type": "library",3404 "autoload": {3405 "psr-4": {3406 "Symfony\\Component\\Finder\\": ""3407 },3408 "exclude-from-classmap": [3409 "/Tests/"3410 ]3411 },3412 "notification-url": "https://packagist.org/downloads/",3413 "license": [3414 "MIT"3415 ],3416 "authors": [3417 {3418 "name": "Fabien Potencier",3419 "email": "fabien@symfony.com"3420 },3421 {3422 "name": "Symfony Community",3423 "homepage": "https://symfony.com/contributors"3424 }3425 ],3426 "description": "Finds files and directories via an intuitive fluent interface",3427 "homepage": "https://symfony.com",3428 "support": {3429 "source": "https://github.com/symfony/finder/tree/v5.4.45"3430 },3431 "funding": [3432 {3433 "url": "https://symfony.com/sponsor",3434 "type": "custom"3435 },3436 {3437 "url": "https://github.com/fabpot",3438 "type": "github"3439 },3440 {3441 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",3442 "type": "tidelift"3443 }3444 ],3445 "time": "2024-09-28T13:32:08+00:00"3446 },3447 {3448 "name": "symfony/polyfill-ctype",3449 "version": "v1.37.0",3450 "source": {3451 "type": "git",3452 "url": "https://github.com/symfony/polyfill-ctype.git",3453 "reference": "141046a8f9477948ff284fa65be2095baafb94f2"3454 },3455 "dist": {3456 "type": "zip",3457 "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2",3458 "reference": "141046a8f9477948ff284fa65be2095baafb94f2",3459 "shasum": ""3460 },3461 "require": {3462 "php": ">=7.2"3463 },3464 "provide": {3465 "ext-ctype": "*"3466 },3467 "suggest": {3468 "ext-ctype": "For best performance"3469 },3470 "type": "library",3471 "extra": {3472 "thanks": {3473 "url": "https://github.com/symfony/polyfill",3474 "name": "symfony/polyfill"3475 }3476 },3477 "autoload": {3478 "files": [3479 "bootstrap.php"3480 ],3481 "psr-4": {3482 "Symfony\\Polyfill\\Ctype\\": ""3483 }3484 },3485 "notification-url": "https://packagist.org/downloads/",3486 "license": [3487 "MIT"3488 ],3489 "authors": [3490 {3491 "name": "Gert de Pagter",3492 "email": "BackEndTea@gmail.com"3493 },3494 {3495 "name": "Symfony Community",3496 "homepage": "https://symfony.com/contributors"3497 }3498 ],3499 "description": "Symfony polyfill for ctype functions",3500 "homepage": "https://symfony.com",3501 "keywords": [3502 "compatibility",3503 "ctype",3504 "polyfill",3505 "portable"3506 ],3507 "support": {3508 "source": "https://github.com/symfony/polyfill-ctype/tree/v1.37.0"3509 },3510 "funding": [3511 {3512 "url": "https://symfony.com/sponsor",3513 "type": "custom"3514 },3515 {3516 "url": "https://github.com/fabpot",3517 "type": "github"3518 },3519 {3520 "url": "https://github.com/nicolas-grekas",3521 "type": "github"3522 },3523 {3524 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",3525 "type": "tidelift"3526 }3527 ],3528 "time": "2026-04-10T16:19:22+00:00"3529 },3530 {3531 "name": "symfony/polyfill-intl-grapheme",3532 "version": "v1.38.1",3533 "source": {3534 "type": "git",3535 "url": "https://github.com/symfony/polyfill-intl-grapheme.git",3536 "reference": "e9247d281d694a5120554d9afaf54e070e88a603"3537 },3538 "dist": {3539 "type": "zip",3540 "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/e9247d281d694a5120554d9afaf54e070e88a603",3541 "reference": "e9247d281d694a5120554d9afaf54e070e88a603",3542 "shasum": ""3543 },3544 "require": {3545 "php": ">=7.2"3546 },3547 "suggest": {3548 "ext-intl": "For best performance"3549 },3550 "type": "library",3551 "extra": {3552 "thanks": {3553 "url": "https://github.com/symfony/polyfill",3554 "name": "symfony/polyfill"3555 }3556 },3557 "autoload": {3558 "files": [3559 "bootstrap.php"3560 ],3561 "psr-4": {3562 "Symfony\\Polyfill\\Intl\\Grapheme\\": ""3563 }3564 },3565 "notification-url": "https://packagist.org/downloads/",3566 "license": [3567 "MIT"3568 ],3569 "authors": [3570 {3571 "name": "Nicolas Grekas",3572 "email": "p@tchwork.com"3573 },3574 {3575 "name": "Symfony Community",3576 "homepage": "https://symfony.com/contributors"3577 }3578 ],3579 "description": "Symfony polyfill for intl's grapheme_* functions",3580 "homepage": "https://symfony.com",3581 "keywords": [3582 "compatibility",3583 "grapheme",3584 "intl",3585 "polyfill",3586 "portable",3587 "shim"3588 ],3589 "support": {3590 "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.38.1"3591 },3592 "funding": [3593 {3594 "url": "https://symfony.com/sponsor",3595 "type": "custom"3596 },3597 {3598 "url": "https://github.com/fabpot",3599 "type": "github"3600 },3601 {3602 "url": "https://github.com/nicolas-grekas",3603 "type": "github"3604 },3605 {3606 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",3607 "type": "tidelift"3608 }3609 ],3610 "time": "2026-05-26T05:58:03+00:00"3611 },3612 {3613 "name": "symfony/polyfill-intl-normalizer",3614 "version": "v1.38.0",3615 "source": {3616 "type": "git",3617 "url": "https://github.com/symfony/polyfill-intl-normalizer.git",3618 "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b"3619 },3620 "dist": {3621 "type": "zip",3622 "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/2d446c214bdbe5b71bde5011b060a05fece3ae6b",3623 "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b",3624 "shasum": ""3625 },3626 "require": {3627 "php": ">=7.2"3628 },3629 "suggest": {3630 "ext-intl": "For best performance"3631 },3632 "type": "library",3633 "extra": {3634 "thanks": {3635 "url": "https://github.com/symfony/polyfill",3636 "name": "symfony/polyfill"3637 }3638 },3639 "autoload": {3640 "files": [3641 "bootstrap.php"3642 ],3643 "psr-4": {3644 "Symfony\\Polyfill\\Intl\\Normalizer\\": ""3645 },3646 "classmap": [3647 "Resources/stubs"3648 ]3649 },3650 "notification-url": "https://packagist.org/downloads/",3651 "license": [3652 "MIT"3653 ],3654 "authors": [3655 {3656 "name": "Nicolas Grekas",3657 "email": "p@tchwork.com"3658 },3659 {3660 "name": "Symfony Community",3661 "homepage": "https://symfony.com/contributors"3662 }3663 ],3664 "description": "Symfony polyfill for intl's Normalizer class and related functions",3665 "homepage": "https://symfony.com",3666 "keywords": [3667 "compatibility",3668 "intl",3669 "normalizer",3670 "polyfill",3671 "portable",3672 "shim"3673 ],3674 "support": {3675 "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.38.0"3676 },3677 "funding": [3678 {3679 "url": "https://symfony.com/sponsor",3680 "type": "custom"3681 },3682 {3683 "url": "https://github.com/fabpot",3684 "type": "github"3685 },3686 {3687 "url": "https://github.com/nicolas-grekas",3688 "type": "github"3689 },3690 {3691 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",3692 "type": "tidelift"3693 }3694 ],3695 "time": "2026-05-25T13:48:31+00:00"3696 },3697 {3698 "name": "symfony/polyfill-mbstring",3699 "version": "v1.38.1",3700 "source": {3701 "type": "git",3702 "url": "https://github.com/symfony/polyfill-mbstring.git",3703 "reference": "14c5439eec4ccff081ac14eca2dc57feb2a66d92"3704 },3705 "dist": {3706 "type": "zip",3707 "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/14c5439eec4ccff081ac14eca2dc57feb2a66d92",3708 "reference": "14c5439eec4ccff081ac14eca2dc57feb2a66d92",3709 "shasum": ""3710 },3711 "require": {3712 "ext-iconv": "*",3713 "php": ">=7.2"3714 },3715 "provide": {3716 "ext-mbstring": "*"3717 },3718 "suggest": {3719 "ext-mbstring": "For best performance"3720 },3721 "type": "library",3722 "extra": {3723 "thanks": {3724 "url": "https://github.com/symfony/polyfill",3725 "name": "symfony/polyfill"3726 }3727 },3728 "autoload": {3729 "files": [3730 "bootstrap.php"3731 ],3732 "psr-4": {3733 "Symfony\\Polyfill\\Mbstring\\": ""3734 }3735 },3736 "notification-url": "https://packagist.org/downloads/",3737 "license": [3738 "MIT"3739 ],3740 "authors": [3741 {3742 "name": "Nicolas Grekas",3743 "email": "p@tchwork.com"3744 },3745 {3746 "name": "Symfony Community",3747 "homepage": "https://symfony.com/contributors"3748 }3749 ],3750 "description": "Symfony polyfill for the Mbstring extension",3751 "homepage": "https://symfony.com",3752 "keywords": [3753 "compatibility",3754 "mbstring",3755 "polyfill",3756 "portable",3757 "shim"3758 ],3759 "support": {3760 "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.38.1"3761 },3762 "funding": [3763 {3764 "url": "https://symfony.com/sponsor",3765 "type": "custom"3766 },3767 {3768 "url": "https://github.com/fabpot",3769 "type": "github"3770 },3771 {3772 "url": "https://github.com/nicolas-grekas",3773 "type": "github"3774 },3775 {3776 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",3777 "type": "tidelift"3778 }3779 ],3780 "time": "2026-05-26T12:51:13+00:00"3781 },3782 {3783 "name": "symfony/polyfill-php73",3784 "version": "v1.37.0",3785 "source": {3786 "type": "git",3787 "url": "https://github.com/symfony/polyfill-php73.git",3788 "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb"3789 },3790 "dist": {3791 "type": "zip",3792 "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb",3793 "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb",3794 "shasum": ""3795 },3796 "require": {3797 "php": ">=7.2"3798 },3799 "type": "library",3800 "extra": {3801 "thanks": {3802 "url": "https://github.com/symfony/polyfill",3803 "name": "symfony/polyfill"3804 }3805 },3806 "autoload": {3807 "files": [3808 "bootstrap.php"3809 ],3810 "psr-4": {3811 "Symfony\\Polyfill\\Php73\\": ""3812 },3813 "classmap": [3814 "Resources/stubs"3815 ]3816 },3817 "notification-url": "https://packagist.org/downloads/",3818 "license": [3819 "MIT"3820 ],3821 "authors": [3822 {3823 "name": "Nicolas Grekas",3824 "email": "p@tchwork.com"3825 },3826 {3827 "name": "Symfony Community",3828 "homepage": "https://symfony.com/contributors"3829 }3830 ],3831 "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",3832 "homepage": "https://symfony.com",3833 "keywords": [3834 "compatibility",3835 "polyfill",3836 "portable",3837 "shim"3838 ],3839 "support": {3840 "source": "https://github.com/symfony/polyfill-php73/tree/v1.37.0"3841 },3842 "funding": [3843 {3844 "url": "https://symfony.com/sponsor",3845 "type": "custom"3846 },3847 {3848 "url": "https://github.com/fabpot",3849 "type": "github"3850 },3851 {3852 "url": "https://github.com/nicolas-grekas",3853 "type": "github"3854 },3855 {3856 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",3857 "type": "tidelift"3858 }3859 ],3860 "time": "2024-09-09T11:45:10+00:00"3861 816 }, 3862 817 { … … 3943 898 ], 3944 899 "time": "2026-04-10T16:19:22+00:00" 3945 },3946 {3947 "name": "symfony/polyfill-php81",3948 "version": "v1.38.1",3949 "source": {3950 "type": "git",3951 "url": "https://github.com/symfony/polyfill-php81.git",3952 "reference": "6bfb9c766cacffbc8e118cb87217d08ed84e5cd7"3953 },3954 "dist": {3955 "type": "zip",3956 "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/6bfb9c766cacffbc8e118cb87217d08ed84e5cd7",3957 "reference": "6bfb9c766cacffbc8e118cb87217d08ed84e5cd7",3958 "shasum": ""3959 },3960 "require": {3961 "php": ">=7.2"3962 },3963 "type": "library",3964 "extra": {3965 "thanks": {3966 "url": "https://github.com/symfony/polyfill",3967 "name": "symfony/polyfill"3968 }3969 },3970 "autoload": {3971 "files": [3972 "bootstrap.php"3973 ],3974 "psr-4": {3975 "Symfony\\Polyfill\\Php81\\": ""3976 },3977 "classmap": [3978 "Resources/stubs"3979 ]3980 },3981 "notification-url": "https://packagist.org/downloads/",3982 "license": [3983 "MIT"3984 ],3985 "authors": [3986 {3987 "name": "Nicolas Grekas",3988 "email": "p@tchwork.com"3989 },3990 {3991 "name": "Symfony Community",3992 "homepage": "https://symfony.com/contributors"3993 }3994 ],3995 "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions",3996 "homepage": "https://symfony.com",3997 "keywords": [3998 "compatibility",3999 "polyfill",4000 "portable",4001 "shim"4002 ],4003 "support": {4004 "source": "https://github.com/symfony/polyfill-php81/tree/v1.38.1"4005 },4006 "funding": [4007 {4008 "url": "https://symfony.com/sponsor",4009 "type": "custom"4010 },4011 {4012 "url": "https://github.com/fabpot",4013 "type": "github"4014 },4015 {4016 "url": "https://github.com/nicolas-grekas",4017 "type": "github"4018 },4019 {4020 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",4021 "type": "tidelift"4022 }4023 ],4024 "time": "2026-05-26T12:45:58+00:00"4025 },4026 {4027 "name": "symfony/polyfill-php84",4028 "version": "v1.38.1",4029 "source": {4030 "type": "git",4031 "url": "https://github.com/symfony/polyfill-php84.git",4032 "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa"4033 },4034 "dist": {4035 "type": "zip",4036 "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa",4037 "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa",4038 "shasum": ""4039 },4040 "require": {4041 "php": ">=7.2"4042 },4043 "type": "library",4044 "extra": {4045 "thanks": {4046 "url": "https://github.com/symfony/polyfill",4047 "name": "symfony/polyfill"4048 }4049 },4050 "autoload": {4051 "files": [4052 "bootstrap.php"4053 ],4054 "psr-4": {4055 "Symfony\\Polyfill\\Php84\\": ""4056 },4057 "classmap": [4058 "Resources/stubs"4059 ]4060 },4061 "notification-url": "https://packagist.org/downloads/",4062 "license": [4063 "MIT"4064 ],4065 "authors": [4066 {4067 "name": "Nicolas Grekas",4068 "email": "p@tchwork.com"4069 },4070 {4071 "name": "Symfony Community",4072 "homepage": "https://symfony.com/contributors"4073 }4074 ],4075 "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions",4076 "homepage": "https://symfony.com",4077 "keywords": [4078 "compatibility",4079 "polyfill",4080 "portable",4081 "shim"4082 ],4083 "support": {4084 "source": "https://github.com/symfony/polyfill-php84/tree/v1.38.1"4085 },4086 "funding": [4087 {4088 "url": "https://symfony.com/sponsor",4089 "type": "custom"4090 },4091 {4092 "url": "https://github.com/fabpot",4093 "type": "github"4094 },4095 {4096 "url": "https://github.com/nicolas-grekas",4097 "type": "github"4098 },4099 {4100 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",4101 "type": "tidelift"4102 }4103 ],4104 "time": "2026-05-26T12:51:13+00:00"4105 },4106 {4107 "name": "symfony/process",4108 "version": "v5.4.51",4109 "source": {4110 "type": "git",4111 "url": "https://github.com/symfony/process.git",4112 "reference": "467bfc56f18f5ef6d5ccb09324d7e988c1c0a98f"4113 },4114 "dist": {4115 "type": "zip",4116 "url": "https://api.github.com/repos/symfony/process/zipball/467bfc56f18f5ef6d5ccb09324d7e988c1c0a98f",4117 "reference": "467bfc56f18f5ef6d5ccb09324d7e988c1c0a98f",4118 "shasum": ""4119 },4120 "require": {4121 "php": ">=7.2.5",4122 "symfony/polyfill-php80": "^1.16"4123 },4124 "type": "library",4125 "autoload": {4126 "psr-4": {4127 "Symfony\\Component\\Process\\": ""4128 },4129 "exclude-from-classmap": [4130 "/Tests/"4131 ]4132 },4133 "notification-url": "https://packagist.org/downloads/",4134 "license": [4135 "MIT"4136 ],4137 "authors": [4138 {4139 "name": "Fabien Potencier",4140 "email": "fabien@symfony.com"4141 },4142 {4143 "name": "Symfony Community",4144 "homepage": "https://symfony.com/contributors"4145 }4146 ],4147 "description": "Executes commands in sub-processes",4148 "homepage": "https://symfony.com",4149 "support": {4150 "source": "https://github.com/symfony/process/tree/v5.4.51"4151 },4152 "funding": [4153 {4154 "url": "https://symfony.com/sponsor",4155 "type": "custom"4156 },4157 {4158 "url": "https://github.com/fabpot",4159 "type": "github"4160 },4161 {4162 "url": "https://github.com/nicolas-grekas",4163 "type": "github"4164 },4165 {4166 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",4167 "type": "tidelift"4168 }4169 ],4170 "time": "2026-01-26T15:53:37+00:00"4171 },4172 {4173 "name": "symfony/service-contracts",4174 "version": "v2.5.4",4175 "source": {4176 "type": "git",4177 "url": "https://github.com/symfony/service-contracts.git",4178 "reference": "f37b419f7aea2e9abf10abd261832cace12e3300"4179 },4180 "dist": {4181 "type": "zip",4182 "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f37b419f7aea2e9abf10abd261832cace12e3300",4183 "reference": "f37b419f7aea2e9abf10abd261832cace12e3300",4184 "shasum": ""4185 },4186 "require": {4187 "php": ">=7.2.5",4188 "psr/container": "^1.1",4189 "symfony/deprecation-contracts": "^2.1|^3"4190 },4191 "conflict": {4192 "ext-psr": "<1.1|>=2"4193 },4194 "suggest": {4195 "symfony/service-implementation": ""4196 },4197 "type": "library",4198 "extra": {4199 "thanks": {4200 "url": "https://github.com/symfony/contracts",4201 "name": "symfony/contracts"4202 },4203 "branch-alias": {4204 "dev-main": "2.5-dev"4205 }4206 },4207 "autoload": {4208 "psr-4": {4209 "Symfony\\Contracts\\Service\\": ""4210 }4211 },4212 "notification-url": "https://packagist.org/downloads/",4213 "license": [4214 "MIT"4215 ],4216 "authors": [4217 {4218 "name": "Nicolas Grekas",4219 "email": "p@tchwork.com"4220 },4221 {4222 "name": "Symfony Community",4223 "homepage": "https://symfony.com/contributors"4224 }4225 ],4226 "description": "Generic abstractions related to writing services",4227 "homepage": "https://symfony.com",4228 "keywords": [4229 "abstractions",4230 "contracts",4231 "decoupling",4232 "interfaces",4233 "interoperability",4234 "standards"4235 ],4236 "support": {4237 "source": "https://github.com/symfony/service-contracts/tree/v2.5.4"4238 },4239 "funding": [4240 {4241 "url": "https://symfony.com/sponsor",4242 "type": "custom"4243 },4244 {4245 "url": "https://github.com/fabpot",4246 "type": "github"4247 },4248 {4249 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",4250 "type": "tidelift"4251 }4252 ],4253 "time": "2024-09-25T14:11:13+00:00"4254 },4255 {4256 "name": "symfony/string",4257 "version": "v5.4.47",4258 "source": {4259 "type": "git",4260 "url": "https://github.com/symfony/string.git",4261 "reference": "136ca7d72f72b599f2631aca474a4f8e26719799"4262 },4263 "dist": {4264 "type": "zip",4265 "url": "https://api.github.com/repos/symfony/string/zipball/136ca7d72f72b599f2631aca474a4f8e26719799",4266 "reference": "136ca7d72f72b599f2631aca474a4f8e26719799",4267 "shasum": ""4268 },4269 "require": {4270 "php": ">=7.2.5",4271 "symfony/polyfill-ctype": "~1.8",4272 "symfony/polyfill-intl-grapheme": "~1.0",4273 "symfony/polyfill-intl-normalizer": "~1.0",4274 "symfony/polyfill-mbstring": "~1.0",4275 "symfony/polyfill-php80": "~1.15"4276 },4277 "conflict": {4278 "symfony/translation-contracts": ">=3.0"4279 },4280 "require-dev": {4281 "symfony/error-handler": "^4.4|^5.0|^6.0",4282 "symfony/http-client": "^4.4|^5.0|^6.0",4283 "symfony/translation-contracts": "^1.1|^2",4284 "symfony/var-exporter": "^4.4|^5.0|^6.0"4285 },4286 "type": "library",4287 "autoload": {4288 "files": [4289 "Resources/functions.php"4290 ],4291 "psr-4": {4292 "Symfony\\Component\\String\\": ""4293 },4294 "exclude-from-classmap": [4295 "/Tests/"4296 ]4297 },4298 "notification-url": "https://packagist.org/downloads/",4299 "license": [4300 "MIT"4301 ],4302 "authors": [4303 {4304 "name": "Nicolas Grekas",4305 "email": "p@tchwork.com"4306 },4307 {4308 "name": "Symfony Community",4309 "homepage": "https://symfony.com/contributors"4310 }4311 ],4312 "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",4313 "homepage": "https://symfony.com",4314 "keywords": [4315 "grapheme",4316 "i18n",4317 "string",4318 "unicode",4319 "utf-8",4320 "utf8"4321 ],4322 "support": {4323 "source": "https://github.com/symfony/string/tree/v5.4.47"4324 },4325 "funding": [4326 {4327 "url": "https://symfony.com/sponsor",4328 "type": "custom"4329 },4330 {4331 "url": "https://github.com/fabpot",4332 "type": "github"4333 },4334 {4335 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",4336 "type": "tidelift"4337 }4338 ],4339 "time": "2024-11-10T20:33:58+00:00"4340 },4341 {4342 "name": "symfony/var-exporter",4343 "version": "v5.4.45",4344 "source": {4345 "type": "git",4346 "url": "https://github.com/symfony/var-exporter.git",4347 "reference": "862700068db0ddfd8c5b850671e029a90246ec75"4348 },4349 "dist": {4350 "type": "zip",4351 "url": "https://api.github.com/repos/symfony/var-exporter/zipball/862700068db0ddfd8c5b850671e029a90246ec75",4352 "reference": "862700068db0ddfd8c5b850671e029a90246ec75",4353 "shasum": ""4354 },4355 "require": {4356 "php": ">=7.2.5",4357 "symfony/polyfill-php80": "^1.16"4358 },4359 "require-dev": {4360 "symfony/var-dumper": "^4.4.9|^5.0.9|^6.0"4361 },4362 "type": "library",4363 "autoload": {4364 "psr-4": {4365 "Symfony\\Component\\VarExporter\\": ""4366 },4367 "exclude-from-classmap": [4368 "/Tests/"4369 ]4370 },4371 "notification-url": "https://packagist.org/downloads/",4372 "license": [4373 "MIT"4374 ],4375 "authors": [4376 {4377 "name": "Nicolas Grekas",4378 "email": "p@tchwork.com"4379 },4380 {4381 "name": "Symfony Community",4382 "homepage": "https://symfony.com/contributors"4383 }4384 ],4385 "description": "Allows exporting any serializable PHP data structure to plain PHP code",4386 "homepage": "https://symfony.com",4387 "keywords": [4388 "clone",4389 "construct",4390 "export",4391 "hydrate",4392 "instantiate",4393 "serialize"4394 ],4395 "support": {4396 "source": "https://github.com/symfony/var-exporter/tree/v5.4.45"4397 },4398 "funding": [4399 {4400 "url": "https://symfony.com/sponsor",4401 "type": "custom"4402 },4403 {4404 "url": "https://github.com/fabpot",4405 "type": "github"4406 },4407 {4408 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",4409 "type": "tidelift"4410 }4411 ],4412 "time": "2024-09-25T14:11:13+00:00"4413 },4414 {4415 "name": "voku/simple-cache",4416 "version": "5.0.0",4417 "source": {4418 "type": "git",4419 "url": "https://github.com/voku/simple-cache.git",4420 "reference": "71531e9a8f4bfb75a120a986ac12867af15c65be"4421 },4422 "dist": {4423 "type": "zip",4424 "url": "https://api.github.com/repos/voku/simple-cache/zipball/71531e9a8f4bfb75a120a986ac12867af15c65be",4425 "reference": "71531e9a8f4bfb75a120a986ac12867af15c65be",4426 "shasum": ""4427 },4428 "require": {4429 "php": ">=7.0.0",4430 "psr/simple-cache": "~1.0 || ~2.0"4431 },4432 "provide": {4433 "psr/simple-cache-implementation": "1.0"4434 },4435 "require-dev": {4436 "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0"4437 },4438 "suggest": {4439 "predis/predis": "~1.1 || ~2.0 || ~3.0",4440 "symfony/var-exporter": "~3.0 || ~4.0 || ~5.0 || ~6.0 || ~7.0"4441 },4442 "type": "library",4443 "autoload": {4444 "psr-4": {4445 "voku\\cache\\": "src/voku/cache/"4446 }4447 },4448 "notification-url": "https://packagist.org/downloads/",4449 "license": [4450 "MIT"4451 ],4452 "authors": [4453 {4454 "name": "Lars Moelleken",4455 "homepage": "https://www.moelleken.org/",4456 "role": "Developer"4457 }4458 ],4459 "description": "Simple Cache library",4460 "homepage": "https://github.com/voku/simple-cache",4461 "keywords": [4462 "cache",4463 "caching",4464 "php",4465 "simple cache"4466 ],4467 "support": {4468 "issues": "https://github.com/voku/simple-cache/issues",4469 "source": "https://github.com/voku/simple-cache/tree/5.0.0"4470 },4471 "funding": [4472 {4473 "url": "https://www.paypal.me/moelleken",4474 "type": "custom"4475 },4476 {4477 "url": "https://github.com/voku",4478 "type": "github"4479 },4480 {4481 "url": "https://www.patreon.com/voku",4482 "type": "patreon"4483 },4484 {4485 "url": "https://tidelift.com/funding/github/packagist/voku/simple-cache",4486 "type": "tidelift"4487 }4488 ],4489 "time": "2025-10-29T13:00:29+00:00"4490 },4491 {4492 "name": "webmozart/assert",4493 "version": "1.12.1",4494 "source": {4495 "type": "git",4496 "url": "https://github.com/webmozarts/assert.git",4497 "reference": "9be6926d8b485f55b9229203f962b51ed377ba68"4498 },4499 "dist": {4500 "type": "zip",4501 "url": "https://api.github.com/repos/webmozarts/assert/zipball/9be6926d8b485f55b9229203f962b51ed377ba68",4502 "reference": "9be6926d8b485f55b9229203f962b51ed377ba68",4503 "shasum": ""4504 },4505 "require": {4506 "ext-ctype": "*",4507 "ext-date": "*",4508 "ext-filter": "*",4509 "php": "^7.2 || ^8.0"4510 },4511 "suggest": {4512 "ext-intl": "",4513 "ext-simplexml": "",4514 "ext-spl": ""4515 },4516 "type": "library",4517 "extra": {4518 "branch-alias": {4519 "dev-master": "1.10-dev"4520 }4521 },4522 "autoload": {4523 "psr-4": {4524 "Webmozart\\Assert\\": "src/"4525 }4526 },4527 "notification-url": "https://packagist.org/downloads/",4528 "license": [4529 "MIT"4530 ],4531 "authors": [4532 {4533 "name": "Bernhard Schussek",4534 "email": "bschussek@gmail.com"4535 }4536 ],4537 "description": "Assertions to validate method input/output with nice error messages.",4538 "keywords": [4539 "assert",4540 "check",4541 "validate"4542 ],4543 "support": {4544 "issues": "https://github.com/webmozarts/assert/issues",4545 "source": "https://github.com/webmozarts/assert/tree/1.12.1"4546 },4547 "time": "2025-10-29T15:56:20+00:00"4548 900 } 4549 901 ], 902 "packages-dev": [], 4550 903 "aliases": [], 4551 904 "minimum-stability": "dev", -
sg-ai-studio/trunk/core/Helper/HelperAuth.php
r3505951 r3562098 103 103 private ?string $token = null; 104 104 private ?float $token_expiry = null; 105 106 /** 107 * Minimum RSA modulus size (bits) accepted for RSA-based keys (RS and PS families). 108 */ 109 private const MIN_RSA_BITS = 2048; 110 111 /** 112 * Minimum secret length (bytes) per HMAC algorithm, matching the hash output size. 113 * Mirrors the key-length validation added upstream in firebase/php-jwt v7 (CVE-2025-45769), 114 * backported here so we stay on the PHP 7.4-compatible 6.x line. 115 */ 116 private const HMAC_MIN_KEY_BYTES = array( 117 'HS256' => 32, 118 'HS384' => 48, 119 'HS512' => 64, 120 ); 105 121 106 122 public function __construct( … … 172 188 } 173 189 190 /** 191 * Reject signing/verification keys that are too weak for the given algorithm. 192 * 193 * @param string $key The key material (HMAC secret, or PEM private/public key). 194 * @param string $algorithm The JWT algorithm the key will be used with. 195 * @param bool $is_private Whether $key is a private key (true) or public key (false). 196 * 197 * @throws SignApiAuthException When the key does not meet the minimum strength. 198 */ 199 private function validate_key_strength( string $key, string $algorithm, bool $is_private ): void { 200 // HMAC: the symmetric secret must be at least as long as the hash output. 201 if ( isset( self::HMAC_MIN_KEY_BYTES[ $algorithm ] ) ) { 202 $min = self::HMAC_MIN_KEY_BYTES[ $algorithm ]; 203 if ( strlen( $key ) < $min ) { 204 throw new SignApiAuthException( 205 sprintf( 'Insecure HMAC key for %s: %d bytes provided, %d required', $algorithm, strlen( $key ), $min ) 206 ); 207 } 208 return; 209 } 210 211 // Asymmetric (RS, PS, ES families): inspect the key material via OpenSSL. 212 $pkey = $is_private ? openssl_pkey_get_private( $key ) : openssl_pkey_get_public( $key ); 213 if ( false === $pkey ) { 214 throw new SignApiAuthException( 'Invalid key supplied for ' . esc_html( $algorithm ) ); 215 } 216 217 $details = openssl_pkey_get_details( $pkey ); 218 if ( false === $details ) { 219 throw new SignApiAuthException( 'Unable to read key details for ' . esc_html( $algorithm ) ); 220 } 221 222 if ( 223 ( $details['type'] ?? null ) === OPENSSL_KEYTYPE_RSA 224 && ( $details['bits'] ?? 0 ) < self::MIN_RSA_BITS 225 ) { 226 throw new SignApiAuthException( 227 sprintf( 'Insecure RSA key for %s: %d bits, minimum %d required', $algorithm, $details['bits'] ?? 0, self::MIN_RSA_BITS ) 228 ); 229 } 230 } 231 174 232 private function generate_token( array $key_data, int $retries = 5, ?array $extra_payload = null ): string 175 233 { … … 187 245 } 188 246 247 $this->validate_key_strength( $private_key, $this->algorithm, true ); 189 248 $token = JWT::encode( $payload, $private_key, $this->algorithm ); 190 249 $token_request = new TokenRequest( $token, $service, $client, $client_key ); … … 323 382 foreach ( $algorithms as $algorithm ) { 324 383 try { 384 $this->validate_key_strength( trim( $service_key['key_pub'] ), $algorithm, false ); 325 385 $decoded_data = JWT::decode( $token, new Key( trim( $service_key['key_pub'] ), $algorithm ) ); 326 386 $decoded_data = (array) $decoded_data; … … 372 432 $key_value = trim( $public_key['key_pub'] ); 373 433 434 $this->validate_key_strength( $key_value, $this->algorithm, false ); 374 435 $decoded_data = JWT::decode( $token, new Key( $key_value, $this->algorithm ) ); 375 436 $decoded_data = (array) $decoded_data; -
sg-ai-studio/trunk/readme.txt
r3561022 r3562098 4 4 Requires at least: 5.0 5 5 Tested up to: 7.0 6 Stable tag: 1.2. 16 Stable tag: 1.2.2 7 7 Requires PHP: 7.4 8 8 License: GPLv3 … … 215 215 216 216 == Changelog == 217 = 1.2.2 = 218 Release Date June 5th, 2026 219 * php-jwt dependency version update 220 * Changes to signing/verification keys validation process 221 217 222 = 1.2.1 = 218 223 Release Date June 4th, 2026 -
sg-ai-studio/trunk/sg-ai-studio.php
r3561022 r3562098 11 11 * Plugin URI: https://siteground.com 12 12 * Description: Manage your WordPress site with AI - create content, install plugins, and perform site management tasks effortlessly. 13 * Version: 1.2. 113 * Version: 1.2.2 14 14 * Author: SiteGround 15 15 * Author URI: https://www.siteground.com … … 34 34 // Define version constant. 35 35 if ( ! defined( __NAMESPACE__ . '\VERSION' ) ) { 36 define( __NAMESPACE__ . '\VERSION', '1.2. 1' );36 define( __NAMESPACE__ . '\VERSION', '1.2.2' ); 37 37 } 38 38 -
sg-ai-studio/trunk/vendor/autoload.php
r3519232 r3562098 20 20 require_once __DIR__ . '/composer/autoload_real.php'; 21 21 22 return ComposerAutoloaderInit 0382e0644fae7cd5247775f6ea49cb88::getLoader();22 return ComposerAutoloaderInit2b259b51f87deb57726fd6be9f32d885::getLoader(); -
sg-ai-studio/trunk/vendor/composer/autoload_classmap.php
r3505951 r3562098 7 7 8 8 return array( 9 'Attribute' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', 9 10 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', 11 'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', 12 'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', 13 'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', 14 'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', 10 15 ); -
sg-ai-studio/trunk/vendor/composer/autoload_files.php
r3519232 r3562098 7 7 8 8 return array( 9 '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php', 10 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php', 9 11 '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php', 10 '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php',11 12 '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php', 12 13 ); -
sg-ai-studio/trunk/vendor/composer/autoload_psr4.php
r3538917 r3562098 7 7 8 8 return array( 9 'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'), 9 10 'SiteGround_i18n\\' => array($vendorDir . '/siteground/siteground-i18n/src'), 10 11 'SiteGround_Helper\\' => array($vendorDir . '/siteground/siteground-helper/src'), -
sg-ai-studio/trunk/vendor/composer/autoload_real.php
r3519232 r3562098 3 3 // autoload_real.php @generated by Composer 4 4 5 class ComposerAutoloaderInit 0382e0644fae7cd5247775f6ea49cb885 class ComposerAutoloaderInit2b259b51f87deb57726fd6be9f32d885 6 6 { 7 7 private static $loader; … … 25 25 require __DIR__ . '/platform_check.php'; 26 26 27 spl_autoload_register(array('ComposerAutoloaderInit 0382e0644fae7cd5247775f6ea49cb88', 'loadClassLoader'), true, true);27 spl_autoload_register(array('ComposerAutoloaderInit2b259b51f87deb57726fd6be9f32d885', 'loadClassLoader'), true, true); 28 28 self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); 29 spl_autoload_unregister(array('ComposerAutoloaderInit 0382e0644fae7cd5247775f6ea49cb88', 'loadClassLoader'));29 spl_autoload_unregister(array('ComposerAutoloaderInit2b259b51f87deb57726fd6be9f32d885', 'loadClassLoader')); 30 30 31 31 require __DIR__ . '/autoload_static.php'; 32 call_user_func(\Composer\Autoload\ComposerStaticInit 0382e0644fae7cd5247775f6ea49cb88::getInitializer($loader));32 call_user_func(\Composer\Autoload\ComposerStaticInit2b259b51f87deb57726fd6be9f32d885::getInitializer($loader)); 33 33 34 34 $loader->register(true); 35 35 36 $filesToLoad = \Composer\Autoload\ComposerStaticInit 0382e0644fae7cd5247775f6ea49cb88::$files;36 $filesToLoad = \Composer\Autoload\ComposerStaticInit2b259b51f87deb57726fd6be9f32d885::$files; 37 37 $requireFile = \Closure::bind(static function ($fileIdentifier, $file) { 38 38 if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { -
sg-ai-studio/trunk/vendor/composer/autoload_static.php
r3538917 r3562098 5 5 namespace Composer\Autoload; 6 6 7 class ComposerStaticInit 0382e0644fae7cd5247775f6ea49cb887 class ComposerStaticInit2b259b51f87deb57726fd6be9f32d885 8 8 { 9 9 public static $files = array ( 10 '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', 11 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', 10 12 '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php', 11 '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php',12 13 '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php', 13 14 ); … … 16 17 'S' => 17 18 array ( 19 'Symfony\\Polyfill\\Php80\\' => 23, 18 20 'SiteGround_i18n\\' => 16, 19 21 'SiteGround_Helper\\' => 18, … … 43 45 44 46 public static $prefixDirsPsr4 = array ( 47 'Symfony\\Polyfill\\Php80\\' => 48 array ( 49 0 => __DIR__ . '/..' . '/symfony/polyfill-php80', 50 ), 45 51 'SiteGround_i18n\\' => 46 52 array ( … … 101 107 102 108 public static $classMap = array ( 109 'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', 103 110 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', 111 'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', 112 'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', 113 'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', 114 'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', 104 115 ); 105 116 … … 107 118 { 108 119 return \Closure::bind(function () use ($loader) { 109 $loader->prefixLengthsPsr4 = ComposerStaticInit 0382e0644fae7cd5247775f6ea49cb88::$prefixLengthsPsr4;110 $loader->prefixDirsPsr4 = ComposerStaticInit 0382e0644fae7cd5247775f6ea49cb88::$prefixDirsPsr4;111 $loader->prefixesPsr0 = ComposerStaticInit 0382e0644fae7cd5247775f6ea49cb88::$prefixesPsr0;112 $loader->classMap = ComposerStaticInit 0382e0644fae7cd5247775f6ea49cb88::$classMap;120 $loader->prefixLengthsPsr4 = ComposerStaticInit2b259b51f87deb57726fd6be9f32d885::$prefixLengthsPsr4; 121 $loader->prefixDirsPsr4 = ComposerStaticInit2b259b51f87deb57726fd6be9f32d885::$prefixDirsPsr4; 122 $loader->prefixesPsr0 = ComposerStaticInit2b259b51f87deb57726fd6be9f32d885::$prefixesPsr0; 123 $loader->classMap = ComposerStaticInit2b259b51f87deb57726fd6be9f32d885::$classMap; 113 124 114 125 }, null, ClassLoader::class); -
sg-ai-studio/trunk/vendor/composer/installed.json
r3561022 r3562098 58 58 { 59 59 "name": "firebase/php-jwt", 60 "version": "v 7.0.5",61 "version_normalized": " 7.0.5.0",60 "version": "v6.10.0", 61 "version_normalized": "6.10.0.0", 62 62 "source": { 63 63 "type": "git", 64 64 "url": "https://github.com/googleapis/php-jwt.git", 65 "reference": " 47ad26bab5e7c70ae8a6f08ed25ff83631121380"66 }, 67 "dist": { 68 "type": "zip", 69 "url": "https://api.github.com/repos/googleapis/php-jwt/zipball/ 47ad26bab5e7c70ae8a6f08ed25ff83631121380",70 "reference": " 47ad26bab5e7c70ae8a6f08ed25ff83631121380",71 "shasum": "" 72 }, 73 "require": { 74 "php": "^ 8.0"65 "reference": "a49db6f0a5033aef5143295342f1c95521b075ff" 66 }, 67 "dist": { 68 "type": "zip", 69 "url": "https://api.github.com/repos/googleapis/php-jwt/zipball/a49db6f0a5033aef5143295342f1c95521b075ff", 70 "reference": "a49db6f0a5033aef5143295342f1c95521b075ff", 71 "shasum": "" 72 }, 73 "require": { 74 "php": "^7.4||^8.0" 75 75 }, 76 76 "require-dev": { 77 "guzzlehttp/guzzle": "^7.4", 78 "phpfastcache/phpfastcache": "^9.2", 77 "guzzlehttp/guzzle": "^6.5||^7.4", 79 78 "phpspec/prophecy-phpunit": "^2.0", 80 79 "phpunit/phpunit": "^9.5", 81 "psr/cache": "^ 2.0||^3.0",80 "psr/cache": "^1.0||^2.0", 82 81 "psr/http-client": "^1.0", 83 82 "psr/http-factory": "^1.0" … … 87 86 "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" 88 87 }, 89 "time": "202 6-04-01T20:38:03+00:00",88 "time": "2023-12-01T16:26:39+00:00", 90 89 "type": "library", 91 90 "installation-source": "dist", … … 119 118 "support": { 120 119 "issues": "https://github.com/googleapis/php-jwt/issues", 121 "source": "https://github.com/googleapis/php-jwt/tree/v 7.0.5"120 "source": "https://github.com/googleapis/php-jwt/tree/v6.10.0" 122 121 }, 123 122 "install-path": "../firebase/php-jwt" … … 125 124 { 126 125 "name": "guzzlehttp/guzzle", 127 "version": "7.1 0.6",128 "version_normalized": "7.1 0.6.0",126 "version": "7.11.0", 127 "version_normalized": "7.11.0.0", 129 128 "source": { 130 129 "type": "git", 131 130 "url": "https://github.com/guzzle/guzzle.git", 132 "reference": " e7412b3180912c01650cc66647f18c1d1cbe9b94"133 }, 134 "dist": { 135 "type": "zip", 136 "url": "https://api.github.com/repos/guzzle/guzzle/zipball/ e7412b3180912c01650cc66647f18c1d1cbe9b94",137 "reference": " e7412b3180912c01650cc66647f18c1d1cbe9b94",131 "reference": "c987f8ce84b8434fa430795eca0f3430663da72b" 132 }, 133 "dist": { 134 "type": "zip", 135 "url": "https://api.github.com/repos/guzzle/guzzle/zipball/c987f8ce84b8434fa430795eca0f3430663da72b", 136 "reference": "c987f8ce84b8434fa430795eca0f3430663da72b", 138 137 "shasum": "" 139 138 }, 140 139 "require": { 141 140 "ext-json": "*", 142 "guzzlehttp/promises": "^2. 3",143 "guzzlehttp/psr7": "^2. 8",141 "guzzlehttp/promises": "^2.5", 142 "guzzlehttp/psr7": "^2.11", 144 143 "php": "^7.2.5 || ^8.0", 145 144 "psr/http-client": "^1.0", 146 "symfony/deprecation-contracts": "^2.2 || ^3.0" 145 "symfony/deprecation-contracts": "^2.5 || ^3.0", 146 "symfony/polyfill-php80": "^1.24" 147 147 }, 148 148 "provide": { … … 163 163 "psr/log": "Required for using the Log middleware" 164 164 }, 165 "time": "2026-06-0 1T13:06:22+00:00",165 "time": "2026-06-02T12:40:51+00:00", 166 166 "type": "library", 167 167 "extra": { … … 235 235 "support": { 236 236 "issues": "https://github.com/guzzle/guzzle/issues", 237 "source": "https://github.com/guzzle/guzzle/tree/7.1 0.6"237 "source": "https://github.com/guzzle/guzzle/tree/7.11.0" 238 238 }, 239 239 "funding": [ … … 255 255 { 256 256 "name": "guzzlehttp/promises", 257 "version": "2. 4.1",258 "version_normalized": "2. 4.1.0",257 "version": "2.5.0", 258 "version_normalized": "2.5.0.0", 259 259 "source": { 260 260 "type": "git", 261 261 "url": "https://github.com/guzzle/promises.git", 262 "reference": "09e8a212562fb1fb6a512c4156ed71525969d6c2" 263 }, 264 "dist": { 265 "type": "zip", 266 "url": "https://api.github.com/repos/guzzle/promises/zipball/09e8a212562fb1fb6a512c4156ed71525969d6c2", 267 "reference": "09e8a212562fb1fb6a512c4156ed71525969d6c2", 268 "shasum": "" 269 }, 270 "require": { 271 "php": "^7.2.5 || ^8.0" 262 "reference": "4360e982f87f5f258bf872d094647791db2f4c8e" 263 }, 264 "dist": { 265 "type": "zip", 266 "url": "https://api.github.com/repos/guzzle/promises/zipball/4360e982f87f5f258bf872d094647791db2f4c8e", 267 "reference": "4360e982f87f5f258bf872d094647791db2f4c8e", 268 "shasum": "" 269 }, 270 "require": { 271 "php": "^7.2.5 || ^8.0", 272 "symfony/deprecation-contracts": "^2.5 || ^3.0" 272 273 }, 273 274 "require-dev": { … … 275 276 "phpunit/phpunit": "^8.5.52 || ^9.6.34" 276 277 }, 277 "time": "2026-0 5-20T22:57:30+00:00",278 "time": "2026-06-02T12:23:43+00:00", 278 279 "type": "library", 279 280 "extra": { … … 321 322 "support": { 322 323 "issues": "https://github.com/guzzle/promises/issues", 323 "source": "https://github.com/guzzle/promises/tree/2. 4.1"324 "source": "https://github.com/guzzle/promises/tree/2.5.0" 324 325 }, 325 326 "funding": [ … … 341 342 { 342 343 "name": "guzzlehttp/psr7", 343 "version": "2.1 0.4",344 "version_normalized": "2.1 0.4.0",344 "version": "2.11.0", 345 "version_normalized": "2.11.0.0", 345 346 "source": { 346 347 "type": "git", 347 348 "url": "https://github.com/guzzle/psr7.git", 348 "reference": " d2a1a094e396da8957e797489fddaf860c340cfc"349 }, 350 "dist": { 351 "type": "zip", 352 "url": "https://api.github.com/repos/guzzle/psr7/zipball/ d2a1a094e396da8957e797489fddaf860c340cfc",353 "reference": " d2a1a094e396da8957e797489fddaf860c340cfc",349 "reference": "bbb5e61349fa5cb822b3e87842b951088b76b81f" 350 }, 351 "dist": { 352 "type": "zip", 353 "url": "https://api.github.com/repos/guzzle/psr7/zipball/bbb5e61349fa5cb822b3e87842b951088b76b81f", 354 "reference": "bbb5e61349fa5cb822b3e87842b951088b76b81f", 354 355 "shasum": "" 355 356 }, … … 358 359 "psr/http-factory": "^1.0", 359 360 "psr/http-message": "^1.1 || ^2.0", 360 "ralouphie/getallheaders": "^3.0" 361 "ralouphie/getallheaders": "^3.0", 362 "symfony/deprecation-contracts": "^2.5 || ^3.0", 363 "symfony/polyfill-php80": "^1.24" 361 364 }, 362 365 "provide": { … … 373 376 "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" 374 377 }, 375 "time": "2026-0 5-29T12:59:07+00:00",378 "time": "2026-06-02T12:30:48+00:00", 376 379 "type": "library", 377 380 "extra": { … … 441 444 "support": { 442 445 "issues": "https://github.com/guzzle/psr7/issues", 443 "source": "https://github.com/guzzle/psr7/tree/2.1 0.4"446 "source": "https://github.com/guzzle/psr7/tree/2.11.0" 444 447 }, 445 448 "funding": [ … … 844 847 ], 845 848 "install-path": "../symfony/deprecation-contracts" 849 }, 850 { 851 "name": "symfony/polyfill-php80", 852 "version": "v1.37.0", 853 "version_normalized": "1.37.0.0", 854 "source": { 855 "type": "git", 856 "url": "https://github.com/symfony/polyfill-php80.git", 857 "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411" 858 }, 859 "dist": { 860 "type": "zip", 861 "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dfb55726c3a76ea3b6459fcfda1ec2d80a682411", 862 "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411", 863 "shasum": "" 864 }, 865 "require": { 866 "php": ">=7.2" 867 }, 868 "time": "2026-04-10T16:19:22+00:00", 869 "type": "library", 870 "extra": { 871 "thanks": { 872 "url": "https://github.com/symfony/polyfill", 873 "name": "symfony/polyfill" 874 } 875 }, 876 "installation-source": "dist", 877 "autoload": { 878 "files": [ 879 "bootstrap.php" 880 ], 881 "psr-4": { 882 "Symfony\\Polyfill\\Php80\\": "" 883 }, 884 "classmap": [ 885 "Resources/stubs" 886 ] 887 }, 888 "notification-url": "https://packagist.org/downloads/", 889 "license": [ 890 "MIT" 891 ], 892 "authors": [ 893 { 894 "name": "Ion Bazan", 895 "email": "ion.bazan@gmail.com" 896 }, 897 { 898 "name": "Nicolas Grekas", 899 "email": "p@tchwork.com" 900 }, 901 { 902 "name": "Symfony Community", 903 "homepage": "https://symfony.com/contributors" 904 } 905 ], 906 "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", 907 "homepage": "https://symfony.com", 908 "keywords": [ 909 "compatibility", 910 "polyfill", 911 "portable", 912 "shim" 913 ], 914 "support": { 915 "source": "https://github.com/symfony/polyfill-php80/tree/v1.37.0" 916 }, 917 "funding": [ 918 { 919 "url": "https://symfony.com/sponsor", 920 "type": "custom" 921 }, 922 { 923 "url": "https://github.com/fabpot", 924 "type": "github" 925 }, 926 { 927 "url": "https://github.com/nicolas-grekas", 928 "type": "github" 929 }, 930 { 931 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 932 "type": "tidelift" 933 } 934 ], 935 "install-path": "../symfony/polyfill-php80" 846 936 } 847 937 ], -
sg-ai-studio/trunk/vendor/composer/installed.php
r3561022 r3562098 4 4 'pretty_version' => 'dev-main', 5 5 'version' => 'dev-main', 6 'reference' => ' fe7f077ab47315f1680beb74b0f655f9464be3d1',6 'reference' => '14a6fc2fa2e15bfbe1bc3422e874d18c9ac7a87c', 7 7 'type' => 'wordpress-plugin', 8 8 'install_path' => __DIR__ . '/../../', … … 23 23 ), 24 24 'firebase/php-jwt' => array( 25 'pretty_version' => 'v 7.0.5',26 'version' => ' 7.0.5.0',27 'reference' => ' 47ad26bab5e7c70ae8a6f08ed25ff83631121380',25 'pretty_version' => 'v6.10.0', 26 'version' => '6.10.0.0', 27 'reference' => 'a49db6f0a5033aef5143295342f1c95521b075ff', 28 28 'type' => 'library', 29 29 'install_path' => __DIR__ . '/../firebase/php-jwt', … … 32 32 ), 33 33 'guzzlehttp/guzzle' => array( 34 'pretty_version' => '7.1 0.6',35 'version' => '7.1 0.6.0',36 'reference' => ' e7412b3180912c01650cc66647f18c1d1cbe9b94',34 'pretty_version' => '7.11.0', 35 'version' => '7.11.0.0', 36 'reference' => 'c987f8ce84b8434fa430795eca0f3430663da72b', 37 37 'type' => 'library', 38 38 'install_path' => __DIR__ . '/../guzzlehttp/guzzle', … … 41 41 ), 42 42 'guzzlehttp/promises' => array( 43 'pretty_version' => '2. 4.1',44 'version' => '2. 4.1.0',45 'reference' => ' 09e8a212562fb1fb6a512c4156ed71525969d6c2',43 'pretty_version' => '2.5.0', 44 'version' => '2.5.0.0', 45 'reference' => '4360e982f87f5f258bf872d094647791db2f4c8e', 46 46 'type' => 'library', 47 47 'install_path' => __DIR__ . '/../guzzlehttp/promises', … … 50 50 ), 51 51 'guzzlehttp/psr7' => array( 52 'pretty_version' => '2.1 0.4',53 'version' => '2.1 0.4.0',54 'reference' => ' d2a1a094e396da8957e797489fddaf860c340cfc',52 'pretty_version' => '2.11.0', 53 'version' => '2.11.0.0', 54 'reference' => 'bbb5e61349fa5cb822b3e87842b951088b76b81f', 55 55 'type' => 'library', 56 56 'install_path' => __DIR__ . '/../guzzlehttp/psr7', … … 124 124 'pretty_version' => 'dev-main', 125 125 'version' => 'dev-main', 126 'reference' => ' fe7f077ab47315f1680beb74b0f655f9464be3d1',126 'reference' => '14a6fc2fa2e15bfbe1bc3422e874d18c9ac7a87c', 127 127 'type' => 'wordpress-plugin', 128 128 'install_path' => __DIR__ . '/../../', … … 161 161 'dev_requirement' => false, 162 162 ), 163 'symfony/polyfill-php80' => array( 164 'pretty_version' => 'v1.37.0', 165 'version' => '1.37.0.0', 166 'reference' => 'dfb55726c3a76ea3b6459fcfda1ec2d80a682411', 167 'type' => 'library', 168 'install_path' => __DIR__ . '/../symfony/polyfill-php80', 169 'aliases' => array(), 170 'dev_requirement' => false, 171 ), 163 172 ), 164 173 ); -
sg-ai-studio/trunk/vendor/composer/platform_check.php
r3561022 r3562098 5 5 $issues = array(); 6 6 7 if (!(PHP_VERSION_ID >= 80000)) {8 $issues[] = 'Your Composer dependencies require a PHP version ">= 8.0.0". You are running ' . PHP_VERSION . '.';7 if (!(PHP_VERSION_ID >= 70400)) { 8 $issues[] = 'Your Composer dependencies require a PHP version ">= 7.4.0". You are running ' . PHP_VERSION . '.'; 9 9 } 10 10 -
sg-ai-studio/trunk/vendor/firebase/php-jwt/CHANGELOG.md
r3561022 r3562098 1 1 # Changelog 2 3 ## [7.0.5](https://github.com/firebase/php-jwt/compare/v7.0.4...v7.0.5) (2026-03-31)4 5 6 ### Bug Fixes7 8 * RSA from JWK sometimes returns empty Instance ([#628](https://github.com/firebase/php-jwt/issues/628)) ([b4c78aa](https://github.com/firebase/php-jwt/commit/b4c78aa731664122198ad36c0033aa29e807397a))9 10 ## [7.0.4](https://github.com/firebase/php-jwt/compare/v7.0.3...v7.0.4) (2026-03-27)11 12 13 ### Bug Fixes14 15 * readme examples, add tests for all examples ([#626](https://github.com/firebase/php-jwt/issues/626)) ([510a00c](https://github.com/firebase/php-jwt/commit/510a00c0e6353bc7d68412fab67e57a13954cb46))16 * use urlsafeB64Decode everywhere ([#627](https://github.com/firebase/php-jwt/issues/627)) ([b889495](https://github.com/firebase/php-jwt/commit/b889495c83ddc3f3885ca3f0b65b41b1cb37a3b1))17 18 ## [7.0.3](https://github.com/firebase/php-jwt/compare/v7.0.2...v7.0.3) (2026-02-18)19 20 21 ### Miscellaneous Chores22 23 * add environment for Release Please job ([#619](https://github.com/firebase/php-jwt/issues/619)) ([300fd02](https://github.com/firebase/php-jwt/commit/300fd02c883f096c9067df652dbd23f62cb5e2a7))24 25 ## [7.0.2](https://github.com/firebase/php-jwt/compare/v7.0.1...v7.0.2) (2025-12-16)26 27 28 ### Bug Fixes29 30 * add key length validation for ec keys ([#615](https://github.com/firebase/php-jwt/issues/615)) ([7044f9a](https://github.com/firebase/php-jwt/commit/7044f9ae7e7d175d28cca71714feb236f1c0e252))31 32 ## [7.0.0](https://github.com/firebase/php-jwt/compare/v6.11.1...v7.0.0) (2025-12-15)33 34 35 ### ⚠️ ⚠️ ⚠️ Security Fixes ⚠️ ⚠️ ⚠️36 * add key size validation ([#613](https://github.com/firebase/php-jwt/issues/613)) ([6b80341](https://github.com/firebase/php-jwt/commit/6b80341bf57838ea2d011487917337901cd71576))37 **NOTE**: This fix will cause keys with a size below the minimally allowed size to break.38 39 ### Features40 41 * add SensitiveParameter attribute to security-critical parameters ([#603](https://github.com/firebase/php-jwt/issues/603)) ([4dbfac0](https://github.com/firebase/php-jwt/commit/4dbfac0260eeb0e9e643063c99998e3219cc539b))42 * store timestamp in `ExpiredException` ([#604](https://github.com/firebase/php-jwt/issues/604)) ([f174826](https://github.com/firebase/php-jwt/commit/f1748260d218a856b6a0c23715ac7fae1d7ca95b))43 44 45 ### Bug Fixes46 47 * validate iat and nbf on payload ([#568](https://github.com/firebase/php-jwt/issues/568)) ([953b2c8](https://github.com/firebase/php-jwt/commit/953b2c88bb445b7e3bb82a5141928f13d7343afd))48 49 ## [6.11.1](https://github.com/firebase/php-jwt/compare/v6.11.0...v6.11.1) (2025-04-09)50 51 52 ### Bug Fixes53 54 * update error text for consistency ([#528](https://github.com/firebase/php-jwt/issues/528)) ([c11113a](https://github.com/firebase/php-jwt/commit/c11113afa13265e016a669e75494b9203b8a7775))55 56 ## [6.11.0](https://github.com/firebase/php-jwt/compare/v6.10.2...v6.11.0) (2025-01-23)57 58 59 ### Features60 61 * support octet typed JWK ([#587](https://github.com/firebase/php-jwt/issues/587)) ([7cb8a26](https://github.com/firebase/php-jwt/commit/7cb8a265fa81edf2fa6ef8098f5bc5ae573c33ad))62 63 64 ### Bug Fixes65 66 * refactor constructor Key to use PHP 8.0 syntax ([#577](https://github.com/firebase/php-jwt/issues/577)) ([29fa2ce](https://github.com/firebase/php-jwt/commit/29fa2ce9e0582cd397711eec1e80c05ce20fabca))67 68 ## [6.10.2](https://github.com/firebase/php-jwt/compare/v6.10.1...v6.10.2) (2024-11-24)69 70 71 ### Bug Fixes72 73 * Mitigate PHP8.4 deprecation warnings ([#570](https://github.com/firebase/php-jwt/issues/570)) ([76808fa](https://github.com/firebase/php-jwt/commit/76808fa227f3811aa5cdb3bf81233714b799a5b5))74 * support php 8.4 ([#583](https://github.com/firebase/php-jwt/issues/583)) ([e3d68b0](https://github.com/firebase/php-jwt/commit/e3d68b044421339443c74199edd020e03fb1887e))75 76 ## [6.10.1](https://github.com/firebase/php-jwt/compare/v6.10.0...v6.10.1) (2024-05-18)77 78 79 ### Bug Fixes80 81 * ensure ratelimit expiry is set every time ([#556](https://github.com/firebase/php-jwt/issues/556)) ([09cb208](https://github.com/firebase/php-jwt/commit/09cb2081c2c3bc0f61e2f2a5fbea5741f7498648))82 * ratelimit cache expiration ([#550](https://github.com/firebase/php-jwt/issues/550)) ([dda7250](https://github.com/firebase/php-jwt/commit/dda725033585ece30ff8cae8937320d7e9f18bae))83 2 84 3 ## [6.10.0](https://github.com/firebase/php-jwt/compare/v6.9.0...v6.10.0) (2023-11-28) -
sg-ai-studio/trunk/vendor/firebase/php-jwt/README.md
r3561022 r3562098 18 18 19 19 Optionally, install the `paragonie/sodium_compat` package from composer if your 20 php envdoes not have libsodium installed:20 php is < 7.2 or does not have libsodium installed: 21 21 22 22 ```bash … … 24 24 ``` 25 25 26 ##Example27 26 Example 27 ------- 28 28 ```php 29 29 use Firebase\JWT\JWT; 30 30 use Firebase\JWT\Key; 31 31 32 $key = 'example_key _of_sufficient_length';33 $payload = [ 34 'iss' => ' example.org',35 'aud' => ' example.com',32 $key = 'example_key'; 33 $payload = [ 34 'iss' => 'http://example.org', 35 'aud' => 'http://example.com', 36 36 'iat' => 1356999524, 37 37 'nbf' => 1357000000 … … 49 49 50 50 // Pass a stdClass in as the third parameter to get the decoded header values 51 $headers = new stdClass(); 52 $decoded = JWT::decode($jwt, new Key($key, 'HS256'), $headers); 51 $decoded = JWT::decode($jwt, new Key($key, 'HS256'), $headers = new stdClass()); 53 52 print_r($headers); 54 53 … … 70 69 $decoded = JWT::decode($jwt, new Key($key, 'HS256')); 71 70 ``` 72 73 ## Example encode/decode headers 74 71 Example encode/decode headers 72 ------- 75 73 Decoding the JWT headers without verifying the JWT first is NOT recommended, and is not supported by 76 74 this library. This is because without verifying the JWT, the header values could have been tampered with. … … 82 80 use Firebase\JWT\JWT; 83 81 84 $key = 'example_key _of_sufficient_length';85 $payload = [ 86 'iss' => ' example.org',87 'aud' => ' example.com',82 $key = 'example_key'; 83 $payload = [ 84 'iss' => 'http://example.org', 85 'aud' => 'http://example.com', 88 86 'iat' => 1356999524, 89 87 'nbf' => 1357000000 … … 105 103 print_r($decoded); 106 104 ``` 107 108 ## Example with RS256 (openssl) 109 105 Example with RS256 (openssl) 106 ---------------------------- 110 107 ```php 111 108 use Firebase\JWT\JWT; … … 175 172 ``` 176 173 177 ## Example with a passphrase 174 Example with a passphrase 175 ------------------------- 178 176 179 177 ```php … … 188 186 $privateKeyFile = '/path/to/key-with-passphrase.pem'; 189 187 190 / ** @var OpenSSLAsymmetricKey $privateKey */188 // Create a private key of type "resource" 191 189 $privateKey = openssl_pkey_get_private( 192 190 file_get_contents($privateKeyFile), … … 211 209 ``` 212 210 213 ##Example with EdDSA (libsodium and Ed25519 signature)214 211 Example with EdDSA (libsodium and Ed25519 signature) 212 ---------------------------- 215 213 ```php 216 214 use Firebase\JWT\JWT; … … 240 238 $decoded = JWT::decode($jwt, new Key($publicKey, 'EdDSA')); 241 239 echo "Decode:\n" . print_r((array) $decoded, true) . "\n"; 242 ``` 243 244 ##Example with multiple keys245 240 ```` 241 242 Example with multiple keys 243 -------------------------- 246 244 ```php 247 245 use Firebase\JWT\JWT; … … 249 247 250 248 // Example RSA keys from previous example 251 // $private RsKey= '...';252 // $public RsKey= '...';249 // $privateKey1 = '...'; 250 // $publicKey1 = '...'; 253 251 254 252 // Example EdDSA keys from previous example 255 // $private EcKey= '...';256 // $public EcKey= '...';253 // $privateKey2 = '...'; 254 // $publicKey2 = '...'; 257 255 258 256 $payload = [ … … 263 261 ]; 264 262 265 $jwt1 = JWT::encode($payload, $private RsKey, 'RS256', 'kid1');266 $jwt2 = JWT::encode($payload, $private EcKey, 'EdDSA', 'kid2');263 $jwt1 = JWT::encode($payload, $privateKey1, 'RS256', 'kid1'); 264 $jwt2 = JWT::encode($payload, $privateKey2, 'EdDSA', 'kid2'); 267 265 echo "Encode 1:\n" . print_r($jwt1, true) . "\n"; 268 266 echo "Encode 2:\n" . print_r($jwt2, true) . "\n"; 269 267 270 268 $keys = [ 271 'kid1' => new Key($public RsKey, 'RS256'),272 'kid2' => new Key($public EcKey, 'EdDSA'),269 'kid1' => new Key($publicKey1, 'RS256'), 270 'kid2' => new Key($publicKey2, 'EdDSA'), 273 271 ]; 274 272 … … 280 278 ``` 281 279 282 ## Using JWKs 280 Using JWKs 281 ---------- 283 282 284 283 ```php … … 292 291 // JWK::parseKeySet($jwks) returns an associative array of **kid** to Firebase\JWT\Key 293 292 // objects. Pass this as the second parameter to JWT::decode. 294 $decoded = JWT::decode($jwt, JWK::parseKeySet($jwks));295 print_r($decoded); 296 ``` 297 298 ## Using Cached Key Sets 293 JWT::decode($payload, JWK::parseKeySet($jwks)); 294 ``` 295 296 Using Cached Key Sets 297 --------------------- 299 298 300 299 The `CachedKeySet` class can be used to fetch and cache JWKS (JSON Web Key Sets) from a public URI. … … 316 315 317 316 // Create an HTTP request factory (can be any PSR-17 compatible HTTP request factory) 318 $httpFactory = new GuzzleHttp\Psr 7\HttpFactory();317 $httpFactory = new GuzzleHttp\Psr\HttpFactory(); 319 318 320 319 // Create a cache item pool (can be any PSR-6 compatible cache item pool) … … 351 350 352 351 try { 353 $decoded = JWT::decode($ jwt, $keys);352 $decoded = JWT::decode($payload, $keys); 354 353 } catch (InvalidArgumentException $e) { 355 354 // provided key/key-array is empty or malformed. … … 381 380 use UnexpectedValueException; 382 381 try { 383 $decoded = JWT::decode($ jwt, $keys);382 $decoded = JWT::decode($payload, $keys); 384 383 } catch (LogicException $e) { 385 384 // errors having to do with environmental setup or malformed JWT Keys … … 396 395 ```php 397 396 // return type is stdClass 398 $decoded = JWT::decode($ jwt, $keys);397 $decoded = JWT::decode($payload, $keys); 399 398 400 399 // cast to array … … 407 406 408 407 ```bash 409 $ composer update410 $ vendor/bin/phpunit -cphpunit.xml.dist408 $ pear install PHPUnit 409 $ phpunit --configuration phpunit.xml.dist 411 410 PHPUnit 3.7.10 by Sebastian Bergmann. 412 411 ..... -
sg-ai-studio/trunk/vendor/firebase/php-jwt/src/CachedKeySet.php
r3561022 r3562098 81 81 RequestFactoryInterface $httpFactory, 82 82 CacheItemPoolInterface $cache, 83 ?int $expiresAfter = null,83 int $expiresAfter = null, 84 84 bool $rateLimit = false, 85 ?string $defaultAlg = null85 string $defaultAlg = null 86 86 ) { 87 87 $this->jwksUri = $jwksUri; … … 181 181 if ($jwksResponse->getStatusCode() !== 200) { 182 182 throw new UnexpectedValueException( 183 \sprintf( 184 'HTTP Error: %d %s for URI "%s"', 183 sprintf('HTTP Error: %d %s for URI "%s"', 185 184 $jwksResponse->getStatusCode(), 186 185 $jwksResponse->getReasonPhrase(), … … 214 213 215 214 $cacheItem = $this->cache->getItem($this->rateLimitCacheKey); 216 217 $cacheItemData = []; 218 if ($cacheItem->isHit() && \is_array($data = $cacheItem->get())) { 219 $cacheItemData = $data; 220 } 221 222 $callsPerMinute = $cacheItemData['callsPerMinute'] ?? 0; 223 $expiry = $cacheItemData['expiry'] ?? new \DateTime('+60 seconds', new \DateTimeZone('UTC')); 224 215 if (!$cacheItem->isHit()) { 216 $cacheItem->expiresAfter(1); // # of calls are cached each minute 217 } 218 219 $callsPerMinute = (int) $cacheItem->get(); 225 220 if (++$callsPerMinute > $this->maxCallsPerMinute) { 226 221 return true; 227 222 } 228 229 $cacheItem->set(['expiry' => $expiry, 'callsPerMinute' => $callsPerMinute]); 230 $cacheItem->expiresAt($expiry); 223 $cacheItem->set($callsPerMinute); 231 224 $this->cache->save($cacheItem); 232 225 return false; -
sg-ai-studio/trunk/vendor/firebase/php-jwt/src/ExpiredException.php
r3561022 r3562098 6 6 { 7 7 private object $payload; 8 9 private ?int $timestamp = null;10 8 11 9 public function setPayload(object $payload): void … … 18 16 return $this->payload; 19 17 } 20 21 public function setTimestamp(int $timestamp): void22 {23 $this->timestamp = $timestamp;24 }25 26 public function getTimestamp(): ?int27 {28 return $this->timestamp;29 }30 18 } -
sg-ai-studio/trunk/vendor/firebase/php-jwt/src/JWK.php
r3561022 r3562098 53 53 * @uses parseKey 54 54 */ 55 public static function parseKeySet( #[\SensitiveParameter] array $jwks, ?string $defaultAlg = null): array55 public static function parseKeySet(array $jwks, string $defaultAlg = null): array 56 56 { 57 57 $keys = []; … … 94 94 * @uses createPemFromModulusAndExponent 95 95 */ 96 public static function parseKey( #[\SensitiveParameter] array $jwk, ?string $defaultAlg = null): ?Key96 public static function parseKey(array $jwk, string $defaultAlg = null): ?Key 97 97 { 98 98 if (empty($jwk)) { … … 173 173 $publicKey = JWT::convertBase64urlToBase64($jwk['x']); 174 174 return new Key($publicKey, $jwk['alg']); 175 case 'oct':176 if (!isset($jwk['k'])) {177 throw new UnexpectedValueException('k not set');178 }179 180 return new Key(JWT::urlsafeB64Decode($jwk['k']), $jwk['alg']);181 175 default: 182 176 break; … … 219 213 ); 220 214 221 return \sprintf(215 return sprintf( 222 216 "-----BEGIN PUBLIC KEY-----\n%s\n-----END PUBLIC KEY-----\n", 223 217 wordwrap(base64_encode($pem), 64, "\n", true) … … 241 235 $mod = JWT::urlsafeB64Decode($n); 242 236 $exp = JWT::urlsafeB64Decode($e); 243 // Correct encoding for ASN1, as ints are represented as unsigned in jwk244 // but signed in ASN1. Prepending null byte makes it unsigned.245 if (\strlen($mod) > 0 && \ord($mod[0]) >= 128) {246 $mod = \chr(0) . $mod;247 }248 if (\strlen($exp) > 0 && \ord($exp[0]) >= 128) {249 $exp = \chr(0) . $exp;250 }251 237 252 238 $modulus = \pack('Ca*a*', 2, self::encodeLength(\strlen($mod)), $mod); -
sg-ai-studio/trunk/vendor/firebase/php-jwt/src/JWT.php
r3561022 r3562098 32 32 private const ASN1_BIT_STRING = 0x03; 33 33 34 private const RSA_KEY_MIN_LENGTH = 2048;35 36 34 /** 37 35 * When checking nbf, iat or expiration times, … … 98 96 public static function decode( 99 97 string $jwt, 100 #[\SensitiveParameter]$keyOrKeyArray,101 ?stdClass &$headers = null98 $keyOrKeyArray, 99 stdClass &$headers = null 102 100 ): stdClass { 103 101 // Validate JWT … … 130 128 throw new UnexpectedValueException('Payload must be a JSON object'); 131 129 } 132 if (isset($payload->iat) && !\is_numeric($payload->iat)) {133 throw new UnexpectedValueException('Payload iat must be a number');134 }135 if (isset($payload->nbf) && !\is_numeric($payload->nbf)) {136 throw new UnexpectedValueException('Payload nbf must be a number');137 }138 if (isset($payload->exp) && !\is_numeric($payload->exp)) {139 throw new UnexpectedValueException('Payload exp must be a number');140 }141 142 130 $sig = static::urlsafeB64Decode($cryptob64); 143 131 if (empty($header->alg)) { … … 167 155 if (isset($payload->nbf) && floor($payload->nbf) > ($timestamp + static::$leeway)) { 168 156 $ex = new BeforeValidException( 169 'Cannot handle token with nbf prior to ' . \date(DateTime:: ATOM, (int) floor($payload->nbf))157 'Cannot handle token with nbf prior to ' . \date(DateTime::ISO8601, (int) $payload->nbf) 170 158 ); 171 159 $ex->setPayload($payload); … … 178 166 if (!isset($payload->nbf) && isset($payload->iat) && floor($payload->iat) > ($timestamp + static::$leeway)) { 179 167 $ex = new BeforeValidException( 180 'Cannot handle token with iat prior to ' . \date(DateTime:: ATOM, (int) floor($payload->iat))168 'Cannot handle token with iat prior to ' . \date(DateTime::ISO8601, (int) $payload->iat) 181 169 ); 182 170 $ex->setPayload($payload); … … 188 176 $ex = new ExpiredException('Expired token'); 189 177 $ex->setPayload($payload); 190 $ex->setTimestamp($timestamp);191 178 throw $ex; 192 179 } … … 199 186 * 200 187 * @param array<mixed> $payload PHP array 201 * @param string| OpenSSLAsymmetricKey|OpenSSLCertificate $key The secret key.188 * @param string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate $key The secret key. 202 189 * @param string $alg Supported algorithms are 'ES384','ES256', 'ES256K', 'HS256', 203 190 * 'HS384', 'HS512', 'RS256', 'RS384', and 'RS512' 204 191 * @param string $keyId 205 * @param array<string, string |string[]> $headAn array with header elements to attach192 * @param array<string, string> $head An array with header elements to attach 206 193 * 207 194 * @return string A signed JWT … … 212 199 public static function encode( 213 200 array $payload, 214 #[\SensitiveParameter]$key,201 $key, 215 202 string $alg, 216 ?string $keyId = null,217 ?array $head = null203 string $keyId = null, 204 array $head = null 218 205 ): string { 219 206 $header = ['typ' => 'JWT']; 220 if (isset($head) ) {207 if (isset($head) && \is_array($head)) { 221 208 $header = \array_merge($header, $head); 222 209 } … … 240 227 * 241 228 * @param string $msg The message to sign 242 * @param string| OpenSSLAsymmetricKey|OpenSSLCertificate $key The secret key.229 * @param string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate $key The secret key. 243 230 * @param string $alg Supported algorithms are 'EdDSA', 'ES384', 'ES256', 'ES256K', 'HS256', 244 231 * 'HS384', 'HS512', 'RS256', 'RS384', and 'RS512' … … 250 237 public static function sign( 251 238 string $msg, 252 #[\SensitiveParameter]$key,239 $key, 253 240 string $alg 254 241 ): string { … … 262 249 throw new InvalidArgumentException('key must be a string when using hmac'); 263 250 } 264 self::validateHmacKeyLength($key, $algorithm);265 251 return \hash_hmac($algorithm, $msg, $key, true); 266 252 case 'openssl': 267 253 $signature = ''; 268 if (!$key = openssl_pkey_get_private($key)) { 269 throw new DomainException('OpenSSL unable to validate key'); 270 } 271 if (str_starts_with($alg, 'RS')) { 272 self::validateRsaKeyLength($key); 273 } elseif (str_starts_with($alg, 'ES')) { 274 self::validateEcKeyLength($key, $alg); 275 } 276 $success = \openssl_sign($msg, $signature, $key, $algorithm); 254 $success = \openssl_sign($msg, $signature, $key, $algorithm); // @phpstan-ignore-line 277 255 if (!$success) { 278 256 throw new DomainException('OpenSSL unable to sign data'); … … 285 263 return $signature; 286 264 case 'sodium_crypto': 265 if (!\function_exists('sodium_crypto_sign_detached')) { 266 throw new DomainException('libsodium is not available'); 267 } 268 if (!\is_string($key)) { 269 throw new InvalidArgumentException('key must be a string when using EdDSA'); 270 } 287 271 try { 288 return sodium_crypto_sign_detached($msg, self::validateEdDSAKey($key)); 272 // The last non-empty line is used as the key. 273 $lines = array_filter(explode("\n", $key)); 274 $key = base64_decode((string) end($lines)); 275 if (\strlen($key) === 0) { 276 throw new DomainException('Key cannot be empty string'); 277 } 278 return sodium_crypto_sign_detached($msg, $key); 289 279 } catch (Exception $e) { 290 280 throw new DomainException($e->getMessage(), 0, $e); … … 301 291 * @param string $msg The original message (header and body) 302 292 * @param string $signature The original signature 303 * @param string| OpenSSLAsymmetricKey|OpenSSLCertificate $keyMaterial For Ed*, ES*, HS*, a string key works. for RS*, must be an instance of OpenSSLAsymmetricKey293 * @param string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate $keyMaterial For Ed*, ES*, HS*, a string key works. for RS*, must be an instance of OpenSSLAsymmetricKey 304 294 * @param string $alg The algorithm 305 295 * … … 311 301 string $msg, 312 302 string $signature, 313 #[\SensitiveParameter]$keyMaterial,303 $keyMaterial, 314 304 string $alg 315 305 ): bool { … … 321 311 switch ($function) { 322 312 case 'openssl': 323 if (!$key = openssl_pkey_get_public($keyMaterial)) { 324 throw new DomainException('OpenSSL unable to validate key'); 325 } 326 if (str_starts_with($alg, 'RS')) { 327 self::validateRsaKeyLength($key); 328 } elseif (str_starts_with($alg, 'ES')) { 329 self::validateEcKeyLength($key, $alg); 330 } 331 $success = \openssl_verify($msg, $signature, $keyMaterial, $algorithm); 313 $success = \openssl_verify($msg, $signature, $keyMaterial, $algorithm); // @phpstan-ignore-line 332 314 if ($success === 1) { 333 315 return true; … … 341 323 ); 342 324 case 'sodium_crypto': 325 if (!\function_exists('sodium_crypto_sign_verify_detached')) { 326 throw new DomainException('libsodium is not available'); 327 } 328 if (!\is_string($keyMaterial)) { 329 throw new InvalidArgumentException('key must be a string when using EdDSA'); 330 } 343 331 try { 344 $key = self::validateEdDSAKey($keyMaterial); 332 // The last non-empty line is used as the key. 333 $lines = array_filter(explode("\n", $keyMaterial)); 334 $key = base64_decode((string) end($lines)); 335 if (\strlen($key) === 0) { 336 throw new DomainException('Key cannot be empty string'); 337 } 345 338 if (\strlen($signature) === 0) { 346 339 throw new DomainException('Signature cannot be empty string'); … … 355 348 throw new InvalidArgumentException('key must be a string when using hmac'); 356 349 } 357 self::validateHmacKeyLength($keyMaterial, $algorithm);358 350 $hash = \hash_hmac($algorithm, $msg, $keyMaterial, true); 359 351 return self::constantTimeEquals($hash, $signature); … … 393 385 public static function jsonEncode(array $input): string 394 386 { 395 $json = \json_encode($input, \JSON_UNESCAPED_SLASHES); 387 if (PHP_VERSION_ID >= 50400) { 388 $json = \json_encode($input, \JSON_UNESCAPED_SLASHES); 389 } else { 390 // PHP 5.3 only 391 $json = \json_encode($input); 392 } 396 393 if ($errno = \json_last_error()) { 397 394 self::handleJsonError($errno); … … 451 448 } 452 449 450 453 451 /** 454 452 * Determine if an algorithm has been provided for each Key … … 462 460 */ 463 461 private static function getKey( 464 #[\SensitiveParameter]$keyOrKeyArray,462 $keyOrKeyArray, 465 463 ?string $kid 466 464 ): Key { … … 669 667 return [$pos, $data]; 670 668 } 671 672 /**673 * Validate HMAC key length674 *675 * @param string $key HMAC key material676 * @param string $algorithm The algorithm677 *678 * @throws DomainException Provided key is too short679 */680 private static function validateHmacKeyLength(string $key, string $algorithm): void681 {682 $keyLength = \strlen($key) * 8;683 $minKeyLength = (int) \str_replace('SHA', '', $algorithm);684 if ($keyLength < $minKeyLength) {685 throw new DomainException('Provided key is too short');686 }687 }688 689 /**690 * Validate RSA key length691 *692 * @param OpenSSLAsymmetricKey $key RSA key material693 * @throws DomainException Provided key is too short694 */695 private static function validateRsaKeyLength(#[\SensitiveParameter] OpenSSLAsymmetricKey $key): void696 {697 if (!$keyDetails = openssl_pkey_get_details($key)) {698 throw new DomainException('Unable to validate key');699 }700 if ($keyDetails['bits'] < self::RSA_KEY_MIN_LENGTH) {701 throw new DomainException('Provided key is too short');702 }703 }704 705 /**706 * Validate RSA key length707 *708 * @param OpenSSLAsymmetricKey $key RSA key material709 * @param string $algorithm The algorithm710 * @throws DomainException Provided key is too short711 */712 private static function validateEcKeyLength(713 #[\SensitiveParameter] OpenSSLAsymmetricKey $key,714 string $algorithm715 ): void {716 if (!$keyDetails = openssl_pkey_get_details($key)) {717 throw new DomainException('Unable to validate key');718 }719 $minKeyLength = (int) \str_replace('ES', '', $algorithm);720 if ($keyDetails['bits'] < $minKeyLength) {721 throw new DomainException('Provided key is too short');722 }723 }724 725 /**726 * @param string|OpenSSLAsymmetricKey|OpenSSLCertificate $keyMaterial727 * @return non-empty-string728 */729 private static function validateEdDSAKey(#[\SensitiveParameter] $keyMaterial): string730 {731 if (!\function_exists('sodium_crypto_sign_verify_detached')) {732 throw new DomainException('libsodium is not available');733 }734 if (!\is_string($keyMaterial)) {735 throw new InvalidArgumentException('key must be a string when using EdDSA');736 }737 // The last non-empty line is used as the key.738 $lines = array_filter(explode("\n", $keyMaterial));739 $key = self::urlsafeB64Decode((string) end($lines));740 if (\strlen($key) === 0) {741 throw new DomainException('Key cannot be empty string');742 }743 return $key;744 }745 669 } -
sg-ai-studio/trunk/vendor/firebase/php-jwt/src/Key.php
r3561022 r3562098 10 10 class Key 11 11 { 12 /** @var string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate */ 13 private $keyMaterial; 14 /** @var string */ 15 private $algorithm; 16 12 17 /** 13 * @param string| OpenSSLAsymmetricKey|OpenSSLCertificate $keyMaterial18 * @param string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate $keyMaterial 14 19 * @param string $algorithm 15 20 */ 16 21 public function __construct( 17 #[\SensitiveParameter] private$keyMaterial,18 privatestring $algorithm22 $keyMaterial, 23 string $algorithm 19 24 ) { 20 25 if ( … … 22 27 && !$keyMaterial instanceof OpenSSLAsymmetricKey 23 28 && !$keyMaterial instanceof OpenSSLCertificate 29 && !\is_resource($keyMaterial) 24 30 ) { 25 throw new TypeError('Key material must be a string, OpenSSLCertificate, or OpenSSLAsymmetricKey');31 throw new TypeError('Key material must be a string, resource, or OpenSSLAsymmetricKey'); 26 32 } 27 33 … … 33 39 throw new InvalidArgumentException('Algorithm must not be empty'); 34 40 } 41 42 // TODO: Remove in PHP 8.0 in favor of class constructor property promotion 43 $this->keyMaterial = $keyMaterial; 44 $this->algorithm = $algorithm; 35 45 } 36 46 … … 46 56 47 57 /** 48 * @return string| OpenSSLAsymmetricKey|OpenSSLCertificate58 * @return string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate 49 59 */ 50 60 public function getKeyMaterial() -
sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/CHANGELOG.md
r3561022 r3562098 2 2 3 3 Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version. 4 5 6 ## 7.11.0 - 2026-06-02 7 8 ### Added 9 10 - Added support for providing the `proxy` request option's `no` value as a comma-delimited string 11 - Added the `protocols` request option to restrict allowed URI schemes for request transfers 12 - Added `cert_type` and `ssl_key_type` request options for TLS certificate and private-key file types 13 - Added PHP stream handler support for the `ssl_key` request option 14 - Added transport sharing via the `transport_sharing` client and cURL handler options 15 16 ### Changed 17 18 - Adjusted `guzzlehttp/promises` version constraint to `^2.5` 19 - Adjusted `guzzlehttp/psr7` version constraint to `^2.11` 20 - Allowed domainless `SetCookie` instances to be stored without wildcard request matching 21 - Changed no-proxy matching to respect request ports for host-and-port rules 22 - Prevented `CurlMultiHandler` destructors from throwing during cleanup 23 - Improved invalid response handling across handlers 24 25 ### Deprecated 26 27 - Deprecated non-iterable `Pool` request collections, which will be rejected in 8.0 28 - Deprecated non-uppercase easy request methods; 8.0 preserves method casing 29 - Deprecated non-string `headers` request option values, which will be rejected in 8.0 30 - Deprecated empty `headers` request option value arrays, which will be rejected in 8.0 31 - Deprecated empty and malformed request protocol versions, which will be rejected in 8.0 32 - Deprecated conflicting raw cURL request options, including `CURLOPT_SHARE`, which will be rejected in 8.0 33 - Deprecated scalar-coerced `idn_conversion` request option values, which will be rejected in 8.0 34 - Deprecated invalid documented request option value types, which will be rejected in 8.0 35 - Deprecated selected request options ignored by incompatible built-in handlers, which will be rejected in 8.0 36 - Deprecated `RequestException::wrapException()`, which will be removed in 8.0 37 - Deprecated `RetryMiddleware::exponentialDelay()`, which will be removed in 8.0 4 38 5 39 … … 991 1025 992 1026 * For information on changes and upgrading, see: 993 https://github.com/guzzle/guzzle/blob/ master/UPGRADING.md#3x-to-401027 https://github.com/guzzle/guzzle/blob/4.x/UPGRADING.md#3x-to-40 994 1028 * Added `GuzzleHttp\batch()` as a convenience function for sending requests in 995 1029 parallel without needing to write asynchronous code. … … 1024 1058 ## 4.0.0-rc.1 - 2014-03-15 1025 1059 1026 * See https://github.com/guzzle/guzzle/blob/ master/UPGRADING.md#3x-to-401060 * See https://github.com/guzzle/guzzle/blob/4.x/UPGRADING.md#3x-to-40 1027 1061 1028 1062 ## 3.8.1 - 2014-01-28 -
sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/README.md
r3561022 r3562098 43 43 We use GitHub issues only to discuss bugs and new features. For support please refer to: 44 44 45 - [Documentation]( https://docs.guzzlephp.org)45 - [Documentation](docs/index.md) 46 46 - [Stack Overflow](https://stackoverflow.com/questions/tagged/guzzle) 47 47 - [#guzzle](https://app.slack.com/client/T0D2S9JCT/CE6UAAKL4) channel on [PHP-HTTP Slack](https://slack.httplug.io/) … … 73 73 [guzzle-5-repo]: https://github.com/guzzle/guzzle/tree/5.3 74 74 [guzzle-6-repo]: https://github.com/guzzle/guzzle/tree/6.5 75 [guzzle-7-repo]: https://github.com/guzzle/guzzle 76 [guzzle-3-docs]: https://g uzzle3.readthedocs.io/77 [guzzle-5-docs]: https:// docs.guzzlephp.org/en/5.3/78 [guzzle-6-docs]: https:// docs.guzzlephp.org/en/6.5/79 [guzzle-7-docs]: https:// docs.guzzlephp.org/en/latest/75 [guzzle-7-repo]: https://github.com/guzzle/guzzle/tree/7.11 76 [guzzle-3-docs]: https://github.com/guzzle/guzzle3/tree/master/docs 77 [guzzle-5-docs]: https://github.com/guzzle/guzzle/tree/5.3/docs 78 [guzzle-6-docs]: https://github.com/guzzle/guzzle/tree/6.5/docs 79 [guzzle-7-docs]: https://github.com/guzzle/guzzle/blob/7.11/docs/index.md 80 80 81 81 -
sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/UPGRADING.md
r3505951 r3562098 13 13 - If you extend a class of Guzzle; update all signatures on methods you override. 14 14 15 #### Other backwards compatibility breaking changes15 #### Other Backwards Compatibility Breaking Changes 16 16 17 17 - Class `GuzzleHttp\UriTemplate` is removed. … … 36 36 - Support for international domain names (IDN) is now disabled by default, and enabling it requires installing ext-intl, linked against a modern version of the C library (ICU 4.6 or higher). 37 37 38 #### Native functions calls38 #### Native Functions Calls 39 39 40 40 All internal native functions calls of Guzzle are now prefixed with a slash. This … … 50 50 ``` 51 51 52 For the full diff you can check [here](https://github.com/guzzle/guzzle/compare/6.5.4.. master).52 For the full diff you can check [here](https://github.com/guzzle/guzzle/compare/6.5.4..7.0.0). 53 53 54 54 5.0 to 6.0 … … 190 190 ## POST Requests 191 191 192 This version added the [`form_params`](https:// docs.guzzlephp.org/en/latest/request-options.html#form_params)192 This version added the [`form_params`](https://github.com/guzzle/guzzle/blob/6.5/docs/request-options.rst#form_params) 193 193 and `multipart` request options. `form_params` is an associative array of 194 194 strings or array of strings and is used to serialize an 195 195 `application/x-www-form-urlencoded` POST request. The 196 [`multipart`](https:// docs.guzzlephp.org/en/latest/request-options.html#multipart)196 [`multipart`](https://github.com/guzzle/guzzle/blob/6.5/docs/request-options.rst#multipart) 197 197 option is now used to send a multipart/form-data POST request. 198 198 … … 210 210 ## Rewritten Adapter Layer 211 211 212 Guzzle now uses [RingPHP](https:// ringphp.readthedocs.org/en/latest) to send212 Guzzle now uses [RingPHP](https://github.com/guzzle/RingPHP) to send 213 213 HTTP requests. The `adapter` option in a `GuzzleHttp\Client` constructor 214 214 is still supported, but it has now been renamed to `handler`. Instead of … … 575 575 of a `GuzzleHttp\Event\BeforeEvent`, `GuzzleHttp\Event\CompleteEvent`, and 576 576 `GuzzleHttp\Event\ErrorEvent` event. 577 578 See: https://docs.guzzlephp.org/en/latest/events.html579 577 580 578 ## Inflection -
sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/Client.php
r3561022 r3562098 6 6 use GuzzleHttp\Exception\GuzzleException; 7 7 use GuzzleHttp\Exception\InvalidArgumentException; 8 use GuzzleHttp\Handler\CurlShareHandleState; 8 9 use GuzzleHttp\Promise as P; 9 10 use GuzzleHttp\Promise\PromiseInterface; 10 11 use Psr\Http\Message\RequestInterface; 11 12 use Psr\Http\Message\ResponseInterface; 13 use Psr\Http\Message\StreamInterface; 12 14 use Psr\Http\Message\UriInterface; 13 15 … … 49 51 * - base_uri: (string|UriInterface) Base URI of the client that is merged 50 52 * into relative URIs. Can be a string or instance of UriInterface. 53 * - transport_sharing: (string|null) Transport sharing mode for the 54 * default handler. Accepts TransportSharing::* or null. Defaults to null. 51 55 * - **: any request option 52 56 * … … 57 61 public function __construct(array $config = []) 58 62 { 63 $transportSharing = \array_key_exists('transport_sharing', $config) ? $config['transport_sharing'] : null; 64 $transportSharingMode = CurlShareHandleState::normalizeMode($transportSharing, 'transport_sharing'); 65 unset($config['transport_sharing']); 66 59 67 if (!isset($config['handler'])) { 60 $config['handler'] = HandlerStack::create(); 68 $config['handler'] = $transportSharingMode === TransportSharing::NONE 69 ? HandlerStack::create() 70 : HandlerStack::create(Utils::chooseHandler(['transport_sharing' => $transportSharingMode])); 61 71 } elseif (!\is_callable($config['handler'])) { 62 72 throw new InvalidArgumentException('handler must be a callable'); 73 } elseif ($transportSharingMode === TransportSharing::HANDLER_REQUIRE) { 74 throw new InvalidArgumentException('The "transport_sharing" client option can only require sharing when Guzzle creates the default handler. Configure the "transport_sharing" option on CurlHandler or CurlMultiHandler when providing a custom cURL handler.'); 63 75 } 64 76 … … 157 169 public function requestAsync(string $method, $uri = '', array $options = []): PromiseInterface 158 170 { 171 $normalizedMethod = \strtoupper($method); 172 if ($method !== $normalizedMethod) { 173 \trigger_deprecation( 174 'guzzlehttp/guzzle', 175 '7.11', 176 'Passing a non-uppercase HTTP method to Client::requestAsync() is deprecated; guzzlehttp/guzzle 8.0 will preserve HTTP method casing. Pass an uppercase method explicitly if uppercase is required.' 177 ); 178 $method = $normalizedMethod; 179 } 180 159 181 $options = $this->prepareDefaults($options); 160 182 // Remove request modifying parameter because it can be done up-front. 161 183 $headers = $options['headers'] ?? []; 184 $droppedHeaderNames = self::castDeprecatedHeaderOptionValues($headers); 185 if ($droppedHeaderNames !== [] && isset($options['_conditional'])) { 186 $options['_conditional'] = Psr7\Utils::caselessRemove($droppedHeaderNames, $options['_conditional']); 187 } 162 188 $body = $options['body'] ?? null; 163 189 $version = self::normalizeProtocolVersion($options['version'] ?? '1.1'); … … 189 215 public function request(string $method, $uri = '', array $options = []): ResponseInterface 190 216 { 217 $normalizedMethod = \strtoupper($method); 218 if ($method !== $normalizedMethod) { 219 \trigger_deprecation( 220 'guzzlehttp/guzzle', 221 '7.11', 222 'Passing a non-uppercase HTTP method to Client::request() is deprecated; guzzlehttp/guzzle 8.0 will preserve HTTP method casing. Pass an uppercase method explicitly if uppercase is required.' 223 ); 224 $method = $normalizedMethod; 225 } 226 191 227 $options[RequestOptions::SYNCHRONOUS] = true; 192 228 … … 204 240 * 205 241 * @return mixed 206 *207 * @deprecated Client::getConfig will be removed in guzzlehttp/guzzle:8.0.208 242 */ 209 243 public function getConfig(?string $option = null) … … 220 254 } 221 255 222 if (isset($config['idn_conversion']) && ($config['idn_conversion'] !== false)) {223 $idnOptions = ($config['idn_conversion'] === true) ? \IDNA_DEFAULT : $config['idn_conversion'];256 $idnOptions = Utils::normalizeIdnConversionOption($config['idn_conversion'] ?? null); 257 if ($idnOptions !== null) { 224 258 $uri = Utils::idnUriConvert($uri, $idnOptions); 225 259 } … … 240 274 'cookies' => false, 241 275 'idn_conversion' => false, 276 'protocols' => ['http', 'https'], 242 277 ]; 243 278 … … 271 306 } else { 272 307 // Add the User-Agent header if one was not already set. 308 $hasUserAgent = false; 273 309 foreach (\array_keys($this->config['headers']) as $name) { 274 if (\strtolower($name) === 'user-agent') { 275 return; 310 if (\strtolower((string) $name) === 'user-agent') { 311 $hasUserAgent = true; 312 break; 276 313 } 277 314 } 278 $this->config['headers']['User-Agent'] = Utils::defaultUserAgent(); 315 316 if (!$hasUserAgent) { 317 $this->config['headers']['User-Agent'] = Utils::defaultUserAgent(); 318 } 319 } 320 321 if (\is_array($this->config['headers'])) { 322 self::warnAboutInvalidHeaderOptionTypes($this->config['headers']); 323 self::castDeprecatedHeaderOptionValues($this->config['headers']); 279 324 } 280 325 } … … 317 362 } 318 363 364 self::warnAboutInvalidRequestOptionTypes($result); 365 319 366 return $result; 367 } 368 369 private static function warnAboutInvalidRequestOptionTypes(array $options): void 370 { 371 if (isset($options['handler']) && !\is_callable($options['handler'])) { 372 self::warnInvalidRequestOptionType('handler', 'callable', $options['handler']); 373 } 374 375 if (isset($options['allow_redirects']) && \is_array($options['allow_redirects'])) { 376 self::warnAboutInvalidAllowRedirectsOptionTypes($options['allow_redirects']); 377 } 378 379 if (isset($options['auth'])) { 380 self::warnAboutInvalidAuthOptionTypes($options['auth']); 381 } 382 383 if (isset($options['body']) && \is_array($options['body'])) { 384 self::warnInvalidRequestOptionType('body', 'resource|string|null|int|float|bool|StreamInterface|(callable&object)|\Iterator|\Stringable', $options['body']); 385 } 386 387 self::warnAboutInvalidTlsFileOptionTypes($options, 'cert'); 388 self::warnIfPresentAndNotString($options, 'cert_type'); 389 self::warnIfPresentAndNotNumber($options, 'connect_timeout'); 390 self::warnIfPresentAndNotInt($options, 'crypto_method'); 391 self::warnIfPresentAndNotBoolOrResource($options, 'debug'); 392 self::warnIfPresentAndNotBoolOrString($options, 'decode_content'); 393 self::warnIfPresentAndNotNumber($options, 'delay'); 394 self::warnIfPresentAndNotBoolOrInt($options, 'expect'); 395 396 if (isset($options['form_params'])) { 397 self::warnAboutInvalidFormParamTypes($options['form_params']); 398 } 399 400 if (isset($options['force_ip_resolve']) && !\is_string($options['force_ip_resolve'])) { 401 self::warnInvalidRequestOptionType('force_ip_resolve', 'string', $options['force_ip_resolve']); 402 } 403 404 if (isset($options['headers'])) { 405 self::warnAboutInvalidHeaderOptionTypes($options['headers']); 406 } 407 408 self::warnIfPresentAndNotBool($options, 'http_errors'); 409 410 if (isset($options['multipart'])) { 411 self::warnAboutInvalidMultipartOptionTypes($options['multipart']); 412 } 413 414 self::warnIfPresentAndNotCallable($options, 'on_headers'); 415 self::warnIfPresentAndNotCallable($options, 'on_stats'); 416 self::warnIfPresentAndNotCallable($options, 'progress'); 417 self::warnIfPresentAndNotStringArray($options, 'protocols', true); 418 self::warnAboutInvalidProxyOptionTypes($options); 419 420 self::warnIfPresentAndNotNumber($options, 'read_timeout'); 421 self::warnIfPresentAndNotInt($options, 'retries'); 422 423 if (isset($options['sink']) && !\is_bool($options['sink']) && !\is_resource($options['sink']) && !\is_string($options['sink']) && !$options['sink'] instanceof StreamInterface) { 424 self::warnInvalidRequestOptionType('sink', 'resource|string|StreamInterface', $options['sink']); 425 } 426 427 self::warnAboutInvalidTlsFileOptionTypes($options, 'ssl_key'); 428 self::warnIfPresentAndNotString($options, 'ssl_key_type'); 429 self::warnIfPresentAndNotBool($options, 'stream'); 430 self::warnIfPresentAndNotArray($options, 'stream_context', 'array<array-key, mixed>'); 431 self::warnIfPresentAndNotBool($options, 'synchronous'); 432 self::warnIfPresentAndNotNumber($options, 'timeout'); 433 self::warnIfPresentAndNotBoolOrString($options, 'verify'); 434 self::warnIfPresentAndNotStringOrNumber($options, 'version'); 435 self::warnIfPresentAndNotArray($options, 'curl', 'array<int|string, mixed>'); 436 437 if (isset($options['cookies']) && $options['cookies'] === true) { 438 self::warnInvalidRequestOptionType('cookies', 'false|CookieJarInterface', $options['cookies']); 439 } 440 } 441 442 private static function warnAboutInvalidAllowRedirectsOptionTypes(array $allowRedirects): void 443 { 444 self::warnIfPresentAndNotInt($allowRedirects, 'max', 'allow_redirects.max'); 445 self::warnIfPresentAndNotBool($allowRedirects, 'strict', 'allow_redirects.strict'); 446 self::warnIfPresentAndNotBool($allowRedirects, 'referer', 'allow_redirects.referer'); 447 self::warnIfPresentAndNotStringArray($allowRedirects, 'protocols', true, 'allow_redirects.protocols'); 448 self::warnIfPresentAndNotCallable($allowRedirects, 'on_redirect', 'allow_redirects.on_redirect'); 449 self::warnIfPresentAndNotBool($allowRedirects, 'track_redirects', 'allow_redirects.track_redirects'); 450 } 451 452 /** 453 * @param mixed $auth 454 */ 455 private static function warnAboutInvalidAuthOptionTypes($auth): void 456 { 457 if ($auth === false || \is_string($auth) || $auth === []) { 458 return; 459 } 460 461 if (!\is_array($auth)) { 462 self::warnInvalidRequestOptionType('auth', 'array{0: string, 1: string, 2?: string|null}|string|false|null', $auth); 463 464 return; 465 } 466 467 if (!\array_key_exists(0, $auth) || !\is_string($auth[0])) { 468 self::warnInvalidRequestOptionType('auth.0', 'string', $auth[0] ?? null); 469 } 470 471 if (!\array_key_exists(1, $auth) || !\is_string($auth[1])) { 472 self::warnInvalidRequestOptionType('auth.1', 'string', $auth[1] ?? null); 473 } 474 475 if (\array_key_exists(2, $auth) && $auth[2] !== null && !\is_string($auth[2])) { 476 self::warnInvalidRequestOptionType('auth.2', 'string|null', $auth[2]); 477 } 478 } 479 480 /** 481 * @param mixed $value 482 */ 483 private static function warnAboutInvalidFormParamTypes($value): void 484 { 485 if (!\is_array($value)) { 486 self::warnInvalidRequestOptionType('form_params', 'array<array-key, string|int|float|bool|null|array>', $value); 487 488 return; 489 } 490 491 self::warnAboutInvalidFormParamArray($value, 'form_params'); 492 } 493 494 private static function warnAboutInvalidFormParamArray(array $values, string $path): bool 495 { 496 foreach ($values as $key => $item) { 497 $itemPath = $path.'.'.(string) $key; 498 if (\is_array($item)) { 499 if (!self::warnAboutInvalidFormParamArray($item, $itemPath)) { 500 return false; 501 } 502 503 continue; 504 } 505 506 if ($item !== null && !\is_scalar($item)) { 507 self::warnInvalidRequestOptionType($itemPath, 'string|int|float|bool|null|array', $item); 508 509 return false; 510 } 511 } 512 513 return true; 514 } 515 516 /** 517 * @param mixed $headers 518 */ 519 private static function warnAboutInvalidHeaderOptionTypes($headers): void 520 { 521 if (!\is_array($headers)) { 522 self::warnInvalidRequestOptionType('headers', 'array<array-key, string|non-empty-array<array-key, string>>|null', $headers); 523 524 return; 525 } 526 527 foreach ($headers as $name => $value) { 528 $path = 'headers.'.(string) $name; 529 if (\is_array($value)) { 530 if ($value === []) { 531 self::warnInvalidRequestOptionType($path, 'string|non-empty-array<array-key, string>', $value); 532 533 break; 534 } 535 536 foreach ($value as $index => $item) { 537 if (!\is_string($item)) { 538 self::warnInvalidRequestOptionType($path.'.'.(string) $index, 'string', $item); 539 540 break 2; 541 } 542 } 543 } elseif (!\is_string($value)) { 544 self::warnInvalidRequestOptionType($path, 'string|non-empty-array<array-key, string>', $value); 545 546 break; 547 } 548 } 549 } 550 551 /** 552 * @param mixed $multipart 553 */ 554 private static function warnAboutInvalidMultipartOptionTypes($multipart): void 555 { 556 if (!\is_array($multipart)) { 557 self::warnInvalidRequestOptionType('multipart', 'array<array-key, array{name: string|int, contents: mixed, headers?: array<array-key, string>, filename?: string}>', $multipart); 558 559 return; 560 } 561 562 foreach ($multipart as $index => $part) { 563 $path = 'multipart.'.(string) $index; 564 if (!\is_array($part)) { 565 self::warnInvalidRequestOptionType($path, 'array{name: string|int, contents: mixed, headers?: array<array-key, string>, filename?: string}', $part); 566 567 return; 568 } 569 570 if (!\array_key_exists('name', $part) || (!\is_string($part['name']) && !\is_int($part['name']))) { 571 self::warnInvalidRequestOptionType($path.'.name', 'string|int', $part['name'] ?? null); 572 } 573 574 if (!\array_key_exists('contents', $part)) { 575 self::warnInvalidRequestOptionType($path, 'array{name: string|int, contents: mixed, headers?: array<array-key, string>, filename?: string}', $part); 576 } 577 578 if (\array_key_exists('headers', $part)) { 579 if (!\is_array($part['headers'])) { 580 self::warnInvalidRequestOptionType($path.'.headers', 'array<array-key, string>', $part['headers']); 581 } else { 582 foreach ($part['headers'] as $name => $value) { 583 if (!\is_string($value)) { 584 self::warnInvalidRequestOptionType($path.'.headers.'.(string) $name, 'string', $value); 585 586 break 2; 587 } 588 } 589 } 590 } 591 592 if (\array_key_exists('filename', $part) && !\is_string($part['filename'])) { 593 self::warnInvalidRequestOptionType($path.'.filename', 'string', $part['filename']); 594 } 595 } 596 } 597 598 private static function warnAboutInvalidProxyOptionTypes(array $options): void 599 { 600 if (!isset($options['proxy'])) { 601 return; 602 } 603 604 if (!\is_string($options['proxy']) && !\is_array($options['proxy'])) { 605 self::warnInvalidRequestOptionType('proxy', 'string|array{http?: string|null, https?: string|null, no?: string|array<array-key, string>|null}', $options['proxy']); 606 607 return; 608 } 609 610 if (!\is_array($options['proxy'])) { 611 return; 612 } 613 614 foreach (['http', 'https'] as $scheme) { 615 if (\array_key_exists($scheme, $options['proxy']) && $options['proxy'][$scheme] !== null && !\is_string($options['proxy'][$scheme])) { 616 self::warnInvalidRequestOptionType('proxy.'.$scheme, 'string|null', $options['proxy'][$scheme]); 617 } 618 } 619 620 if (!\array_key_exists('no', $options['proxy']) || $options['proxy']['no'] === null) { 621 return; 622 } 623 624 if (\is_string($options['proxy']['no'])) { 625 return; 626 } 627 628 if (!\is_array($options['proxy']['no'])) { 629 self::warnInvalidRequestOptionType('proxy.no', 'string|array<array-key, string>|null', $options['proxy']['no']); 630 631 return; 632 } 633 634 foreach ($options['proxy']['no'] as $index => $noProxy) { 635 if (!\is_string($noProxy)) { 636 self::warnInvalidRequestOptionType('proxy.no.'.(string) $index, 'string', $noProxy); 637 638 return; 639 } 640 } 641 } 642 643 private static function warnAboutInvalidTlsFileOptionTypes(array $options, string $option): void 644 { 645 if (!isset($options[$option])) { 646 return; 647 } 648 649 if (\is_string($options[$option])) { 650 return; 651 } 652 653 if (!\is_array($options[$option])) { 654 self::warnInvalidRequestOptionType($option, 'string|array{0: string, 1?: string}', $options[$option]); 655 656 return; 657 } 658 659 if (!\array_key_exists(0, $options[$option]) || !\is_string($options[$option][0])) { 660 self::warnInvalidRequestOptionType($option.'.0', 'string', $options[$option][0] ?? null); 661 } 662 663 if (\array_key_exists(1, $options[$option]) && $options[$option][1] !== null && !\is_string($options[$option][1])) { 664 self::warnInvalidRequestOptionType($option.'.1', 'string|null', $options[$option][1]); 665 } 666 } 667 668 private static function warnIfPresentAndNotArray(array $options, string $option, string $expected): void 669 { 670 if (\array_key_exists($option, $options) && !\is_array($options[$option])) { 671 self::warnInvalidRequestOptionType($option, $expected, $options[$option]); 672 } 673 } 674 675 private static function warnIfPresentAndNotBool(array $options, string $option, ?string $path = null): void 676 { 677 if (\array_key_exists($option, $options) && !\is_bool($options[$option])) { 678 self::warnInvalidRequestOptionType($path ?? $option, 'bool', $options[$option]); 679 } 680 } 681 682 private static function warnIfPresentAndNotBoolOrInt(array $options, string $option): void 683 { 684 if (\array_key_exists($option, $options) && !\is_bool($options[$option]) && !\is_int($options[$option])) { 685 self::warnInvalidRequestOptionType($option, 'bool|int', $options[$option]); 686 } 687 } 688 689 private static function warnIfPresentAndNotBoolOrResource(array $options, string $option): void 690 { 691 if (\array_key_exists($option, $options) && !\is_bool($options[$option]) && !\is_resource($options[$option])) { 692 self::warnInvalidRequestOptionType($option, 'bool|resource', $options[$option]); 693 } 694 } 695 696 private static function warnIfPresentAndNotBoolOrString(array $options, string $option): void 697 { 698 if (\array_key_exists($option, $options) && !\is_bool($options[$option]) && !\is_string($options[$option])) { 699 self::warnInvalidRequestOptionType($option, 'bool|string', $options[$option]); 700 } 701 } 702 703 private static function warnIfPresentAndNotCallable(array $options, string $option, ?string $path = null): void 704 { 705 if (\array_key_exists($option, $options) && !\is_callable($options[$option])) { 706 self::warnInvalidRequestOptionType($path ?? $option, 'callable', $options[$option]); 707 } 708 } 709 710 private static function warnIfPresentAndNotInt(array $options, string $option, ?string $path = null): void 711 { 712 if (\array_key_exists($option, $options) && !\is_int($options[$option])) { 713 self::warnInvalidRequestOptionType($path ?? $option, 'int', $options[$option]); 714 } 715 } 716 717 private static function warnIfPresentAndNotNumber(array $options, string $option): void 718 { 719 if (\array_key_exists($option, $options) && !\is_int($options[$option]) && !\is_float($options[$option])) { 720 self::warnInvalidRequestOptionType($option, 'int|float', $options[$option]); 721 } 722 } 723 724 private static function warnIfPresentAndNotString(array $options, string $option): void 725 { 726 if (\array_key_exists($option, $options) && !\is_string($options[$option])) { 727 self::warnInvalidRequestOptionType($option, 'string', $options[$option]); 728 } 729 } 730 731 private static function warnIfPresentAndNotStringArray(array $options, string $option, bool $nonEmpty, ?string $path = null): void 732 { 733 if (!\array_key_exists($option, $options)) { 734 return; 735 } 736 737 $path = $path ?? $option; 738 $expected = ($nonEmpty ? 'non-empty-' : '').'array<array-key, string>'; 739 740 if (!\is_array($options[$option]) || ($nonEmpty && $options[$option] === [])) { 741 self::warnInvalidRequestOptionType($path, $expected, $options[$option]); 742 743 return; 744 } 745 746 foreach ($options[$option] as $index => $item) { 747 if (!\is_string($item)) { 748 self::warnInvalidRequestOptionType($path.'.'.(string) $index, 'string', $item); 749 750 return; 751 } 752 } 753 } 754 755 private static function warnIfPresentAndNotStringOrNumber(array $options, string $option): void 756 { 757 if ( 758 \array_key_exists($option, $options) 759 && !\is_string($options[$option]) 760 && !\is_int($options[$option]) 761 && !\is_float($options[$option]) 762 ) { 763 self::warnInvalidRequestOptionType($option, 'string|int|float', $options[$option]); 764 } 765 } 766 767 /** 768 * @param mixed $value 769 */ 770 private static function warnInvalidRequestOptionType(string $option, string $expected, $value): void 771 { 772 \trigger_deprecation( 773 'guzzlehttp/guzzle', 774 '7.11', 775 'Passing %s to request option "%s" is deprecated; guzzlehttp/guzzle 8.0 requires %s.', 776 \get_debug_type($value), 777 $option, 778 $expected 779 ); 320 780 } 321 781 … … 332 792 $request = $this->applyOptions($request, $options); 333 793 334 if ('' === $request->getProtocolVersion()) { 794 $protocolVersion = $request->getProtocolVersion(); 795 796 if ('' === $protocolVersion) { 797 \trigger_deprecation('guzzlehttp/guzzle', '7.11', 'Sending a request with an empty protocol version is deprecated; guzzlehttp/guzzle 8.0 will reject empty protocol versions.'); 798 335 799 $request = Psr7\Utils::modifyRequest($request, ['version' => '1.1']); 800 } elseif (!self::isProtocolVersionValid($protocolVersion)) { 801 \trigger_deprecation('guzzlehttp/guzzle', '7.11', 'Sending a request with a malformed protocol version is deprecated; guzzlehttp/guzzle 8.0 will reject malformed protocol versions.'); 336 802 } 337 803 … … 359 825 throw new InvalidArgumentException('The headers array must have header name as keys.'); 360 826 } 361 $modify['set_headers'] = $options['headers']; 827 $headers = $options['headers']; 828 $droppedHeaderNames = self::castDeprecatedHeaderOptionValues($headers); 829 if ($droppedHeaderNames !== [] && isset($options['_conditional'])) { 830 $options['_conditional'] = Psr7\Utils::caselessRemove($droppedHeaderNames, $options['_conditional']); 831 } 832 $modify['set_headers'] = $headers; 362 833 unset($options['headers']); 363 834 } … … 467 938 $modify = []; 468 939 foreach ($options['_conditional'] as $k => $v) { 469 if (!$request->hasHeader($k)) { 470 $modify['set_headers'][$k] = $v; 940 $name = (string) $k; 941 if (!$request->hasHeader($name)) { 942 $modify['set_headers'][$name] = $v; 471 943 } 472 944 } … … 480 952 481 953 /** 482 * @param string|float $version 954 * @param array<array-key, mixed> $headers 955 * 956 * @return list<string> 957 */ 958 private static function castDeprecatedHeaderOptionValues(array &$headers): array 959 { 960 $droppedHeaderNames = []; 961 962 foreach ($headers as $name => $value) { 963 if (\is_array($value)) { 964 if ($value === []) { 965 $droppedHeaderNames[] = (string) $name; 966 unset($headers[$name]); 967 968 continue; 969 } 970 971 foreach ($value as $index => $item) { 972 if ($item === null || (!\is_string($item) && \is_scalar($item))) { 973 $value[$index] = (string) $item; 974 } 975 } 976 977 $headers[$name] = $value; 978 979 continue; 980 } 981 982 if ($value === null || (!\is_string($value) && \is_scalar($value))) { 983 $headers[$name] = (string) $value; 984 } 985 } 986 987 return $droppedHeaderNames; 988 } 989 990 /** 991 * @param string|int|float $version 483 992 */ 484 993 private static function normalizeProtocolVersion($version): string 485 994 { 486 995 if ('' === $version) { 996 \trigger_deprecation('guzzlehttp/guzzle', '7.11', 'Passing an empty "version" request option is deprecated; guzzlehttp/guzzle 8.0 will reject empty protocol versions.'); 997 487 998 return '1.1'; 488 999 } 489 1000 490 1001 return \is_float($version) ? \number_format($version, 1, '.', '') : (string) $version; 1002 } 1003 1004 private static function isProtocolVersionValid(string $version): bool 1005 { 1006 return 1 === \preg_match('/^\d+(?:\.\d+)?$/D', $version); 491 1007 } 492 1008 -
sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php
r3561022 r3562098 106 106 public function clear(?string $domain = null, ?string $path = null, ?string $name = null): void 107 107 { 108 if ( !$domain) {108 if ($domain === null) { 109 109 $this->cookies = []; 110 110 … … 114 114 $this->cookies, 115 115 static function (SetCookie $cookie) use ($domain): bool { 116 return !$cookie->matchesDomain($domain);116 return $cookie->getDomain() === null || !$cookie->matchesDomain($domain); 117 117 } 118 118 ); … … 121 121 $this->cookies, 122 122 static function (SetCookie $cookie) use ($path, $domain): bool { 123 return !($cookie->matchesPath($path) 123 return !($cookie->getDomain() !== null 124 && $cookie->matchesPath($path) 124 125 && $cookie->matchesDomain($domain)); 125 126 } … … 129 130 $this->cookies, 130 131 static function (SetCookie $cookie) use ($path, $domain, $name) { 131 return !($cookie->getName() == $name 132 return !($cookie->getDomain() !== null 133 && $cookie->getName() == $name 132 134 && $cookie->matchesPath($path) 133 135 && $cookie->matchesDomain($domain)); … … 275 277 276 278 foreach ($this->cookies as $cookie) { 277 if ($cookie->matchesPath($path) 279 if ($cookie->getDomain() !== null 280 && $cookie->matchesPath($path) 278 281 && $cookie->matchesDomain($host) 279 282 && !$cookie->isExpired() … … 297 300 { 298 301 $cookieValue = $cookie->getValue(); 299 if ( $cookieValue === null || $cookieValue === '') {302 if (($cookieValue === null || $cookieValue === '') && $cookie->getDomain() !== null) { 300 303 $this->clear( 301 304 $cookie->getDomain(), -
sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php
r3561022 r3562098 176 176 { 177 177 if (!is_string($name)) { 178 trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);178 \trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); 179 179 } 180 180 … … 200 200 { 201 201 if (!is_string($value)) { 202 trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);202 \trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); 203 203 } 204 204 … … 224 224 { 225 225 if (!is_string($domain) && null !== $domain) { 226 trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);226 \trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); 227 227 } 228 228 … … 248 248 { 249 249 if (!is_string($path)) { 250 trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);250 \trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); 251 251 } 252 252 … … 272 272 { 273 273 if (!is_int($maxAge) && null !== $maxAge) { 274 trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an int or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);274 \trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an int or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); 275 275 } 276 276 … … 296 296 { 297 297 if (!is_int($timestamp) && !is_string($timestamp) && null !== $timestamp) { 298 trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an int, string or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);298 \trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an int, string or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); 299 299 } 300 300 … … 328 328 { 329 329 if (!is_bool($secure)) { 330 trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);330 \trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); 331 331 } 332 332 … … 352 352 { 353 353 if (!is_bool($discard)) { 354 trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);354 \trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); 355 355 } 356 356 … … 376 376 { 377 377 if (!is_bool($httpOnly)) { 378 trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);378 \trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); 379 379 } 380 380 … … 489 489 } 490 490 491 // Domains must not be empty, but can be 0. "0" is not a valid internet492 // domain, but may be used as server name in a private network.491 // Domains must not be empty, but may be omitted. "0" is not a valid 492 // internet domain, but may be used as server name in a private network. 493 493 $domain = $this->getDomain(); 494 if ($domain === null || $domain ==='') {494 if ($domain === '') { 495 495 return 'The cookie domain must not be empty'; 496 496 } -
sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php
r3505951 r3562098 8 8 /** 9 9 * Exception thrown when a connection cannot be established. 10 *11 * Note that no response is present for a ConnectException12 10 */ 13 11 class ConnectException extends TransferException implements NetworkExceptionInterface -
sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php
r3505951 r3562098 46 46 /** 47 47 * Wrap non-RequestExceptions with a RequestException 48 * 49 * @deprecated since 7.11. Create a RequestException directly instead. 48 50 */ 49 51 public static function wrapException(RequestInterface $request, \Throwable $e): RequestException 50 52 { 53 \trigger_deprecation('guzzlehttp/guzzle', '7.11', '%s::wrapException() is deprecated and will be removed in 8.0. Create a %s directly instead.', self::class, self::class); 54 51 55 return $e instanceof RequestException ? $e : new RequestException($e->getMessage(), $request, null, $e); 52 56 } -
sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php
r3561022 r3562098 10 10 use GuzzleHttp\Psr7\LazyOpenStream; 11 11 use GuzzleHttp\TransferStats; 12 use GuzzleHttp\TransportSharing; 12 13 use GuzzleHttp\Utils; 13 14 use Psr\Http\Message\RequestInterface; … … 39 40 40 41 /** 41 * @param int $maxHandles Maximum number of idle handles. 42 */ 43 public function __construct(int $maxHandles) 42 * @var resource|\CurlShareHandle|null 43 */ 44 private $shareHandle; 45 46 /** 47 * @var string 48 */ 49 private $shareMode; 50 51 /** 52 * @param int $maxHandles Maximum number of idle handles. 53 * @param resource|\CurlShareHandle|null $shareHandle 54 */ 55 public function __construct(int $maxHandles, string $shareMode = TransportSharing::NONE, $shareHandle = null) 44 56 { 45 57 $this->maxHandles = $maxHandles; 58 $this->shareMode = CurlShareHandleState::normalizeMode($shareMode, 'transport_sharing'); 59 60 if ($this->shareMode === TransportSharing::NONE && $shareHandle !== null) { 61 throw new \InvalidArgumentException('A cURL share handle cannot be provided when transport sharing is disabled.'); 62 } 63 64 if ($this->shareMode !== TransportSharing::NONE && $shareHandle === null) { 65 throw new \InvalidArgumentException('A cURL share handle is required when transport sharing is enabled.'); 66 } 67 68 if ($shareHandle !== null && !self::isCurlShareHandle($shareHandle)) { 69 throw new \InvalidArgumentException('A cURL share handle must be an instance of CurlShareHandle or a curl_share resource.'); 70 } 71 72 $this->shareHandle = $shareHandle; 73 } 74 75 /** 76 * @param mixed $value 77 */ 78 private static function isCurlShareHandle($value): bool 79 { 80 if (\PHP_VERSION_ID < 80000) { 81 return \is_resource($value) && \get_resource_type($value) === 'curl_share'; 82 } 83 84 return $value instanceof \CurlShareHandle; 46 85 } 47 86 … … 51 90 52 91 if ('' === $protocolVersion) { 92 \trigger_deprecation('guzzlehttp/guzzle', '7.11', 'Sending a request with an empty protocol version is deprecated; guzzlehttp/guzzle 8.0 will reject empty protocol versions.'); 93 53 94 $protocolVersion = '1.1'; 54 95 $request = \GuzzleHttp\Psr7\Utils::modifyRequest($request, ['version' => $protocolVersion]); … … 67 108 unset($options['curl']['body_as_string']); 68 109 } 110 111 self::triggerUnsupportedRequestOptionDeprecations($options); 112 $this->rejectRequestLevelShareConflict($options); 113 self::triggerConflictingCurlOptionDeprecations($options); 69 114 70 115 $easy = new EasyHandle(); … … 83 128 84 129 $conf[\CURLOPT_HEADERFUNCTION] = $this->createHeaderFn($easy); 130 if ($this->shareHandle !== null) { 131 if (!\defined('CURLOPT_SHARE')) { 132 throw new \InvalidArgumentException('The configured cURL share handle requires CURLOPT_SHARE, but it is not available in the installed PHP cURL extension.'); 133 } 134 135 $conf[(int) \constant('CURLOPT_SHARE')] = $this->shareHandle; 136 } 137 85 138 $handle = $this->handles ? \array_pop($this->handles) : \curl_init(); 86 139 if (false === $handle) { … … 140 193 } 141 194 195 private function rejectRequestLevelShareConflict(array $options): void 196 { 197 if ($this->shareHandle === null) { 198 return; 199 } 200 201 if ( 202 !\defined('CURLOPT_SHARE') 203 || !isset($options['curl']) 204 || !\is_array($options['curl']) 205 || !\array_key_exists((int) \constant('CURLOPT_SHARE'), $options['curl']) 206 ) { 207 return; 208 } 209 210 throw new \InvalidArgumentException('The request-level CURLOPT_SHARE cURL option cannot be combined with configured transport sharing.'); 211 } 212 142 213 /** 143 214 * @param int|string $option … … 165 236 166 237 return (string) $option; 238 } 239 240 private static function triggerConflictingCurlOptionDeprecations(array $options): void 241 { 242 if (!isset($options['curl']) || !\is_array($options['curl']) || $options['curl'] === []) { 243 return; 244 } 245 246 $conflictingOptions = self::conflictingCurlOptions(); 247 248 foreach ($options['curl'] as $option => $_) { 249 if (!\array_key_exists($option, $conflictingOptions)) { 250 continue; 251 } 252 253 $name = self::formatCurlOption($option); 254 $replacement = $conflictingOptions[$option]; 255 if ($replacement !== null) { 256 \trigger_deprecation( 257 'guzzlehttp/guzzle', 258 '7.11', 259 \sprintf( 260 'Passing %s in the "curl" request option is deprecated; guzzlehttp/guzzle 8.0 will reject this option because it conflicts with Guzzle-managed request handling. Use %s instead.', 261 $name, 262 $replacement 263 ) 264 ); 265 266 continue; 267 } 268 269 \trigger_deprecation( 270 'guzzlehttp/guzzle', 271 '7.11', 272 \sprintf( 273 'Passing %s in the "curl" request option is deprecated; guzzlehttp/guzzle 8.0 will reject this option because it conflicts with Guzzle-managed cURL internals.', 274 $name 275 ) 276 ); 277 } 278 } 279 280 private static function triggerUnsupportedRequestOptionDeprecations(array $options): void 281 { 282 if ( 283 \array_key_exists('transport_sharing', $options) 284 && CurlShareHandleState::normalizeMode($options['transport_sharing'], 'transport_sharing') !== TransportSharing::NONE 285 ) { 286 \trigger_deprecation('guzzlehttp/guzzle', '7.11', 'Passing the "transport_sharing" request option to a cURL handler is deprecated; guzzlehttp/guzzle 8.0 will reject this option because transport sharing must be configured when creating the Client, CurlHandler, or CurlMultiHandler.'); 287 } 288 289 if (\array_key_exists('stream_context', $options)) { 290 \trigger_deprecation('guzzlehttp/guzzle', '7.11', 'Passing the "stream_context" request option to a cURL handler is deprecated; guzzlehttp/guzzle 8.0 will reject this option because cURL handlers ignore PHP stream context options.'); 291 } 292 } 293 294 /** 295 * @return array<int, string|null> 296 */ 297 private static function conflictingCurlOptions(): array 298 { 299 static $options = null; 300 301 if ($options !== null) { 302 return $options; 303 } 304 305 $options = []; 306 307 self::addConflictingCurlOption($options, 'CURLOPT_SHARE', 'the "transport_sharing" client option or cURL handler option'); 308 self::addConflictingCurlOption($options, 'CURLOPT_URL', 'the request URI'); 309 self::addConflictingCurlOption($options, 'CURLOPT_PORT', 'the request URI'); 310 self::addConflictingCurlOption($options, 'CURLOPT_CUSTOMREQUEST', 'the request method'); 311 self::addConflictingCurlOption($options, 'CURLOPT_HTTPGET', 'the request method'); 312 self::addConflictingCurlOption($options, 'CURLOPT_POST', 'the request method and body'); 313 self::addConflictingCurlOption($options, 'CURLOPT_PUT', 'the request method and body'); 314 self::addConflictingCurlOption($options, 'CURLOPT_NOBODY', 'the request method'); 315 self::addConflictingCurlOption($options, 'CURLOPT_UPLOAD', 'the request body'); 316 self::addConflictingCurlOption($options, 'CURLOPT_POSTFIELDS', 'the request body'); 317 self::addConflictingCurlOption($options, 'CURLOPT_READFUNCTION', 'the request body'); 318 self::addConflictingCurlOption($options, 'CURLOPT_READDATA', 'the request body'); 319 self::addConflictingCurlOption($options, 'CURLOPT_INFILE', 'the request body'); 320 self::addConflictingCurlOption($options, 'CURLOPT_INFILESIZE', 'the request body'); 321 self::addConflictingCurlOption($options, 'CURLOPT_INFILESIZE_LARGE', 'the request body'); 322 self::addConflictingCurlOption($options, 'CURLOPT_HTTPHEADER', 'the request headers'); 323 self::addConflictingCurlOption($options, 'CURLOPT_USERAGENT', 'the request headers'); 324 self::addConflictingCurlOption($options, 'CURLOPT_REFERER', 'the request headers'); 325 self::addConflictingCurlOption($options, 'CURLOPT_HEADERFUNCTION', 'the "on_headers" request option'); 326 self::addConflictingCurlOption($options, 'CURLOPT_WRITEFUNCTION', 'the "sink" request option'); 327 self::addConflictingCurlOption($options, 'CURLOPT_FILE', 'the "sink" request option'); 328 self::addConflictingCurlOption($options, 'CURLOPT_RETURNTRANSFER', null); 329 self::addConflictingCurlOption($options, 'CURLOPT_HEADER', null); 330 self::addConflictingCurlOption($options, 'CURLOPT_TIMEOUT', 'the "timeout" request option'); 331 self::addConflictingCurlOption($options, 'CURLOPT_TIMEOUT_MS', 'the "timeout" request option'); 332 self::addConflictingCurlOption($options, 'CURLOPT_CONNECTTIMEOUT', 'the "connect_timeout" request option'); 333 self::addConflictingCurlOption($options, 'CURLOPT_CONNECTTIMEOUT_MS', 'the "connect_timeout" request option'); 334 self::addConflictingCurlOption($options, 'CURLOPT_NOSIGNAL', 'the "timeout" or "connect_timeout" request option'); 335 self::addConflictingCurlOption($options, 'CURLOPT_NOPROGRESS', 'the "progress" request option'); 336 self::addConflictingCurlOption($options, 'CURLOPT_PROGRESSFUNCTION', 'the "progress" request option'); 337 self::addConflictingCurlOption($options, 'CURLOPT_XFERINFOFUNCTION', 'the "progress" request option'); 338 self::addConflictingCurlOption($options, 'CURLOPT_VERBOSE', 'the "debug" request option'); 339 self::addConflictingCurlOption($options, 'CURLOPT_STDERR', 'the "debug" request option'); 340 self::addConflictingCurlOption($options, 'CURLOPT_PROXY', 'the "proxy" request option'); 341 self::addConflictingCurlOption($options, 'CURLOPT_NOPROXY', 'the "proxy" request option'); 342 self::addConflictingCurlOption($options, 'CURLOPT_FOLLOWLOCATION', 'the "allow_redirects" request option'); 343 self::addConflictingCurlOption($options, 'CURLOPT_MAXREDIRS', 'the "allow_redirects" request option'); 344 self::addConflictingCurlOption($options, 'CURLOPT_POSTREDIR', 'the "allow_redirects" request option'); 345 self::addConflictingCurlOption($options, 'CURLOPT_REDIR_PROTOCOLS', 'the "allow_redirects" request option'); 346 self::addConflictingCurlOption($options, 'CURLOPT_REDIR_PROTOCOLS_STR', 'the "allow_redirects" request option'); 347 self::addConflictingCurlOption($options, 'CURLOPT_PROTOCOLS', 'the "protocols" request option'); 348 self::addConflictingCurlOption($options, 'CURLOPT_PROTOCOLS_STR', 'the "protocols" request option'); 349 self::addConflictingCurlOption($options, 'CURLOPT_HTTP09_ALLOWED', null); 350 self::addConflictingCurlOption($options, 'CURLOPT_HTTP_VERSION', 'the request protocol version'); 351 self::addConflictingCurlOption($options, 'CURLOPT_IPRESOLVE', 'the "force_ip_resolve" request option'); 352 self::addConflictingCurlOption($options, 'CURLOPT_SSL_VERIFYPEER', 'the "verify" request option'); 353 self::addConflictingCurlOption($options, 'CURLOPT_SSL_VERIFYHOST', 'the "verify" request option'); 354 self::addConflictingCurlOption($options, 'CURLOPT_CAINFO', 'the "verify" request option'); 355 self::addConflictingCurlOption($options, 'CURLOPT_CAPATH', 'the "verify" request option'); 356 self::addConflictingCurlOption($options, 'CURLOPT_SSLVERSION', 'the "crypto_method" request option'); 357 self::addConflictingCurlOption($options, 'CURLOPT_SSLCERT', 'the "cert" request option'); 358 self::addConflictingCurlOption($options, 'CURLOPT_SSLCERTPASSWD', 'the "cert" request option'); 359 self::addConflictingCurlOption($options, 'CURLOPT_SSLCERTTYPE', 'the "cert_type" request option'); 360 self::addConflictingCurlOption($options, 'CURLOPT_SSLKEY', 'the "ssl_key" request option'); 361 self::addConflictingCurlOption($options, 'CURLOPT_SSLKEYPASSWD', 'the "ssl_key" request option'); 362 self::addConflictingCurlOption($options, 'CURLOPT_KEYPASSWD', 'the "ssl_key" request option'); 363 self::addConflictingCurlOption($options, 'CURLOPT_SSLKEYTYPE', 'the "ssl_key_type" request option'); 364 self::addConflictingCurlOption($options, 'CURLOPT_COOKIE', 'the "Cookie" request header or Guzzle cookie middleware'); 365 self::addConflictingCurlOption($options, 'CURLOPT_COOKIEFILE', 'Guzzle cookie middleware'); 366 self::addConflictingCurlOption($options, 'CURLOPT_COOKIEJAR', 'Guzzle cookie middleware'); 367 self::addConflictingCurlOption($options, 'CURLOPT_COOKIELIST', 'Guzzle cookie middleware'); 368 self::addConflictingCurlOption($options, 'CURLOPT_COOKIESESSION', 'Guzzle cookie middleware'); 369 370 return $options; 371 } 372 373 /** 374 * @param array<int, string|null> $options 375 */ 376 private static function addConflictingCurlOption(array &$options, string $constant, ?string $replacement): void 377 { 378 if (!\defined($constant)) { 379 return; 380 } 381 382 $value = \constant($constant); 383 if (\is_int($value)) { 384 $options[$value] = $replacement; 385 } 167 386 } 168 387 … … 396 615 ]; 397 616 617 $protocols = Utils::normalizeProtocols($easy->options['protocols'] ?? ['http', 'https']); 618 $scheme = $easy->request->getUri()->getScheme(); 619 if (!\in_array($scheme, $protocols, true)) { 620 throw new RequestException(\sprintf('The scheme "%s" is not allowed by the protocols request option.', $scheme), $easy->request); 621 } 622 398 623 if (\defined('CURLOPT_PROTOCOLS')) { 399 $conf[\CURLOPT_PROTOCOLS] = \CURLPROTO_HTTP | \CURLPROTO_HTTPS;624 $conf[\CURLOPT_PROTOCOLS] = self::curlProtocolMask($protocols); 400 625 } 401 626 … … 411 636 412 637 return $conf; 638 } 639 640 /** 641 * @param string[] $protocols 642 */ 643 private static function curlProtocolMask(array $protocols): int 644 { 645 $mask = 0; 646 647 if (\in_array('http', $protocols, true)) { 648 $mask |= \CURLPROTO_HTTP; 649 } 650 651 if (\in_array('https', $protocols, true)) { 652 $mask |= \CURLPROTO_HTTPS; 653 } 654 655 return $mask; 656 } 657 658 /** 659 * @param mixed $type 660 */ 661 private static function normalizeTlsFileType(string $option, $type): string 662 { 663 if (!\is_string($type) || $type === '') { 664 throw new \InvalidArgumentException(\sprintf('%s must be a non-empty string', $option)); 665 } 666 667 return \strtoupper($type); 668 } 669 670 private static function shouldValidateSslKeyFile(?string $type): bool 671 { 672 return $type !== 'ENG' && $type !== 'PROV'; 413 673 } 414 674 … … 510 770 { 511 771 foreach (\array_keys($options['_headers']) as $key) { 512 if (!\strcasecmp( $key, $name)) {772 if (!\strcasecmp((string) $key, $name)) { 513 773 unset($options['_headers'][$key]); 514 774 … … 616 876 $scheme = $easy->request->getUri()->getScheme(); 617 877 if (isset($options['proxy'][$scheme])) { 618 $host = $easy->request->getUri()->getHost(); 619 if (isset($options['proxy']['no']) && Utils::isHostInNoProxy($host, $options['proxy']['no'])) { 878 if ( 879 isset($options['proxy']['no']) 880 && Utils::isUriInNoProxy($easy->request->getUri(), $options['proxy']['no']) 881 ) { 620 882 unset($conf[\CURLOPT_PROXY]); 621 883 } else { … … 664 926 } 665 927 928 $certType = null; 929 if (isset($options['cert_type'])) { 930 $certType = self::normalizeTlsFileType('cert_type', $options['cert_type']); 931 $conf[\CURLOPT_SSLCERTTYPE] = $certType; 932 } 933 666 934 if (isset($options['cert'])) { 667 935 $cert = $options['cert']; … … 687 955 // see https://curl.se/libcurl/c/CURLOPT_SSLCERTTYPE.html 688 956 $ext = pathinfo($cert, \PATHINFO_EXTENSION); 689 if ( preg_match('#^(der|p12)$#i', $ext)) {957 if ($certType === null && preg_match('#^(der|p12)$#i', $ext)) { 690 958 $conf[\CURLOPT_SSLCERTTYPE] = strtoupper($ext); 691 959 } 692 960 $conf[\CURLOPT_SSLCERT] = $cert; 961 } 962 963 $sslKeyType = null; 964 if (isset($options['ssl_key_type'])) { 965 $sslKeyType = self::normalizeTlsFileType('ssl_key_type', $options['ssl_key_type']); 966 $conf[\CURLOPT_SSLKEYTYPE] = $sslKeyType; 693 967 } 694 968 695 969 if (isset($options['ssl_key'])) { 696 970 if (\is_array($options['ssl_key'])) { 697 if (\count($options['ssl_key']) === 2) { 698 [$sslKey, $conf[\CURLOPT_SSLKEYPASSWD]] = $options['ssl_key']; 699 } else { 700 [$sslKey] = $options['ssl_key']; 701 } 971 if (!isset($options['ssl_key'][0]) || !\is_string($options['ssl_key'][0])) { 972 throw new \InvalidArgumentException('Invalid ssl_key request option'); 973 } 974 if (isset($options['ssl_key'][1])) { 975 if (!\is_string($options['ssl_key'][1])) { 976 throw new \InvalidArgumentException('Invalid ssl_key request option'); 977 } 978 $conf[\CURLOPT_SSLKEYPASSWD] = $options['ssl_key'][1]; 979 } 980 $sslKey = $options['ssl_key'][0]; 702 981 } 703 982 704 983 $sslKey = $sslKey ?? $options['ssl_key']; 705 984 706 if (!\file_exists($sslKey)) { 985 if (!\is_string($sslKey)) { 986 throw new \InvalidArgumentException('Invalid ssl_key request option'); 987 } 988 989 if (self::shouldValidateSslKeyFile($sslKeyType) && !\file_exists($sslKey)) { 707 990 throw new \InvalidArgumentException("SSL private key not found: {$sslKey}"); 708 991 } … … 796 1079 try { 797 1080 $easy->createResponse(); 798 } catch (\Exception $e) { 1081 } catch (\Throwable $e) { 1082 $easy->response = null; 799 1083 $easy->createResponseException = $e; 800 1084 … … 804 1088 try { 805 1089 $onHeaders($easy->response); 806 } catch (\ Exception$e) {1090 } catch (\Throwable $e) { 807 1091 // Associate the exception with the handle and trigger 808 1092 // a curl header write error by returning 0. -
sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php
r3505951 r3562098 4 4 5 5 use GuzzleHttp\Promise\PromiseInterface; 6 use GuzzleHttp\TransportSharing; 6 7 use Psr\Http\Message\RequestInterface; 7 8 … … 23 24 24 25 /** 26 * @var CurlShareHandleState|null 27 */ 28 private $shareHandleState; 29 30 /** 25 31 * Accepts an associative array of options: 26 32 * 27 33 * - handle_factory: Optional curl factory used to create cURL handles. 34 * - transport_sharing: Optional transport sharing mode. 28 35 * 29 * @param array{handle_factory?: ?CurlFactoryInterface } $options Array of options to use with the handler36 * @param array{handle_factory?: ?CurlFactoryInterface, transport_sharing?: mixed} $options Array of options to use with the handler 30 37 */ 31 38 public function __construct(array $options = []) 32 39 { 33 $this->factory = $options['handle_factory'] 34 ?? new CurlFactory(3); 40 CurlShareHandleState::assertNoRequiredSharingCustomFactoryConflict($options, 'CurlHandler'); 41 $transportSharing = $options['transport_sharing'] ?? null; 42 $sharingMode = CurlShareHandleState::normalizeMode($transportSharing, 'transport_sharing'); 43 44 if (\array_key_exists('handle_factory', $options) && $options['handle_factory'] !== null) { 45 $this->shareHandleState = null; 46 $this->factory = $options['handle_factory']; 47 48 return; 49 } 50 51 $this->shareHandleState = $sharingMode !== TransportSharing::NONE 52 ? CurlShareHandleState::fromOption($transportSharing) 53 : null; 54 55 $this->factory = $this->shareHandleState !== null 56 ? new CurlFactory(3, $this->shareHandleState->mode, $this->shareHandleState->handle) 57 : new CurlFactory(3); 35 58 } 36 59 -
sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php
r3561022 r3562098 7 7 use GuzzleHttp\Promise\Promise; 8 8 use GuzzleHttp\Promise\PromiseInterface; 9 use GuzzleHttp\TransportSharing; 9 10 use GuzzleHttp\Utils; 10 11 use Psr\Http\Message\RequestInterface; … … 27 28 28 29 /** 30 * @var CurlShareHandleState|null 31 */ 32 private $shareHandleState; 33 34 /** 29 35 * @var int 30 36 */ … … 72 78 * 73 79 * - handle_factory: An optional factory used to create curl handles 80 * - transport_sharing: Optional transport sharing mode. 74 81 * - select_timeout: Optional timeout (in seconds) to block before timing 75 82 * out while selecting curl handles. Defaults to 1 second. … … 79 86 public function __construct(array $options = []) 80 87 { 81 $this->factory = $options['handle_factory'] ?? new CurlFactory(50); 88 CurlShareHandleState::assertNoRequiredSharingCustomFactoryConflict($options, 'CurlMultiHandler'); 89 $transportSharing = $options['transport_sharing'] ?? null; 90 $sharingMode = CurlShareHandleState::normalizeMode($transportSharing, 'transport_sharing'); 91 92 if (\array_key_exists('handle_factory', $options) && $options['handle_factory'] !== null) { 93 $this->shareHandleState = null; 94 $this->factory = $options['handle_factory']; 95 } else { 96 $this->shareHandleState = $sharingMode !== TransportSharing::NONE 97 ? CurlShareHandleState::fromOption($transportSharing) 98 : null; 99 100 $this->factory = $this->shareHandleState !== null 101 ? new CurlFactory(50, $this->shareHandleState->mode, $this->shareHandleState->handle) 102 : new CurlFactory(50); 103 } 82 104 83 105 if (isset($options['select_timeout'])) { 84 106 $this->selectTimeout = $options['select_timeout']; 85 107 } elseif ($selectTimeout = Utils::getenv('GUZZLE_CURL_SELECT_TIMEOUT')) { 86 @trigger_error('Since guzzlehttp/guzzle 7.2.0: Using environment variable GUZZLE_CURL_SELECT_TIMEOUT is deprecated. Use option "select_timeout" instead.', \E_USER_DEPRECATED);108 \trigger_deprecation('guzzlehttp/guzzle', '7.2', 'The GUZZLE_CURL_SELECT_TIMEOUT environment variable is deprecated; use the "select_timeout" option instead.'); 87 109 $this->selectTimeout = (int) $selectTimeout; 88 110 } else { … … 130 152 { 131 153 if (isset($this->_mh)) { 132 \curl_multi_close($this->_mh); 133 unset($this->_mh); 154 try { 155 \curl_multi_close($this->_mh); 156 } catch (\Throwable $e) { 157 // Destructors must not throw. 158 } finally { 159 unset($this->_mh); 160 } 134 161 } 135 162 } … … 260 287 { 261 288 if (!is_int($id)) { 262 trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an integerto %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);289 \trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an int to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); 263 290 } 264 291 -
sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php
r3561022 r3562098 57 57 58 58 /** 59 * @var \ Exception|null Exception during createResponse (if any)59 * @var \Throwable|null Exception during createResponse (if any) 60 60 */ 61 61 public $createResponseException; -
sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php
r3561022 r3562098 25 25 } 26 26 27 $parts = \explode(' ', \array_shift($headers), 3); 27 $headers = self::getLastHeaderBlock(\array_values($headers)); 28 29 $statusLine = \array_shift($headers); 30 if ($statusLine === null) { 31 throw new \RuntimeException('Expected a non-empty array of header data'); 32 } 33 34 $parts = \explode(' ', $statusLine, 3); 28 35 $version = \explode('/', $parts[0])[1] ?? null; 29 36 … … 38 45 } 39 46 47 if (!\preg_match('/^\d{3}$/', $status)) { 48 throw new \RuntimeException('HTTP status code is invalid'); 49 } 50 40 51 foreach ($headers as $header) { 41 52 if (\strpos($header, ':') === false) { … … 46 57 return [$version, (int) $status, $parts[2] ?? null, Utils::headersFromLines($headers)]; 47 58 } 59 60 /** 61 * @param non-empty-list<string> $headers 62 * 63 * @return list<string> 64 */ 65 private static function getLastHeaderBlock(array $headers): array 66 { 67 $lastStatusLine = 0; 68 69 foreach ($headers as $index => $line) { 70 if (\preg_match('/^HTTP\/\S+\s+/i', $line)) { 71 $lastStatusLine = $index; 72 } 73 } 74 75 return \array_slice($headers, $lastStatusLine); 76 } 48 77 } -
sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php
r3561022 r3562098 10 10 use GuzzleHttp\Psr7; 11 11 use GuzzleHttp\TransferStats; 12 use GuzzleHttp\TransportSharing; 12 13 use GuzzleHttp\Utils; 13 14 use Psr\Http\Message\RequestInterface; … … 62 63 63 64 if ('' === $protocolVersion) { 65 \trigger_deprecation('guzzlehttp/guzzle', '7.11', 'Sending a request with an empty protocol version is deprecated; guzzlehttp/guzzle 8.0 will reject empty protocol versions.'); 66 64 67 $protocolVersion = '1.1'; 65 68 $request = Psr7\Utils::modifyRequest($request, ['version' => $protocolVersion]); … … 71 74 72 75 $startTime = isset($options['on_stats']) ? Utils::currentTime() : null; 76 77 self::triggerUnsupportedRequestOptionDeprecations($request, $options); 73 78 74 79 try { … … 101 106 $e = new ConnectException($e->getMessage(), $request, $e); 102 107 } else { 103 $e = RequestException::wrapException($request, $e);108 $e = $e instanceof RequestException ? $e : new RequestException($e->getMessage(), $request, null, $e); 104 109 } 105 110 $this->invokeStats($options, $request, $startTime, null, $e); … … 143 148 try { 144 149 [$ver, $status, $reason, $headers] = HeaderProcessor::parseHeaders($hdrs); 145 } catch (\Exception $e) { 146 return P\Create::rejectionFor( 147 new RequestException('An error was encountered while creating the response', $request, null, $e) 148 ); 150 } catch (\Throwable $e) { 151 return $this->rejectResponseCreation($options, $request, $startTime, $e); 149 152 } 150 153 … … 159 162 try { 160 163 $response = new Psr7\Response($status, $headers, $sink, $ver, $reason); 161 } catch (\Exception $e) { 162 return P\Create::rejectionFor( 163 new RequestException('An error was encountered while creating the response', $request, null, $e) 164 ); 164 } catch (\Throwable $e) { 165 return $this->rejectResponseCreation($options, $request, $startTime, $e); 165 166 } 166 167 … … 168 169 try { 169 170 $options['on_headers']($response); 170 } catch (\ Exception$e) {171 } catch (\Throwable $e) { 171 172 return P\Create::rejectionFor( 172 173 new RequestException('An error was encountered during the on_headers event', $request, $response, $e) … … 184 185 185 186 return new FulfilledPromise($response); 187 } 188 189 private function rejectResponseCreation( 190 array $options, 191 RequestInterface $request, 192 ?float $startTime, 193 \Throwable $previous 194 ): PromiseInterface { 195 $reason = new RequestException( 196 'An error was encountered while creating the response', 197 $request, 198 null, 199 $previous 200 ); 201 202 $this->invokeStats($options, $request, $startTime, null, $reason); 203 204 return P\Create::rejectionFor($reason); 186 205 } 187 206 … … 305 324 } 306 325 307 if (!\in_array($request->getUri()->getScheme(), ['http', 'https'])) { 308 throw new RequestException(\sprintf("The scheme '%s' is not supported.", $request->getUri()->getScheme()), $request); 326 $scheme = $request->getUri()->getScheme(); 327 if (!\in_array($scheme, ['http', 'https'], true)) { 328 throw new RequestException(\sprintf("The scheme '%s' is not supported.", $scheme), $request); 329 } 330 331 $protocols = Utils::normalizeProtocols($options['protocols'] ?? ['http', 'https']); 332 if (!\in_array($scheme, $protocols, true)) { 333 throw new RequestException(\sprintf('The scheme "%s" is not allowed by the protocols request option.', $scheme), $request); 309 334 } 310 335 … … 364 389 // See https://wiki.php.net/rfc/deprecations_php_8_5#deprecate_the_http_response_header_predefined_variable 365 390 if (function_exists('http_get_last_response_headers')) { 366 /** @var array|null */367 391 $http_response_header = \http_get_last_response_headers(); 368 392 } … … 449 473 } 450 474 475 private static function triggerUnsupportedRequestOptionDeprecations(RequestInterface $request, array $options): void 476 { 477 if (\array_key_exists('transport_sharing', $options)) { 478 $transportSharingMode = CurlShareHandleState::normalizeMode($options['transport_sharing'], 'transport_sharing'); 479 480 if ($transportSharingMode === TransportSharing::HANDLER_REQUIRE) { 481 throw new \InvalidArgumentException('The "transport_sharing" option requires transport sharing, but the stream handler does not support it.'); 482 } 483 } 484 485 if ( 486 \array_key_exists('curl', $options) 487 && $options['curl'] !== null 488 && $options['curl'] !== [] 489 && !self::isCurlOptionGeneratedByAuth($options) 490 ) { 491 \trigger_deprecation('guzzlehttp/guzzle', '7.11', 'Passing the "curl" request option to the stream handler is deprecated; guzzlehttp/guzzle 8.0 will reject this option because the stream handler ignores cURL options.'); 492 } 493 494 if (self::usesDigestAuth($options)) { 495 \trigger_deprecation('guzzlehttp/guzzle', '7.11', 'Passing digest authentication to the stream handler is deprecated; guzzlehttp/guzzle 8.0 will reject digest authentication with the stream handler because it is only supported by cURL handlers.'); 496 } 497 498 if (\array_key_exists('expect', $options) && $options['expect'] !== false && $request->hasHeader('Expect')) { 499 \trigger_deprecation('guzzlehttp/guzzle', '7.11', 'Passing the "expect" request option to the stream handler is deprecated when it adds an Expect header; guzzlehttp/guzzle 8.0 will reject this option because the stream handler does not support Expect: 100-Continue.'); 500 } 501 } 502 503 private static function isCurlOptionGeneratedByAuth(array $options): bool 504 { 505 if (!isset($options['curl']) || !\is_array($options['curl']) || !isset($options['auth'][2]) || !\is_string($options['auth'][2])) { 506 return false; 507 } 508 509 if (!\defined('CURLOPT_HTTPAUTH') || !\defined('CURLOPT_USERPWD')) { 510 return false; 511 } 512 513 $type = \strtolower($options['auth'][2]); 514 if ($type === 'digest') { 515 $httpAuth = \defined('CURLAUTH_DIGEST') ? \constant('CURLAUTH_DIGEST') : null; 516 } elseif ($type === 'ntlm') { 517 $httpAuth = \defined('CURLAUTH_NTLM') ? \constant('CURLAUTH_NTLM') : null; 518 } else { 519 return false; 520 } 521 522 return $httpAuth !== null 523 && \count($options['curl']) === 2 524 && isset($options['curl'][\CURLOPT_HTTPAUTH], $options['curl'][\CURLOPT_USERPWD]) 525 && $options['curl'][\CURLOPT_HTTPAUTH] === $httpAuth; 526 } 527 528 private static function usesDigestAuth(array $options): bool 529 { 530 return isset($options['auth'][2]) 531 && \is_string($options['auth'][2]) 532 && \strtolower($options['auth'][2]) === 'digest'; 533 } 534 535 /** 536 * @param mixed $value as passed via Request transfer options. 537 * 538 * @return array{0: string, 1: string|null} 539 */ 540 private static function normalizeTlsFileOption(string $option, $value): array 541 { 542 $passphrase = null; 543 544 if (\is_array($value)) { 545 if (!isset($value[0]) || !\is_string($value[0])) { 546 throw new \InvalidArgumentException(\sprintf('Invalid %s request option', $option)); 547 } 548 if (isset($value[1])) { 549 if (!\is_string($value[1])) { 550 throw new \InvalidArgumentException(\sprintf('Invalid %s request option', $option)); 551 } 552 $passphrase = $value[1]; 553 } 554 $value = $value[0]; 555 } 556 557 if (!\is_string($value)) { 558 throw new \InvalidArgumentException(\sprintf('Invalid %s request option', $option)); 559 } 560 561 return [$value, $passphrase]; 562 } 563 564 private static function setTlsPassphrase(array &$options, ?string $passphrase, string $option): void 565 { 566 if ($passphrase === null) { 567 return; 568 } 569 570 if (isset($options['ssl']['passphrase']) && $options['ssl']['passphrase'] !== $passphrase) { 571 throw new \InvalidArgumentException(\sprintf('Cannot use different passphrases for cert and ssl_key with the stream handler; %s conflicts with an existing TLS passphrase.', $option)); 572 } 573 574 $options['ssl']['passphrase'] = $passphrase; 575 } 576 577 /** 578 * @param mixed $value as passed via Request transfer options. 579 */ 580 private static function assertStreamTlsType(string $option, $value): void 581 { 582 if (!\is_string($value) || $value === '') { 583 throw new \InvalidArgumentException(\sprintf('%s must be a non-empty string', $option)); 584 } 585 586 if (\strtoupper($value) !== 'PEM') { 587 throw new \InvalidArgumentException(\sprintf('The stream handler only supports "PEM" for the %s request option.', $option)); 588 } 589 } 590 451 591 /** 452 592 * @param mixed $value as passed via Request transfer options. … … 461 601 $scheme = $request->getUri()->getScheme(); 462 602 if (isset($value[$scheme])) { 463 if (!isset($value['no']) || !Utils::isHostInNoProxy($request->getUri()->getHost(), $value['no'])) { 603 if ( 604 !isset($value['no']) 605 || !Utils::isUriInNoProxy($request->getUri(), $value['no']) 606 ) { 464 607 $uri = $value[$scheme]; 465 608 } … … 570 713 private function add_cert(RequestInterface $request, array &$options, $value, array &$params): void 571 714 { 572 if (\is_array($value)) { 573 if (!isset($value[0]) || !\is_string($value[0])) { 574 throw new \InvalidArgumentException('Invalid cert request option'); 575 } 576 if (isset($value[1])) { 577 if (!\is_string($value[1])) { 578 throw new \InvalidArgumentException('Invalid cert request option'); 579 } 580 $options['ssl']['passphrase'] = $value[1]; 581 } 582 $value = $value[0]; 583 } 584 585 if (!\is_string($value)) { 586 throw new \InvalidArgumentException('Invalid cert request option'); 587 } 715 [$value, $passphrase] = self::normalizeTlsFileOption('cert', $value); 588 716 589 717 if (!\file_exists($value)) { … … 591 719 } 592 720 721 self::setTlsPassphrase($options, $passphrase, 'cert'); 593 722 $options['ssl']['local_cert'] = $value; 723 } 724 725 /** 726 * @param mixed $value as passed via Request transfer options. 727 */ 728 private function add_cert_type(RequestInterface $request, array &$options, $value, array &$params): void 729 { 730 self::assertStreamTlsType('cert_type', $value); 731 } 732 733 /** 734 * @param mixed $value as passed via Request transfer options. 735 */ 736 private function add_ssl_key(RequestInterface $request, array &$options, $value, array &$params): void 737 { 738 [$value, $passphrase] = self::normalizeTlsFileOption('ssl_key', $value); 739 740 if (!\file_exists($value)) { 741 throw new \RuntimeException("SSL private key not found: {$value}"); 742 } 743 744 self::setTlsPassphrase($options, $passphrase, 'ssl_key'); 745 $options['ssl']['local_pk'] = $value; 746 } 747 748 /** 749 * @param mixed $value as passed via Request transfer options. 750 */ 751 private function add_ssl_key_type(RequestInterface $request, array &$options, $value, array &$params): void 752 { 753 self::assertStreamTlsType('ssl_key_type', $value); 594 754 } 595 755 -
sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/HandlerStack.php
r3561022 r3562098 182 182 { 183 183 if (!is_string($remove) && !is_callable($remove)) { 184 trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a callable or string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);184 \trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a callable or string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); 185 185 } 186 186 -
sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/Pool.php
r3505951 r3562098 50 50 } else { 51 51 $opts = []; 52 } 53 54 if (!\is_iterable($requests)) { 55 \trigger_deprecation( 56 'guzzlehttp/guzzle', 57 '7.11', 58 'Passing a non-iterable request collection to %s::__construct() or %s::batch() is deprecated; guzzlehttp/guzzle 8.0 will require an iterable.', 59 __CLASS__, 60 __CLASS__ 61 ); 62 63 $requests = [$requests]; 52 64 } 53 65 -
sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php
r3561022 r3562098 178 178 179 179 $uri = self::redirectUri($request, $response, $protocols); 180 if (isset($options['idn_conversion']) && ($options['idn_conversion'] !== false)) {181 $idnOptions = ($options['idn_conversion'] === true) ? \IDNA_DEFAULT : $options['idn_conversion'];180 $idnOptions = Utils::normalizeIdnConversionOption($options['idn_conversion'] ?? null); 181 if ($idnOptions !== null) { 182 182 $uri = Utils::idnUriConvert($uri, $idnOptions); 183 183 } -
sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/RequestOptions.php
r3561022 r3562098 6 6 * This class contains a list of built-in Guzzle request options. 7 7 * 8 * @see https:// docs.guzzlephp.org/en/latest/request-options.html8 * @see https://github.com/guzzle/guzzle/blob/7.11/docs/request-options.md 9 9 */ 10 10 final class RequestOptions … … 24 24 * - referer: (bool, default=false) Set to true to enable the Referer 25 25 * header. 26 * - protocols: (array, default=['http', 'https']) Allowed redirect 27 * protocols. 26 * - protocols: (non-empty-array<array-key, string>, default=['http', 'https']) 27 * Allowed redirect protocols. Redirect matching is case-sensitive; use 28 * "http" and "https". 28 29 * - on_redirect: (callable) PHP callable that is invoked when a redirect 29 30 * is encountered. The callable is invoked with the request, the redirect 30 31 * response that was received, and the effective URI. Any return value 31 32 * from the on_redirect function is ignored. 33 * - track_redirects: (bool, default=false) Track redirected URI and status 34 * history in response headers. 32 35 */ 33 36 public const ALLOW_REDIRECTS = 'allow_redirects'; 34 37 35 38 /** 36 * auth: (array) Pass an array of HTTP authentication parameters to use 37 * with the request. The array must contain the username in index [0], 38 * the password in index [1], and you can optionally provide a built-in 39 * authentication type in index [2]. Pass null to disable authentication 40 * for a request. 39 * auth: (array{0: string, 1: string, 2?: string|null}|string|false|null) 40 * Pass an array of HTTP authentication parameters to use with the request. 41 * The array must contain the username in index [0], the password in index 42 * [1], and you can optionally provide a built-in authentication type in 43 * index [2]. Pass false or null to disable authentication for a request. 44 * String values are passed through for custom handlers. 41 45 */ 42 46 public const AUTH = 'auth'; 43 47 44 48 /** 45 * body: (resource|string|null|int|float|StreamInterface|callable|\Iterator) 46 * Body to send in the request. 49 * body: (resource|string|null|int|float|bool|\Psr\Http\Message\StreamInterface|(callable&object)|\Iterator|\Stringable) 50 * Body to send in the request. Callable arrays are arrays, and arrays are 51 * not valid body values in Guzzle. 47 52 */ 48 53 public const BODY = 'body'; 49 54 50 55 /** 51 * cert: (string|array) Set to a string to specify the path to a file 52 * containing a PEM formatted SSL client side certificate. If a password 53 * is required, then set cert to an array containing the path to the PEM 54 * file in the first array element followed by the certificate password 55 * in the second array element. 56 * cert: (string|array{0: string, 1?: string|null}) Set to a string to 57 * specify the path to a client certificate file. PEM is the default 58 * certificate format. If a password is required, set cert to an array 59 * containing the certificate path in the first array element followed by 60 * the certificate password in the second array element. A null password is 61 * treated the same as omitting it. Use cert_type to specify another 62 * supported certificate format. 56 63 */ 57 64 public const CERT = 'cert'; 58 65 59 66 /** 60 * cookies: (bool|GuzzleHttp\Cookie\CookieJarInterface, default=false) 67 * cert_type: (string) Specify the SSL client certificate file type. 68 */ 69 public const CERT_TYPE = 'cert_type'; 70 71 /** 72 * cookies: (false|GuzzleHttp\Cookie\CookieJarInterface, default=false) 61 73 * Specifies whether or not cookies are used in a request or what cookie 62 74 * jar to use or what cookies to send. This option only works if your … … 67 79 68 80 /** 69 * connect_timeout: ( float, default=0) Float describing the number of70 * seconds to wait while trying to connect to a server. Use 0 to wait71 * 300 seconds (the defaultbehavior).81 * connect_timeout: (int|float, default=0) Number of seconds to wait while 82 * trying to connect to a server. Use 0 to wait 300 seconds (the default 83 * behavior). 72 84 */ 73 85 public const CONNECT_TIMEOUT = 'connect_timeout'; … … 93 105 94 106 /** 95 * decode_content: (bool , default=true) Specify whether or not107 * decode_content: (bool|string, default=true) Specify whether or not 96 108 * Content-Encoding responses (gzip, deflate, etc.) are automatically 97 109 * decoded. … … 100 112 101 113 /** 102 * delay: (int) The amount of time to delay before sending in milliseconds. 114 * delay: (int|float) The amount of time to delay before sending in 115 * milliseconds. 103 116 */ 104 117 public const DELAY = 'delay'; … … 123 136 124 137 /** 125 * form_params: (array ) Associative array of form field names to values126 * where each value is a string or array of strings. Sets the Content-Type127 * header to application/x-www-form-urlencoded when no Content-Type header128 * is already present.138 * form_params: (array<array-key, string|int|float|bool|null|array>) 139 * Associative array of form field names to scalar, null, or nested array 140 * values. Sets the Content-Type header to application/x-www-form-urlencoded 141 * when no Content-Type header is already present. 129 142 */ 130 143 public const FORM_PARAMS = 'form_params'; 131 144 132 145 /** 133 * headers: (array) Associative array of HTTP headers. Each value MUST be 134 * a string or array of strings. 146 * headers: (array<array-key, string|non-empty-array<array-key, string>>|null) 147 * Associative array of HTTP headers. Each value MUST be a string or non-empty 148 * array of strings. 135 149 */ 136 150 public const HEADERS = 'headers'; … … 145 159 146 160 /** 147 * idn : (bool|int, default=true) A combination of IDNA_* constants for148 * idn_to_ascii() PHP's function (see "options" parameter). Set to falseto149 * disable IDN support completely, or to true to use the default150 * configuration(IDNA_DEFAULT constant).161 * idn_conversion: (bool|int|null, default=false) A combination of IDNA_* 162 * constants for PHP's idn_to_ascii() function. Set to false or null to 163 * disable IDN support, or to true to use the default configuration 164 * (IDNA_DEFAULT constant). 151 165 */ 152 166 public const IDN_CONVERSION = 'idn_conversion'; … … 160 174 161 175 /** 162 * multipart: (array) Array of associative arrays, each containing a163 * required "name" key mapping to the form field,name, a required164 * "contents" key mapping to a StreamInterface|resource|string, an165 * optional "headers" associative array of custom headers, and an166 * optional "filename" key mapping to a string to send as the filename in167 * the part. If no "filename" key is present, then no "filename" attribute168 * will be added to the part.176 * multipart: (array) Array of part arrays, each containing a required 177 * "name" key mapping to the string or integer form field name, a required 178 * "contents" key mapping to any non-array value accepted by PSR-7 179 * Utils::streamFor() or a nested array of field values, an optional 180 * "headers" array of string custom header values, and an optional 181 * "filename" key mapping to a string to send as the filename in the part. 182 * "headers" and "filename" cannot be used when "contents" is an array. 169 183 */ 170 184 public const MULTIPART = 'multipart'; … … 198 212 199 213 /** 214 * protocols: (non-empty-array<array-key, string>, default=['http', 'https']) 215 * Allowed URI schemes. Built-in handlers accept only the case-sensitive 216 * values "http" and "https". 217 */ 218 public const PROTOCOLS = 'protocols'; 219 220 /** 200 221 * proxy: (string|array) Pass a string to specify an HTTP proxy, or an 201 222 * array to specify different proxies for different protocols (where the 202 * key is the protocol and the value is a proxy string). 223 * key is the protocol and the value is a proxy string or null). Provide a 224 * "no" key as a comma-delimited string, array of strings, or null to 225 * specify hosts or host-and-port pairs that should not be proxied. 203 226 */ 204 227 public const PROXY = 'proxy'; 205 228 206 229 /** 207 * query: (array |string) Associative array of query string values to add208 * to the request. This option uses PHP's http_build_query() to create209 * t he string representation. Pass a string value if you need more210 * control than what this method provides230 * query: (array<array-key, mixed>|string) Associative array of query string 231 * values to add to the request. This option uses PHP's http_build_query() 232 * to create the string representation. Pass a string value if you need 233 * more control than what this method provides 211 234 */ 212 235 public const QUERY = 'query'; 213 236 214 237 /** 215 * sink: (resource|string| StreamInterface) Where the data of the216 * response is written to. Defaults to a PHP temp stream. Providing a217 * string will write data to a file by the given name.238 * sink: (resource|string|\Psr\Http\Message\StreamInterface) Where the data 239 * of the response is written to. Defaults to a PHP temp stream. Providing 240 * a string will write data to a file by the given name. 218 241 */ 219 242 public const SINK = 'sink'; … … 228 251 229 252 /** 230 * ssl_key: (array|string) Specify the path to a file containing a private 231 * SSL key in PEM format. If a password is required, then set to an array 232 * containing the path to the SSL key in the first array element followed 233 * by the password required for the certificate in the second element. 253 * ssl_key: (array{0: string, 1?: string|null}|string) Specify the path to 254 * a private SSL key file. PEM is the default private key format. If a 255 * password is required, set ssl_key to an array containing the key path in 256 * the first array element followed by the key password in the second 257 * element. A null password is treated the same as omitting it. Use 258 * ssl_key_type to specify another supported key format. 234 259 */ 235 260 public const SSL_KEY = 'ssl_key'; 236 261 237 262 /** 238 * stream: Set to true to attempt to stream a response rather than 263 * ssl_key_type: (string) Specify the SSL private key file type. 264 */ 265 public const SSL_KEY_TYPE = 'ssl_key_type'; 266 267 /** 268 * stream: (bool) Set to true to attempt to stream a response rather than 239 269 * download it all up-front. 240 270 */ … … 252 282 253 283 /** 254 * timeout: ( float, default=0) Floatdescribing the timeout of the284 * timeout: (int|float, default=0) Number describing the timeout of the 255 285 * request in seconds. Use 0 to wait indefinitely (the default behavior). 256 286 */ … … 258 288 259 289 /** 260 * read_timeout: ( float, default=default_socket_timeout ini setting) Float describing261 * the body read timeout, for stream requests.290 * read_timeout: (int|float, default=default_socket_timeout ini setting) 291 * Number describing the body read timeout, for stream requests. 262 292 */ 263 293 public const READ_TIMEOUT = 'read_timeout'; 264 294 265 295 /** 266 * version: (string|float) Specifies the HTTP protocol version to attempt to use. 296 * version: (string|int|float) Specifies the HTTP protocol version to attempt 297 * to use. 267 298 */ 268 299 public const VERSION = 'version'; 269 300 270 301 /** 271 * force_ip_resolve: (bool) Force client to use only ipv4 or ipv6 protocol 302 * force_ip_resolve: (string) Set to "v4" to force IPv4 resolution or "v6" 303 * for IPv6 resolution when supported by the handler. 272 304 */ 273 305 public const FORCE_IP_RESOLVE = 'force_ip_resolve'; -
sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php
r3505951 r3562098 45 45 $this->decider = $decider; 46 46 $this->nextHandler = $nextHandler; 47 $this->delay = $delay ?: __CLASS__.'::exponentialDelay'; 47 $this->delay = $delay ?: static function (int $retries): int { 48 return (int) 2 ** ($retries - 1) * 1000; 49 }; 48 50 } 49 51 … … 52 54 * 53 55 * @return int milliseconds. 56 * 57 * @deprecated since 7.11, will be removed in 8.0. 54 58 */ 55 59 public static function exponentialDelay(int $retries): int 56 60 { 61 \trigger_deprecation('guzzlehttp/guzzle', '7.11', '%s::%s() is deprecated and will be removed in 8.0.', __CLASS__, __FUNCTION__); 62 57 63 return (int) 2 ** ($retries - 1) * 1000; 58 64 } -
sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/Utils.php
r3561022 r3562098 6 6 use GuzzleHttp\Handler\CurlHandler; 7 7 use GuzzleHttp\Handler\CurlMultiHandler; 8 use GuzzleHttp\Handler\CurlShareHandleState; 8 9 use GuzzleHttp\Handler\Proxy; 9 10 use GuzzleHttp\Handler\StreamHandler; 11 use Psr\Http\Message\RequestInterface; 10 12 use Psr\Http\Message\UriInterface; 11 13 … … 80 82 * The returned handler is not wrapped by any default middlewares. 81 83 * 82 * @return callable(\Psr\Http\Message\RequestInterface, array): Promise\PromiseInterface Returns the best handler for the given system. 84 * @param array{transport_sharing?: mixed} $handlerOptions Handler constructor options. 85 * 86 * @return callable(RequestInterface, array): Promise\PromiseInterface Returns the best handler for the given system. 83 87 * 84 88 * @throws \RuntimeException if no viable Handler is available. 85 89 */ 86 public static function chooseHandler( ): callable90 public static function chooseHandler(array $handlerOptions = []): callable 87 91 { 88 92 $handler = null; 89 90 if (\defined('CURLOPT_CUSTOMREQUEST') && \function_exists('curl_version') && version_compare(curl_version()['version'], '7.21.2') >= 0) { 93 $sharingMode = CurlShareHandleState::normalizeMode($handlerOptions['transport_sharing'] ?? null, 'transport_sharing'); 94 $sharingRequested = $sharingMode !== TransportSharing::NONE; 95 $sharingRequired = $sharingMode === TransportSharing::HANDLER_REQUIRE; 96 $curlHandlerOptions = []; 97 $curlSupported = \defined('CURLOPT_CUSTOMREQUEST') 98 && \function_exists('curl_version') 99 && version_compare(curl_version()['version'], '7.21.2') >= 0 100 && (\function_exists('curl_multi_exec') || \function_exists('curl_exec')); 101 102 if ($sharingRequired && !$curlSupported) { 103 throw new \RuntimeException('Required transport sharing requires the PHP cURL extension, curl_exec() or curl_multi_exec(), and libcurl 7.21.2 or higher.'); 104 } 105 106 if ($curlSupported) { 107 if ($sharingRequested) { 108 $shareState = CurlShareHandleState::fromOption($sharingMode); 109 if ($shareState !== null) { 110 $curlHandlerOptions['transport_sharing'] = $shareState; 111 } 112 } 113 91 114 if (\function_exists('curl_multi_exec') && \function_exists('curl_exec')) { 92 $handler = Proxy::wrapSync(new CurlMultiHandler( ), new CurlHandler());115 $handler = Proxy::wrapSync(new CurlMultiHandler($curlHandlerOptions), new CurlHandler($curlHandlerOptions)); 93 116 } elseif (\function_exists('curl_exec')) { 94 $handler = new CurlHandler( );117 $handler = new CurlHandler($curlHandlerOptions); 95 118 } elseif (\function_exists('curl_multi_exec')) { 96 $handler = new CurlMultiHandler( );119 $handler = new CurlMultiHandler($curlHandlerOptions); 97 120 } 98 121 } 99 122 100 123 if (\ini_get('allow_url_fopen')) { 124 $streamHandler = new StreamHandler(); 125 if ($sharingRequired) { 126 $streamHandler = self::wrapStreamHandlerTransportSharing($streamHandler, $sharingMode); 127 } 128 101 129 $handler = $handler 102 ? Proxy::wrapStreaming($handler, new StreamHandler())103 : new StreamHandler();130 ? Proxy::wrapStreaming($handler, $streamHandler) 131 : $streamHandler; 104 132 } elseif (!$handler) { 105 133 throw new \RuntimeException('GuzzleHttp requires cURL, the allow_url_fopen ini setting, or a custom HTTP handler.'); … … 107 135 108 136 return $handler; 137 } 138 139 private static function wrapStreamHandlerTransportSharing(callable $handler, string $sharingMode): callable 140 { 141 return static function (RequestInterface $request, array $options) use ($handler, $sharingMode): Promise\PromiseInterface { 142 if (\array_key_exists('transport_sharing', $options)) { 143 CurlShareHandleState::normalizeMode($options['transport_sharing'], 'transport_sharing'); 144 } 145 146 $options['transport_sharing'] = $sharingMode; 147 148 return $handler($request, $options); 149 }; 109 150 } 110 151 … … 177 218 CA bundle by default. In order to verify peer certificates, you will need to 178 219 supply the path on disk to a certificate bundle to the 'verify' request 179 option: https:// docs.guzzlephp.org/en/latest/request-options.html#verify. If220 option: https://github.com/guzzle/guzzle/blob/7.11/docs/request-options.md#verify. If 180 221 you do not need a specific certificate bundle, then Mozilla provides a commonly 181 222 used CA bundle which can be downloaded here (provided by the maintainer of … … 196 237 $result = []; 197 238 foreach (\array_keys($headers) as $key) { 198 $result[\strtolower( $key)] = $key;239 $result[\strtolower((string) $key)] = $key; 199 240 } 200 241 201 242 return $result; 243 } 244 245 /** 246 * @param mixed $protocols 247 * 248 * @return string[] 249 * 250 * @throws InvalidArgumentException 251 */ 252 public static function normalizeProtocols($protocols): array 253 { 254 if (!\is_array($protocols) || $protocols === []) { 255 throw new InvalidArgumentException('protocols must be a non-empty array of "http" and/or "https"'); 256 } 257 258 $normalized = []; 259 260 foreach ($protocols as $protocol) { 261 if (!\is_string($protocol)) { 262 throw new InvalidArgumentException('protocols must contain only strings'); 263 } 264 265 if ($protocol !== 'http' && $protocol !== 'https') { 266 throw new InvalidArgumentException('protocols may only contain "http" and "https"'); 267 } 268 269 $normalized[$protocol] = true; 270 } 271 272 return \array_keys($normalized); 202 273 } 203 274 … … 235 306 } 236 307 237 if (empty($area)) { 238 // Don't match on empty values. 308 if ($area === '') { 239 309 continue; 240 310 } … … 261 331 } 262 332 333 /** 334 * Returns true if the provided URI matches any of the no proxy areas. 335 * 336 * @param mixed $noProxy No-proxy host patterns. 337 * 338 * @internal 339 */ 340 public static function isUriInNoProxy(UriInterface $uri, $noProxy): bool 341 { 342 if (\is_string($noProxy)) { 343 $noProxy = \explode(',', $noProxy); 344 } 345 346 if (!\is_array($noProxy)) { 347 return false; 348 } 349 350 $host = $uri->getHost(); 351 if ($host === '') { 352 return false; 353 } 354 355 $port = $uri->getPort(); 356 if ($port === null) { 357 $port = self::getDefaultPort($uri->getScheme()); 358 } 359 360 foreach ($noProxy as $area) { 361 if (!\is_string($area)) { 362 continue; 363 } 364 365 $area = \trim($area); 366 367 // Always match on wildcards. 368 if ($area === '*') { 369 return true; 370 } 371 372 if ($area === '') { 373 continue; 374 } 375 376 [$area, $areaPort] = self::splitNoProxyHostAndPort($area); 377 if ($areaPort !== null && $areaPort !== $port) { 378 continue; 379 } 380 381 if (self::isHostInNoProxy($host, [$area])) { 382 return true; 383 } 384 } 385 386 return false; 387 } 388 263 389 private static function normalizeNoProxyHost(string $host, bool $stripPort): string 264 390 { … … 291 417 292 418 /** 419 * @return array{0: string, 1: int|null} 420 */ 421 private static function splitNoProxyHostAndPort(string $area): array 422 { 423 if ($area !== '' && $area[0] === '[') { 424 $closingBracket = \strpos($area, ']'); 425 426 if ($closingBracket !== false) { 427 $tail = \substr($area, $closingBracket + 1); 428 if ($tail !== '' && $tail[0] === ':') { 429 $port = self::parseNoProxyPort(\substr($tail, 1)); 430 431 if ($port !== null) { 432 return [\substr($area, 0, $closingBracket + 1), $port]; 433 } 434 } 435 } 436 437 return [$area, null]; 438 } 439 440 if (\filter_var($area, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6)) { 441 return [$area, null]; 442 } 443 444 $colon = \strrpos($area, ':'); 445 if ($colon === false) { 446 return [$area, null]; 447 } 448 449 $port = self::parseNoProxyPort(\substr($area, $colon + 1)); 450 if ($port === null) { 451 return [$area, null]; 452 } 453 454 return [\substr($area, 0, $colon), $port]; 455 } 456 457 private static function parseNoProxyPort(string $port): ?int 458 { 459 if ($port === '' || !\ctype_digit($port)) { 460 return null; 461 } 462 463 $port = (int) $port; 464 465 return $port <= 65535 ? $port : null; 466 } 467 468 private static function getDefaultPort(string $scheme): ?int 469 { 470 if ($scheme === 'http') { 471 return 80; 472 } 473 474 if ($scheme === 'https') { 475 return 443; 476 } 477 478 return null; 479 } 480 481 /** 293 482 * Wrapper for json_decode that throws when an error occurs. 294 483 * … … 352 541 { 353 542 return (float) \function_exists('hrtime') ? \hrtime(true) / 1e9 : \microtime(true); 543 } 544 545 /** 546 * @param mixed $value 547 * 548 * @internal 549 */ 550 public static function normalizeIdnConversionOption($value): ?int 551 { 552 if ($value === null || $value === false) { 553 return null; 554 } 555 556 if ($value === true) { 557 return \IDNA_DEFAULT; 558 } 559 560 if (\is_int($value)) { 561 return $value; 562 } 563 564 if ((\is_string($value) && \is_numeric($value)) || (\is_float($value) && \is_finite($value))) { 565 \trigger_deprecation( 566 'guzzlehttp/guzzle', 567 '7.11', 568 'Passing %s as the "idn_conversion" request option is deprecated; guzzlehttp/guzzle 8.0 will reject values that are not true, false, null, or an integer IDNA_* bitmask.', 569 self::describeType($value) 570 ); 571 572 return (int) $value; 573 } 574 575 throw new InvalidArgumentException('idn_conversion must be true, false, null, or an integer IDNA_* bitmask'); 354 576 } 355 577 -
sg-ai-studio/trunk/vendor/guzzlehttp/promises/CHANGELOG.md
r3561022 r3562098 1 1 # CHANGELOG 2 3 4 ## 2.5.0 - 2026-06-02 5 6 ### Deprecated 7 8 - Deprecated passing non-iterable inputs to promise collection helpers and `EachPromise` 2 9 3 10 -
sg-ai-studio/trunk/vendor/guzzlehttp/promises/README.md
r3561022 r3562098 54 54 ### Callbacks 55 55 56 Callbacks are registered with the `then` method by providing an optional 56 Callbacks are registered with the `then` method by providing an optional 57 57 `$onFulfilled` followed by an optional `$onRejected` function. 58 58 … … 228 228 ``` 229 229 230 If a n exceptionis encountered while invoking the wait function of a promise,231 the promise is rejected with the exception and the exceptionis thrown.230 If a throwable is encountered while invoking the wait function of a promise, 231 the promise is rejected with the throwable and the throwable is thrown. 232 232 233 233 ```php … … 248 248 ``` 249 249 250 Calling `wait` on a promise that has been rejected will throw an exception. If251 the rejection reason is an instance of `\Exception` the reason is thrown.250 Calling `wait` on a promise that has been rejected will throw. If the rejection 251 reason is an instance of `\Throwable` the reason is thrown. 252 252 Otherwise, a `GuzzleHttp\Promise\RejectionException` is thrown and the reason 253 253 can be obtained by calling the `getReason` method of the exception. … … 324 324 A promise has the following methods: 325 325 326 - `then(callable $onFulfilled, callable $onRejected) : PromiseInterface` 327 328 Appends fulfillment and rejection handlers to the promise, and returns a new promise resolving to the return value of the called handler. 326 - `then(?callable $onFulfilled = null, ?callable $onRejected = null) : PromiseInterface` 327 328 Appends fulfillment and rejection handlers to the promise, and returns a new 329 promise resolving to the return value of the called handler. If a handler is 330 omitted, the original fulfillment value or rejection reason is forwarded. 329 331 330 332 - `otherwise(callable $onRejected) : PromiseInterface` -
sg-ai-studio/trunk/vendor/guzzlehttp/promises/src/Create.php
r3505951 r3562098 75 75 } 76 76 77 if (!is_iterable($value)) { 78 \trigger_deprecation( 79 'guzzlehttp/promises', 80 '2.5', 81 'Passing a non-iterable to %s::%s() is deprecated; guzzlehttp/promises 3.0 will require an iterable.', 82 __CLASS__, 83 __FUNCTION__ 84 ); 85 } 86 77 87 return new \ArrayIterator([$value]); 78 88 } -
sg-ai-studio/trunk/vendor/guzzlehttp/promises/src/Each.php
r3505951 r3562098 27 27 ?callable $onRejected = null 28 28 ): PromiseInterface { 29 $iterable = self::prepareIterable($iterable, __FUNCTION__); 30 29 31 return (new EachPromise($iterable, [ 30 32 'fulfilled' => $onFulfilled, … … 50 52 ?callable $onRejected = null 51 53 ): PromiseInterface { 54 $iterable = self::prepareIterable($iterable, __FUNCTION__); 55 52 56 return (new EachPromise($iterable, [ 53 57 'fulfilled' => $onFulfilled, … … 70 74 ?callable $onFulfilled = null 71 75 ): PromiseInterface { 76 $iterable = self::prepareIterable($iterable, __FUNCTION__); 77 72 78 return self::ofLimit( 73 79 $iterable, … … 79 85 ); 80 86 } 87 88 private static function prepareIterable($iterable, string $method): iterable 89 { 90 if (is_iterable($iterable)) { 91 return $iterable; 92 } 93 94 \trigger_deprecation( 95 'guzzlehttp/promises', 96 '2.5', 97 'Passing a non-iterable to %s::%s() is deprecated; guzzlehttp/promises 3.0 will require an iterable.', 98 self::class, 99 $method 100 ); 101 102 return [$iterable]; 103 } 81 104 } -
sg-ai-studio/trunk/vendor/guzzlehttp/promises/src/EachPromise.php
r3561022 r3562098 58 58 public function __construct($iterable, array $config = []) 59 59 { 60 if (!is_iterable($iterable)) { 61 \trigger_deprecation( 62 'guzzlehttp/promises', 63 '2.5', 64 'Passing a non-iterable to %s::%s() is deprecated; guzzlehttp/promises 3.0 will require an iterable.', 65 __CLASS__, 66 __FUNCTION__ 67 ); 68 69 $iterable = [$iterable]; 70 } 71 60 72 $this->iterable = Create::iterFor($iterable); 61 73 -
sg-ai-studio/trunk/vendor/guzzlehttp/promises/src/Utils.php
r3561022 r3562098 102 102 public static function inspectAll($promises): array 103 103 { 104 $promises = self::prepareIterable($promises, __FUNCTION__); 105 104 106 $results = []; 105 107 foreach ($promises as $key => $promise) { … … 123 125 public static function unwrap($promises): array 124 126 { 127 $promises = self::prepareIterable($promises, __FUNCTION__); 128 125 129 $results = []; 126 130 foreach ($promises as $key => $promise) { … … 144 148 public static function all($promises, bool $recursive = false): PromiseInterface 145 149 { 150 $promises = self::prepareIterable($promises, __FUNCTION__); 151 146 152 $results = []; 147 153 $promise = Each::of( … … 192 198 public static function some(int $count, $promises): PromiseInterface 193 199 { 200 $promises = self::prepareIterable($promises, __FUNCTION__); 201 194 202 $results = []; 195 203 $rejections = []; … … 232 240 public static function any($promises): PromiseInterface 233 241 { 242 $promises = self::prepareIterable($promises, __FUNCTION__); 243 234 244 return self::some(1, $promises)->then(function ($values) { 235 245 return $values[0]; … … 249 259 public static function settle($promises): PromiseInterface 250 260 { 261 $promises = self::prepareIterable($promises, __FUNCTION__); 262 251 263 $results = []; 252 264 … … 265 277 }); 266 278 } 279 280 private static function prepareIterable($promises, string $method): iterable 281 { 282 if (is_iterable($promises)) { 283 return $promises; 284 } 285 286 self::triggerNonIterableDeprecation($promises, $method); 287 288 return [$promises]; 289 } 290 291 private static function triggerNonIterableDeprecation($promises, string $method): void 292 { 293 if (is_iterable($promises)) { 294 return; 295 } 296 297 \trigger_deprecation( 298 'guzzlehttp/promises', 299 '2.5', 300 'Passing a non-iterable to %s::%s() is deprecated; guzzlehttp/promises 3.0 will require an iterable.', 301 self::class, 302 $method 303 ); 304 } 267 305 } -
sg-ai-studio/trunk/vendor/guzzlehttp/psr7/CHANGELOG.md
r3561022 r3562098 5 5 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) 6 6 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 7 8 ## 2.11.0 - 2026-06-02 9 10 ### Changed 11 12 - Changed `Utils::modifyRequest()` to reject conflicting URI and `Host` header changes in the same call 13 - Changed `Header::parse()` to split semicolon-separated parameters without repeated regular expression lookaheads 14 - Changed `UriComparator::isCrossOrigin()` so only HTTP and HTTPS missing ports receive implicit default ports 15 16 ### Deprecated 17 18 - Deprecated invalid PSR-7 arguments that guzzlehttp/psr7 3.0 will require native types for 19 - Deprecated non-string header values that guzzlehttp/psr7 3.0 will reject 20 - Deprecated empty header value arrays that guzzlehttp/psr7 3.0 will reject 21 - Deprecated URI schemes that do not match guzzlehttp/psr7 3.0 syntax requirements 22 - Deprecated multipart boundary and custom part header metadata that guzzlehttp/psr7 3.0 will reject 23 - Deprecated reliance on automatic uppercasing of request methods; guzzlehttp/psr7 3.0 preserves method casing 24 - Deprecated invalid `Utils::modifyRequest()` change values that guzzlehttp/psr7 3.0 will reject 25 26 ### Fixed 27 28 - Fixed `Utils::copyToStream()` to retry short destination writes instead of dropping the unwritten remainder 29 - Fixed `Header::parse()` splitting of semicolon-separated parameters with escaped quotes 7 30 8 31 ## 2.10.4 - 2026-05-29 -
sg-ai-studio/trunk/vendor/guzzlehttp/psr7/README.md
r3561022 r3562098 120 120 `GuzzleHttp\Psr7\FnStream` 121 121 122 Compose stream implementations based on a hash of functions.122 Compose stream implementations based on a hash of callables. 123 123 124 124 Allows for easy testing and extension of a provided stream without needing … … 203 203 multipart/form-data stream. 204 204 205 Each multipart element must contain a `name` and `contents` key. `contents` may 206 be any non-array value accepted by `GuzzleHttp\Psr7\Utils::streamFor()`, 207 including closures and invokable objects. Array contents are recursively 208 expanded into nested form fields. 209 205 210 206 211 ## NoSeekStream … … 232 237 Provides a read only stream that pumps data from a PHP callable. 233 238 234 When invoking the provided callable, the PumpStream will pass the amount of235 data requestedto read to the callable. The callable can choose to ignore239 When invoking the provided callable, the PumpStream will pass the suggested 240 number of bytes to read to the callable. The callable can choose to ignore 236 241 this value and return fewer or more bytes than requested. Any extra data 237 242 returned by the provided callable is buffered internally until drained using 238 243 the read() function of the PumpStream. The provided callable MUST return 239 false when there is no more data to read. 244 false or null when there is no more data to read. 245 246 Userland callables that declare no parameters are tolerated by PHP, but 247 length-aware callables remain the recommended formal shape. 240 248 241 249 … … 462 470 of bytes have been read. 463 471 472 The copy stops if the destination `write()` returns 0, for example a 473 `BufferStream` at its high water mark or a full `DroppingStream`. For a 474 guaranteed full copy, use a normal writable stream such as a file or 475 `php://temp` stream. 476 464 477 465 478 ## `GuzzleHttp\Psr7\Utils::copyToString` … … 493 506 - set_headers: (array) Sets the given headers. 494 507 - remove_headers: (array) Remove the given headers. 495 - body: (mixed) Sets the given body. 508 - body: (mixed) Sets the given body. Present non-null values are converted with 509 `GuzzleHttp\Psr7\Utils::streamFor()`, including scalar values, resources, 510 streams, iterators, callable arrays, closures, invokable objects, and 511 objects with `__toString()`. String inputs remain literal bodies. 496 512 - uri: (UriInterface) Set the URI. 497 513 - query: (string) Set the query string value of the URI. … … 539 555 uses the string value. 540 556 - `NULL`: When `null` is passed, an empty stream object is returned. 541 - `callable` When a callable is passed, a read-only stream object will be 557 - `callable`: When a callable array, closure, or invokable object is passed and 558 no earlier resource or object rule applies, a read-only stream object will be 542 559 created that invokes the given callable. The callable is invoked with the 543 number of suggested bytes to read. The callable can return any number of544 bytes, but MUST return `false` when there is no more data to return. The545 stream object that wraps the callable will invoke the callable until the546 number of requested bytes are available. Any additional bytes will be547 buffered and used in subsequent reads.560 suggested number of bytes to read. The callable can return fewer or more bytes 561 than requested, but MUST return `false` or `null` when there is no more data 562 to return. Any additional bytes will be buffered and used in subsequent reads. 563 String inputs are always treated as string bodies, even when they name 564 callable functions. 548 565 549 566 ```php … … 718 735 Determines if a modified URL should be considered cross-origin with respect to an original URL. 719 736 737 Two URLs are cross-origin when their scheme, host, or effective port differ. Host comparison is case-insensitive, and missing ports use the default port for `http` or `https`. Other schemes do not receive implicit default ports. 738 739 This helper only compares URI origins. It does not implement redirect handling or credential policy. 740 720 741 ## Reference Resolution 721 742 -
sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/AppendStream.php
r3561022 r3562098 156 156 public function seek($offset, $whence = SEEK_SET): void 157 157 { 158 if (!\is_int($offset)) { 159 \trigger_deprecation( 160 'guzzlehttp/psr7', 161 '2.11', 162 'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $offset.', 163 \get_debug_type($offset) 164 ); 165 } 166 167 if (!\is_int($whence)) { 168 \trigger_deprecation( 169 'guzzlehttp/psr7', 170 '2.11', 171 'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $whence.', 172 \get_debug_type($whence) 173 ); 174 } 175 158 176 if (!$this->seekable) { 159 177 throw new \RuntimeException('This AppendStream is not seekable'); … … 188 206 public function read($length): string 189 207 { 208 if (!\is_int($length)) { 209 \trigger_deprecation( 210 'guzzlehttp/psr7', 211 '2.11', 212 'Passing %s to StreamInterface::read() is deprecated; guzzlehttp/psr7 3.0 requires int for $length.', 213 \get_debug_type($length) 214 ); 215 } 216 190 217 if ($this->streams === []) { 191 218 return ''; … … 240 267 public function write($string): int 241 268 { 269 if (!\is_string($string)) { 270 \trigger_deprecation( 271 'guzzlehttp/psr7', 272 '2.11', 273 'Passing %s to StreamInterface::write() is deprecated; guzzlehttp/psr7 3.0 requires string for $string.', 274 \get_debug_type($string) 275 ); 276 } 277 242 278 throw new \RuntimeException('Cannot write to an AppendStream'); 243 279 } … … 248 284 public function getMetadata($key = null) 249 285 { 286 if ($key !== null && !\is_string($key)) { 287 \trigger_deprecation( 288 'guzzlehttp/psr7', 289 '2.11', 290 'Passing %s to StreamInterface::getMetadata() is deprecated; guzzlehttp/psr7 3.0 requires string|null for $key.', 291 \get_debug_type($key) 292 ); 293 } 294 250 295 return $key ? null : []; 251 296 } -
sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/BufferStream.php
r3505951 r3562098 87 87 public function seek($offset, $whence = SEEK_SET): void 88 88 { 89 if (!\is_int($offset)) { 90 \trigger_deprecation( 91 'guzzlehttp/psr7', 92 '2.11', 93 'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $offset.', 94 \get_debug_type($offset) 95 ); 96 } 97 98 if (!\is_int($whence)) { 99 \trigger_deprecation( 100 'guzzlehttp/psr7', 101 '2.11', 102 'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $whence.', 103 \get_debug_type($whence) 104 ); 105 } 106 89 107 throw new \RuntimeException('Cannot seek a BufferStream'); 90 108 } … … 105 123 public function read($length): string 106 124 { 125 if (!\is_int($length)) { 126 \trigger_deprecation( 127 'guzzlehttp/psr7', 128 '2.11', 129 'Passing %s to StreamInterface::read() is deprecated; guzzlehttp/psr7 3.0 requires int for $length.', 130 \get_debug_type($length) 131 ); 132 } 133 107 134 $currentLength = strlen($this->buffer); 108 135 … … 125 152 public function write($string): int 126 153 { 154 if (!\is_string($string)) { 155 \trigger_deprecation( 156 'guzzlehttp/psr7', 157 '2.11', 158 'Passing %s to StreamInterface::write() is deprecated; guzzlehttp/psr7 3.0 requires string for $string.', 159 \get_debug_type($string) 160 ); 161 } 162 127 163 $this->buffer .= $string; 128 164 … … 139 175 public function getMetadata($key = null) 140 176 { 177 if ($key !== null && !\is_string($key)) { 178 \trigger_deprecation( 179 'guzzlehttp/psr7', 180 '2.11', 181 'Passing %s to StreamInterface::getMetadata() is deprecated; guzzlehttp/psr7 3.0 requires string|null for $key.', 182 \get_debug_type($key) 183 ); 184 } 185 141 186 if ($key === 'hwm') { 142 187 return $this->hwm; -
sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/CachingStream.php
r3561022 r3562098 65 65 public function seek($offset, $whence = SEEK_SET): void 66 66 { 67 if (!\is_int($offset)) { 68 \trigger_deprecation( 69 'guzzlehttp/psr7', 70 '2.11', 71 'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $offset.', 72 \get_debug_type($offset) 73 ); 74 } 75 76 if (!\is_int($whence)) { 77 \trigger_deprecation( 78 'guzzlehttp/psr7', 79 '2.11', 80 'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $whence.', 81 \get_debug_type($whence) 82 ); 83 } 84 67 85 if ($whence === SEEK_SET) { 68 86 $byte = $offset; … … 104 122 public function read($length): string 105 123 { 124 if (!\is_int($length)) { 125 \trigger_deprecation( 126 'guzzlehttp/psr7', 127 '2.11', 128 'Passing %s to StreamInterface::read() is deprecated; guzzlehttp/psr7 3.0 requires int for $length.', 129 \get_debug_type($length) 130 ); 131 } 132 106 133 // Perform a regular read on any previously read data from the buffer 107 134 $data = $this->stream->read($length); … … 137 164 public function write($string): int 138 165 { 166 if (!\is_string($string)) { 167 \trigger_deprecation( 168 'guzzlehttp/psr7', 169 '2.11', 170 'Passing %s to StreamInterface::write() is deprecated; guzzlehttp/psr7 3.0 requires string for $string.', 171 \get_debug_type($string) 172 ); 173 } 174 139 175 // When appending to the end of the currently read stream, you'll want 140 176 // to skip bytes from being read from the remote stream to emulate -
sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/DroppingStream.php
r3505951 r3562098 33 33 public function write($string): int 34 34 { 35 if (!\is_string($string)) { 36 \trigger_deprecation( 37 'guzzlehttp/psr7', 38 '2.11', 39 'Passing %s to StreamInterface::write() is deprecated; guzzlehttp/psr7 3.0 requires string for $string.', 40 \get_debug_type($string) 41 ); 42 } 43 35 44 $diff = $this->maxLength - $this->stream->getSize(); 36 45 -
sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/FnStream.php
r3505951 r3562098 8 8 9 9 /** 10 * Compose stream implementations based on a hash of functions.10 * Compose stream implementations based on a hash of callables. 11 11 * 12 12 * Allows for easy testing and extension of a provided stream without needing … … 32 32 $this->methods = $methods; 33 33 34 // Create the functions on the class34 // Create the callables on the class 35 35 foreach ($methods as $name => $fn) { 36 36 $this->{'_fn_'.$name} = $fn; … … 74 74 * 75 75 * @param StreamInterface $stream Stream to decorate 76 * @param array<string, callable> $methods Hash of method name to a c losure76 * @param array<string, callable> $methods Hash of method name to a callable 77 77 * 78 78 * @return FnStream … … 143 143 public function seek($offset, $whence = SEEK_SET): void 144 144 { 145 if (!\is_int($offset)) { 146 \trigger_deprecation( 147 'guzzlehttp/psr7', 148 '2.11', 149 'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $offset.', 150 \get_debug_type($offset) 151 ); 152 } 153 154 if (!\is_int($whence)) { 155 \trigger_deprecation( 156 'guzzlehttp/psr7', 157 '2.11', 158 'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $whence.', 159 \get_debug_type($whence) 160 ); 161 } 162 145 163 ($this->_fn_seek)($offset, $whence); 146 164 } … … 153 171 public function write($string): int 154 172 { 173 if (!\is_string($string)) { 174 \trigger_deprecation( 175 'guzzlehttp/psr7', 176 '2.11', 177 'Passing %s to StreamInterface::write() is deprecated; guzzlehttp/psr7 3.0 requires string for $string.', 178 \get_debug_type($string) 179 ); 180 } 181 155 182 return ($this->_fn_write)($string); 156 183 } … … 163 190 public function read($length): string 164 191 { 192 if (!\is_int($length)) { 193 \trigger_deprecation( 194 'guzzlehttp/psr7', 195 '2.11', 196 'Passing %s to StreamInterface::read() is deprecated; guzzlehttp/psr7 3.0 requires int for $length.', 197 \get_debug_type($length) 198 ); 199 } 200 165 201 return ($this->_fn_read)($length); 166 202 } … … 176 212 public function getMetadata($key = null) 177 213 { 214 if ($key !== null && !\is_string($key)) { 215 \trigger_deprecation( 216 'guzzlehttp/psr7', 217 '2.11', 218 'Passing %s to StreamInterface::getMetadata() is deprecated; guzzlehttp/psr7 3.0 requires string|null for $key.', 219 \get_debug_type($key) 220 ); 221 } 222 178 223 return ($this->_fn_getMetadata)($key); 179 224 } -
sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/Header.php
r3505951 r3562098 23 23 foreach (self::splitList($value) as $val) { 24 24 $part = []; 25 foreach ( preg_split('/;(?=([^"]*"[^"]*")*[^"]*$)/', $val) ?: []as $kvp) {25 foreach (self::splitParameters($val) as $kvp) { 26 26 if (preg_match_all('/<[^>]+>|[^=]+/', $kvp, $matches)) { 27 27 $m = $matches[0]; … … 40 40 41 41 return $params; 42 } 43 44 /** 45 * Split a header value into semicolon-separated parameters. 46 * 47 * @return string[] 48 */ 49 private static function splitParameters(string $value): array 50 { 51 $values = []; 52 $start = 0; 53 $isQuoted = false; 54 $isEscaped = false; 55 56 for ($i = 0, $max = \strlen($value); $i < $max; ++$i) { 57 $char = $value[$i]; 58 59 if ($isEscaped) { 60 $isEscaped = false; 61 62 continue; 63 } 64 65 if ($isQuoted && $char === '\\') { 66 $isEscaped = true; 67 68 continue; 69 } 70 71 if ($char === '"') { 72 $isQuoted = !$isQuoted; 73 74 continue; 75 } 76 77 if (!$isQuoted && $char === ';') { 78 $values[] = \substr($value, $start, $i - $start); 79 $start = $i + 1; 80 } 81 } 82 83 $values[] = \substr($value, $start); 84 85 return $values; 42 86 } 43 87 -
sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/LimitStream.php
r3561022 r3562098 78 78 public function seek($offset, $whence = SEEK_SET): void 79 79 { 80 if (!\is_int($offset)) { 81 \trigger_deprecation( 82 'guzzlehttp/psr7', 83 '2.11', 84 'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $offset.', 85 \get_debug_type($offset) 86 ); 87 } 88 89 if (!\is_int($whence)) { 90 \trigger_deprecation( 91 'guzzlehttp/psr7', 92 '2.11', 93 'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $whence.', 94 \get_debug_type($whence) 95 ); 96 } 97 80 98 if ($whence !== SEEK_SET || $offset < 0) { 81 99 throw new \RuntimeException(sprintf( … … 144 162 public function read($length): string 145 163 { 164 if (!\is_int($length)) { 165 \trigger_deprecation( 166 'guzzlehttp/psr7', 167 '2.11', 168 'Passing %s to StreamInterface::read() is deprecated; guzzlehttp/psr7 3.0 requires int for $length.', 169 \get_debug_type($length) 170 ); 171 } 172 146 173 if ($this->limit === -1) { 147 174 return $this->stream->read($length); -
sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/MessageTrait.php
r3538917 r3562098 35 35 public function withProtocolVersion($version): MessageInterface 36 36 { 37 if (!\is_string($version)) { 38 \trigger_deprecation( 39 'guzzlehttp/psr7', 40 '2.11', 41 'Passing %s to MessageInterface::withProtocolVersion() is deprecated; guzzlehttp/psr7 3.0 requires string.', 42 \get_debug_type($version) 43 ); 44 } 45 37 46 if ($this->protocol === $version) { 38 47 return $this; … … 79 88 { 80 89 $this->assertHeader($header); 90 $values = \is_array($value) ? $value : [$value]; 91 foreach ($values as $item) { 92 if (!\is_string($item) && (\is_scalar($item) || $item === null)) { 93 \trigger_deprecation( 94 'guzzlehttp/psr7', 95 '2.11', 96 'Passing %s to MessageInterface::withHeader() is deprecated; guzzlehttp/psr7 3.0 requires string|string[].', 97 \get_debug_type($item) 98 ); 99 100 break; 101 } 102 } 81 103 $value = $this->normalizeHeaderValue($value); 82 104 $normalized = strtolower($header); … … 98 120 { 99 121 $this->assertHeader($header); 122 $values = \is_array($value) ? $value : [$value]; 123 foreach ($values as $item) { 124 if (!\is_string($item) && (\is_scalar($item) || $item === null)) { 125 \trigger_deprecation( 126 'guzzlehttp/psr7', 127 '2.11', 128 'Passing %s to MessageInterface::withAddedHeader() is deprecated; guzzlehttp/psr7 3.0 requires string|string[].', 129 \get_debug_type($item) 130 ); 131 132 break; 133 } 134 } 100 135 $value = $this->normalizeHeaderValue($value); 101 136 $normalized = strtolower($header); … … 167 202 168 203 $this->assertHeader($header); 204 $values = \is_array($value) ? $value : [$value]; 205 foreach ($values as $item) { 206 if (!\is_string($item) && (\is_scalar($item) || $item === null)) { 207 \trigger_deprecation( 208 'guzzlehttp/psr7', 209 '2.11', 210 'Passing %s to %s::__construct() is deprecated; guzzlehttp/psr7 3.0 requires string|string[].', 211 \get_debug_type($item), 212 static::class 213 ); 214 215 break; 216 } 217 } 169 218 $value = $this->normalizeHeaderValue($value); 170 219 $normalized = strtolower($header); … … 186 235 private function normalizeHeaderValue($value): array 187 236 { 237 if (is_array($value) && $value === []) { 238 \trigger_deprecation( 239 'guzzlehttp/psr7', 240 '2.11', 241 'Passing an empty array as a header value is deprecated; guzzlehttp/psr7 3.0 rejects empty header value arrays.' 242 ); 243 } 244 188 245 if (!is_array($value)) { 189 246 return $this->trimAndValidateHeaderValues([$value]); -
sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/MultipartStream.php
r3538917 r3562098 21 21 private $stream; 22 22 23 /** 24 * @param array $elements Array of associative arrays, each containing a 25 * required "name" key mapping to the form field, 26 * name, a required "contents" key mapping to any 27 * value accepted by Utils::streamFor() (scalar, 28 * null, resource, StreamInterface, Iterator, or 29 * callable), or an array for nested expansion. 30 * Optional keys include "headers" (associative 31 * array of custom headers) and "filename" (string 32 * to send as the filename in the part). 33 * When "contents" is an array, it is recursively 34 * expanded into multiple fields using bracket notation 35 * (e.g., name[0][key]). Empty arrays produce no fields. 36 * The "filename" and "headers" options cannot be used 37 * with array contents. 38 * @param string $boundary You can optionally provide a specific boundary 23 private const BOUNDARY_CHARS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'()+_,-./:=? "; 24 25 /** 26 * @param array $elements Array of associative arrays, each containing a 27 * required "name" key mapping to the form field, 28 * name, a required "contents" key mapping to any 29 * non-array value accepted by Utils::streamFor(), 30 * or an array for nested expansion. 31 * Optional keys include "headers" (associative 32 * array of custom headers) and "filename" (string 33 * to send as the filename in the part). 34 * When "contents" is an array, it is recursively 35 * expanded into multiple fields using bracket notation 36 * (e.g., name[0][key]). Empty arrays produce no fields. 37 * The "filename" and "headers" options cannot be used 38 * with array contents. 39 * @param string|null $boundary You can optionally provide a specific boundary 39 40 * 40 41 * @throws \InvalidArgumentException … … 42 43 public function __construct(array $elements = [], ?string $boundary = null) 43 44 { 45 if ($boundary !== null && !self::isValidBoundary($boundary)) { 46 \trigger_deprecation( 47 'guzzlehttp/psr7', 48 '2.11', 49 'Passing an invalid multipart boundary to MultipartStream::__construct() is deprecated; guzzlehttp/psr7 3.0 rejects invalid multipart boundaries.' 50 ); 51 } 52 44 53 $this->boundary = $boundary ?: bin2hex(random_bytes(20)); 45 54 $this->stream = $this->createStream($elements); … … 59 68 * Get the headers needed before transferring the content of a POST file 60 69 * 61 * @param string[]$headers70 * @param array<array-key, string> $headers 62 71 */ 63 72 private function getHeaders(array $headers): string … … 65 74 $str = ''; 66 75 foreach ($headers as $key => $value) { 76 $key = (string) $key; 67 77 $str .= "{$key}: {$value}\r\n"; 68 78 } … … 155 165 156 166 /** 157 * @param string[]$headers158 * 159 * @return array{0: StreamInterface, 1: string[]}167 * @param array<array-key, mixed> $headers 168 * 169 * @return array{0: StreamInterface, 1: array<array-key, string>} 160 170 */ 161 171 private function createElement(string $name, StreamInterface $stream, ?string $filename, array $headers): array 162 172 { 173 $headers = self::normalizePartHeaders($headers); 174 163 175 // Set a default content-disposition header if one was no provided 164 176 $disposition = self::getHeader($headers, 'content-disposition'); … … 191 203 192 204 /** 193 * @param string[]$headers205 * @param array<array-key, string> $headers 194 206 */ 195 207 private static function getHeader(array $headers, string $key): ?string … … 204 216 return null; 205 217 } 218 219 private static function isValidBoundary(string $boundary): bool 220 { 221 $length = strlen($boundary); 222 223 if ($length < 1 || $length > 70 || $boundary[$length - 1] === ' ') { 224 return false; 225 } 226 227 return strspn($boundary, self::BOUNDARY_CHARS) === $length; 228 } 229 230 /** 231 * @param array<array-key, mixed> $headers 232 * 233 * @return array<array-key, string> 234 */ 235 private static function normalizePartHeaders(array $headers): array 236 { 237 $normalized = []; 238 239 foreach ($headers as $key => $value) { 240 self::deprecateInvalidPartHeaderName((string) $key); 241 242 if (!is_string($value)) { 243 if (!is_scalar($value) && $value !== null && !(is_object($value) && method_exists($value, '__toString'))) { 244 throw new \InvalidArgumentException(sprintf( 245 'Multipart part header value must be a string or stringable value but %s provided.', 246 \get_debug_type($value) 247 )); 248 } 249 250 \trigger_deprecation( 251 'guzzlehttp/psr7', 252 '2.11', 253 'Passing %s as a multipart part header value is deprecated; guzzlehttp/psr7 3.0 requires string multipart part header values.', 254 \get_debug_type($value) 255 ); 256 } 257 258 $value = (string) $value; 259 260 self::deprecateInvalidPartHeaderValue($value); 261 262 $normalized[$key] = $value; 263 } 264 265 return $normalized; 266 } 267 268 private static function deprecateInvalidPartHeaderName(string $name): void 269 { 270 if (!preg_match('/^[a-zA-Z0-9\'`#$%&*+.^_|~!-]+$/D', $name)) { 271 \trigger_deprecation( 272 'guzzlehttp/psr7', 273 '2.11', 274 'Passing an invalid multipart part header name to MultipartStream is deprecated; guzzlehttp/psr7 3.0 rejects invalid multipart part header names.' 275 ); 276 } 277 } 278 279 private static function deprecateInvalidPartHeaderValue(string $value): void 280 { 281 if (!preg_match('/^[\x20\x09\x21-\x7E\x80-\xFF]*$/D', $value)) { 282 \trigger_deprecation( 283 'guzzlehttp/psr7', 284 '2.11', 285 'Passing an invalid multipart part header value to MultipartStream is deprecated; guzzlehttp/psr7 3.0 rejects invalid multipart part header values.' 286 ); 287 } 288 } 206 289 } -
sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/NoSeekStream.php
r3505951 r3562098 19 19 public function seek($offset, $whence = SEEK_SET): void 20 20 { 21 if (!\is_int($offset)) { 22 \trigger_deprecation( 23 'guzzlehttp/psr7', 24 '2.11', 25 'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $offset.', 26 \get_debug_type($offset) 27 ); 28 } 29 30 if (!\is_int($whence)) { 31 \trigger_deprecation( 32 'guzzlehttp/psr7', 33 '2.11', 34 'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $whence.', 35 \get_debug_type($whence) 36 ); 37 } 38 21 39 throw new \RuntimeException('Cannot seek a NoSeekStream'); 22 40 } -
sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/PumpStream.php
r3505951 r3562098 10 10 * Provides a read only stream that pumps data from a PHP callable. 11 11 * 12 * When invoking the provided callable, the PumpStream will pass the amount of13 * data requestedto read to the callable. The callable can choose to ignore12 * When invoking the provided callable, the PumpStream will pass the suggested 13 * number of bytes to read to the callable. The callable can choose to ignore 14 14 * this value and return fewer or more bytes than requested. Any extra data 15 * returned by the provided callable is buffered internally until drained using 16 * the read() function of the PumpStream. The provided callable MUST return 17 * false when there is no more data to read. 15 * returned by the callable is buffered internally until drained using the 16 * read() function of the PumpStream. The callable MUST return false or null 17 * when there is no more data to read. 18 * 19 * Userland callables that declare no parameters are tolerated by PHP, but 20 * length-aware callables remain the recommended formal shape. 18 21 */ 19 22 final class PumpStream implements StreamInterface 20 23 { 21 /** @var callable (int): (string|false|null)|null */24 /** @var callable|null */ 22 25 private $source; 23 26 … … 35 38 36 39 /** 37 * @param callable(int): (string|false|null) $source Source of the stream data. The callable MAY 38 * accept an integer argument used to control the 39 * amount of data to return. The callable MUST 40 * return a string when called, or false|null on error 41 * or EOF. 42 * @param array{size?: int, metadata?: array} $options Stream options: 43 * - metadata: Hash of metadata to use with stream. 44 * - size: Size of the stream, if known. 40 * @param (callable(): (string|false|null))|(callable(int): (string|false|null)) $source Source of the stream data. The callable receives 41 * the suggested number of bytes to read, may ignore 42 * that value, and may return fewer or more bytes. 43 * Extra bytes are buffered. The callable MUST return 44 * a string when called, or false|null on error or EOF. 45 * Userland callables that declare no parameters are 46 * tolerated by PHP, but length-aware callables remain 47 * the recommended formal shape. 48 * @param array{size?: int, metadata?: array} $options Stream options: 49 * - metadata: Hash of metadata to use with stream. 50 * - size: Size of the stream, if known. 45 51 */ 46 52 public function __construct(callable $source, array $options = []) … … 106 112 public function seek($offset, $whence = SEEK_SET): void 107 113 { 114 if (!\is_int($offset)) { 115 \trigger_deprecation( 116 'guzzlehttp/psr7', 117 '2.11', 118 'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $offset.', 119 \get_debug_type($offset) 120 ); 121 } 122 123 if (!\is_int($whence)) { 124 \trigger_deprecation( 125 'guzzlehttp/psr7', 126 '2.11', 127 'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $whence.', 128 \get_debug_type($whence) 129 ); 130 } 131 108 132 throw new \RuntimeException('Cannot seek a PumpStream'); 109 133 } … … 116 140 public function write($string): int 117 141 { 142 if (!\is_string($string)) { 143 \trigger_deprecation( 144 'guzzlehttp/psr7', 145 '2.11', 146 'Passing %s to StreamInterface::write() is deprecated; guzzlehttp/psr7 3.0 requires string for $string.', 147 \get_debug_type($string) 148 ); 149 } 150 118 151 throw new \RuntimeException('Cannot write to a PumpStream'); 119 152 } … … 126 159 public function read($length): string 127 160 { 161 if (!\is_int($length)) { 162 \trigger_deprecation( 163 'guzzlehttp/psr7', 164 '2.11', 165 'Passing %s to StreamInterface::read() is deprecated; guzzlehttp/psr7 3.0 requires int for $length.', 166 \get_debug_type($length) 167 ); 168 } 169 128 170 $data = $this->buffer->read($length); 129 171 $readLen = strlen($data); … … 155 197 public function getMetadata($key = null) 156 198 { 199 if ($key !== null && !\is_string($key)) { 200 \trigger_deprecation( 201 'guzzlehttp/psr7', 202 '2.11', 203 'Passing %s to StreamInterface::getMetadata() is deprecated; guzzlehttp/psr7 3.0 requires string|null for $key.', 204 \get_debug_type($key) 205 ); 206 } 207 157 208 if (!$key) { 158 209 return $this->metadata; -
sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/Request.php
r3561022 r3562098 45 45 } 46 46 47 self::warnOnMethodCasingChange($method); 47 48 $this->method = strtoupper($method); 48 49 $this->uri = $uri; … … 98 99 { 99 100 $this->assertMethod($method); 101 self::warnOnMethodCasingChange($method); 100 102 $new = clone $this; 101 103 $new->method = strtoupper($method); … … 111 113 public function withUri(UriInterface $uri, $preserveHost = false): RequestInterface 112 114 { 115 if (!\is_bool($preserveHost)) { 116 \trigger_deprecation( 117 'guzzlehttp/psr7', 118 '2.11', 119 'Passing %s to RequestInterface::withUri() is deprecated; guzzlehttp/psr7 3.0 requires bool for $preserveHost.', 120 \get_debug_type($preserveHost) 121 ); 122 } 123 113 124 if ($uri === $this->uri) { 114 125 return $this; … … 161 172 } 162 173 } 174 175 private static function warnOnMethodCasingChange(string $method): void 176 { 177 if ($method !== strtoupper($method)) { 178 \trigger_deprecation( 179 'guzzlehttp/psr7', 180 '2.11', 181 'Passing a non-uppercase HTTP method is deprecated; guzzlehttp/psr7 3.0 preserves method casing and will no longer uppercase it. Normalize the method before constructing or modifying requests if uppercase is required.' 182 ); 183 } 184 } 163 185 } -
sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/Response.php
r3505951 r3562098 129 129 public function withStatus($code, $reasonPhrase = ''): ResponseInterface 130 130 { 131 if (!\is_int($code) && \filter_var($code, \FILTER_VALIDATE_INT) !== false) { 132 \trigger_deprecation( 133 'guzzlehttp/psr7', 134 '2.11', 135 'Passing %s to ResponseInterface::withStatus() is deprecated; guzzlehttp/psr7 3.0 requires int for $code.', 136 \get_debug_type($code) 137 ); 138 } 139 140 if (!\is_string($reasonPhrase)) { 141 \trigger_deprecation( 142 'guzzlehttp/psr7', 143 '2.11', 144 'Passing %s to ResponseInterface::withStatus() is deprecated; guzzlehttp/psr7 3.0 requires string for $reasonPhrase.', 145 \get_debug_type($reasonPhrase) 146 ); 147 } 148 131 149 $this->assertStatusCodeIsInteger($code); 132 150 $code = (int) $code; -
sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/ServerRequest.php
r3561022 r3562098 166 166 public static function fromGlobals(): ServerRequestInterface 167 167 { 168 $method = s elf::getServerParam('REQUEST_METHOD') ?? 'GET';168 $method = strtoupper(self::getServerParam('REQUEST_METHOD') ?? 'GET'); 169 169 $headers = self::removeInvalidHostHeader(self::getAllHeaders()); 170 170 $uri = self::getUriFromGlobals(); … … 305 305 public function withUploadedFiles(array $uploadedFiles): ServerRequestInterface 306 306 { 307 $invalidUploadedFileFound = false; 308 $invalidUploadedFile = null; 309 $stack = [$uploadedFiles]; 310 311 while ($stack !== []) { 312 foreach (\array_pop($stack) as $uploadedFile) { 313 if ($uploadedFile instanceof UploadedFileInterface) { 314 continue; 315 } 316 317 if (\is_array($uploadedFile)) { 318 $stack[] = $uploadedFile; 319 continue; 320 } 321 322 $invalidUploadedFileFound = true; 323 $invalidUploadedFile = $uploadedFile; 324 325 break 2; 326 } 327 } 328 329 if ($invalidUploadedFileFound) { 330 \trigger_deprecation( 331 'guzzlehttp/psr7', 332 '2.11', 333 'Passing %s inside ServerRequestInterface::withUploadedFiles() is deprecated; guzzlehttp/psr7 3.0 requires an UploadedFileInterface[] tree.', 334 \get_debug_type($invalidUploadedFile) 335 ); 336 } 337 307 338 $new = clone $this; 308 339 $new->uploadedFiles = $uploadedFiles; … … 347 378 public function withParsedBody($data): ServerRequestInterface 348 379 { 380 if ($data !== null && !\is_array($data) && !\is_object($data)) { 381 \trigger_deprecation( 382 'guzzlehttp/psr7', 383 '2.11', 384 'Passing %s to ServerRequestInterface::withParsedBody() is deprecated; guzzlehttp/psr7 3.0 requires array|object|null.', 385 \get_debug_type($data) 386 ); 387 } 388 349 389 $new = clone $this; 350 390 $new->parsedBody = $data; … … 363 403 public function getAttribute($attribute, $default = null) 364 404 { 405 if (!\is_string($attribute)) { 406 \trigger_deprecation( 407 'guzzlehttp/psr7', 408 '2.11', 409 'Passing %s to ServerRequestInterface::getAttribute() is deprecated; guzzlehttp/psr7 3.0 requires string for $attribute.', 410 \get_debug_type($attribute) 411 ); 412 } 413 365 414 if (false === array_key_exists($attribute, $this->attributes)) { 366 415 return $default; … … 372 421 public function withAttribute($attribute, $value): ServerRequestInterface 373 422 { 423 if (!\is_string($attribute)) { 424 \trigger_deprecation( 425 'guzzlehttp/psr7', 426 '2.11', 427 'Passing %s to ServerRequestInterface::withAttribute() is deprecated; guzzlehttp/psr7 3.0 requires string for $attribute.', 428 \get_debug_type($attribute) 429 ); 430 } 431 374 432 $new = clone $this; 375 433 $new->attributes[$attribute] = $value; … … 380 438 public function withoutAttribute($attribute): ServerRequestInterface 381 439 { 440 if (!\is_string($attribute)) { 441 \trigger_deprecation( 442 'guzzlehttp/psr7', 443 '2.11', 444 'Passing %s to ServerRequestInterface::withoutAttribute() is deprecated; guzzlehttp/psr7 3.0 requires string for $attribute.', 445 \get_debug_type($attribute) 446 ); 447 } 448 382 449 if (false === array_key_exists($attribute, $this->attributes)) { 383 450 return $this; -
sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/Stream.php
r3561022 r3562098 201 201 public function seek($offset, $whence = SEEK_SET): void 202 202 { 203 if (!\is_int($offset)) { 204 \trigger_deprecation( 205 'guzzlehttp/psr7', 206 '2.11', 207 'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $offset.', 208 \get_debug_type($offset) 209 ); 210 } 211 212 if (!\is_int($whence)) { 213 \trigger_deprecation( 214 'guzzlehttp/psr7', 215 '2.11', 216 'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $whence.', 217 \get_debug_type($whence) 218 ); 219 } 220 203 221 $whence = (int) $whence; 204 222 … … 217 235 public function read($length): string 218 236 { 237 if (!\is_int($length)) { 238 \trigger_deprecation( 239 'guzzlehttp/psr7', 240 '2.11', 241 'Passing %s to StreamInterface::read() is deprecated; guzzlehttp/psr7 3.0 requires int for $length.', 242 \get_debug_type($length) 243 ); 244 } 245 219 246 if (!isset($this->stream)) { 220 247 throw new \RuntimeException('Stream is detached'); … … 246 273 public function write($string): int 247 274 { 275 if (!\is_string($string)) { 276 \trigger_deprecation( 277 'guzzlehttp/psr7', 278 '2.11', 279 'Passing %s to StreamInterface::write() is deprecated; guzzlehttp/psr7 3.0 requires string for $string.', 280 \get_debug_type($string) 281 ); 282 } 283 248 284 if (!isset($this->stream)) { 249 285 throw new \RuntimeException('Stream is detached'); … … 269 305 public function getMetadata($key = null) 270 306 { 307 if ($key !== null && !\is_string($key)) { 308 \trigger_deprecation( 309 'guzzlehttp/psr7', 310 '2.11', 311 'Passing %s to StreamInterface::getMetadata() is deprecated; guzzlehttp/psr7 3.0 requires string|null for $key.', 312 \get_debug_type($key) 313 ); 314 } 315 271 316 if (!isset($this->stream)) { 272 317 return $key ? null : []; -
sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php
r3505951 r3562098 87 87 public function getMetadata($key = null) 88 88 { 89 if ($key !== null && !\is_string($key)) { 90 \trigger_deprecation( 91 'guzzlehttp/psr7', 92 '2.11', 93 'Passing %s to StreamInterface::getMetadata() is deprecated; guzzlehttp/psr7 3.0 requires string|null for $key.', 94 \get_debug_type($key) 95 ); 96 } 97 89 98 return $this->stream->getMetadata($key); 90 99 } … … 132 141 public function seek($offset, $whence = SEEK_SET): void 133 142 { 143 if (!\is_int($offset)) { 144 \trigger_deprecation( 145 'guzzlehttp/psr7', 146 '2.11', 147 'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $offset.', 148 \get_debug_type($offset) 149 ); 150 } 151 152 if (!\is_int($whence)) { 153 \trigger_deprecation( 154 'guzzlehttp/psr7', 155 '2.11', 156 'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $whence.', 157 \get_debug_type($whence) 158 ); 159 } 160 134 161 $this->stream->seek($offset, $whence); 135 162 } … … 137 164 public function read($length): string 138 165 { 166 if (!\is_int($length)) { 167 \trigger_deprecation( 168 'guzzlehttp/psr7', 169 '2.11', 170 'Passing %s to StreamInterface::read() is deprecated; guzzlehttp/psr7 3.0 requires int for $length.', 171 \get_debug_type($length) 172 ); 173 } 174 139 175 return $this->stream->read($length); 140 176 } … … 142 178 public function write($string): int 143 179 { 180 if (!\is_string($string)) { 181 \trigger_deprecation( 182 'guzzlehttp/psr7', 183 '2.11', 184 'Passing %s to StreamInterface::write() is deprecated; guzzlehttp/psr7 3.0 requires string for $string.', 185 \get_debug_type($string) 186 ); 187 } 188 144 189 return $this->stream->write($string); 145 190 } -
sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/Uri.php
r3561022 r3562098 516 516 public function withPort($port): UriInterface 517 517 { 518 if ($port !== null && !\is_int($port)) { 519 \trigger_deprecation( 520 'guzzlehttp/psr7', 521 '2.11', 522 'Passing %s to UriInterface::withPort() is deprecated; guzzlehttp/psr7 3.0 requires int|null.', 523 \get_debug_type($port) 524 ); 525 } 526 518 527 $port = $this->filterPort($port); 519 528 … … 624 633 } 625 634 626 return \strtr($scheme, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); 635 $scheme = \strtr($scheme, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); 636 637 if ($scheme !== '' && !preg_match('/^[a-z][a-z0-9.+-]*$/D', $scheme)) { 638 \trigger_deprecation( 639 'guzzlehttp/psr7', 640 '2.11', 641 'Passing "%s" as a URI scheme is deprecated; guzzlehttp/psr7 3.0 requires URI schemes to match RFC 3986 syntax and begin with a letter.', 642 $scheme 643 ); 644 } 645 646 return $scheme; 627 647 } 628 648 -
sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/UriComparator.php
r3505951 r3562098 35 35 } 36 36 37 private static function computePort(UriInterface $uri): int37 private static function computePort(UriInterface $uri): ?int 38 38 { 39 39 $port = $uri->getPort(); … … 43 43 } 44 44 45 return 'https' === $uri->getScheme() ? 443 : 80; 45 if ('http' === $uri->getScheme()) { 46 return 80; 47 } 48 49 if ('https' === $uri->getScheme()) { 50 return 443; 51 } 52 53 return null; 46 54 } 47 55 -
sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/Utils.php
r3561022 r3562098 36 36 * Copy the contents of a stream into another stream until the given number 37 37 * of bytes have been read. 38 * 39 * The copy stops if the destination write returns 0, for example a 40 * BufferStream at its high water mark or a full DroppingStream. For a 41 * guaranteed full copy use a normal writable stream such as a file or 42 * php://temp stream. 38 43 * 39 44 * @param StreamInterface $source Stream to read from … … 50 55 if ($maxLen === -1) { 51 56 while (!$source->eof()) { 52 if (!$dest->write($source->read($bufferSize))) { 57 $buf = $source->read($bufferSize); 58 if ($buf === '') { 59 break; 60 } 61 62 if (!self::writeAll($dest, $buf)) { 53 63 break; 54 64 } … … 63 73 } 64 74 $remaining -= $len; 65 $dest->write($buf); 66 } 67 } 75 if (!self::writeAll($dest, $buf)) { 76 break; 77 } 78 } 79 } 80 } 81 82 /** 83 * Writes the full buffer to the destination, retrying short writes. 84 * 85 * Returns false when the destination write returns 0 or less. 86 */ 87 private static function writeAll(StreamInterface $dest, string $buf): bool 88 { 89 $written = 0; 90 $len = strlen($buf); 91 92 while ($written < $len) { 93 $result = $dest->write(substr($buf, $written)); 94 if ($result <= 0) { 95 return false; 96 } 97 98 $written += $result; 99 } 100 101 return true; 68 102 } 69 103 … … 146 180 * The changes can be one of: 147 181 * - method: (string) Changes the HTTP method. 148 * - set_headers: (array) Sets the given headers. 149 * - remove_headers: (array) Remove the given headers. 150 * - body: (mixed) Sets the given body. 182 * - set_headers: (array) Sets the given headers. Values must be strings 183 * or non-empty arrays of strings. 184 * - remove_headers: (array) Remove the given headers. Values may be 185 * strings or integers. 186 * - body: (mixed) Sets the given body. Present non-null values are converted 187 * with self::streamFor(), including scalar values, resources, streams, 188 * iterators, callable arrays, closures, invokable objects, and objects 189 * with __toString(). String inputs remain literal bodies. 151 190 * - uri: (UriInterface) Set the URI. 152 191 * - query: (string) Set the query string value of the URI. … … 161 200 return $request; 162 201 } 202 203 self::warnOnInvalidModifyRequestChanges($changes); 163 204 164 205 $headers = $request->getHeaders(); … … 168 209 } else { 169 210 // Remove the host header if one is on the URI 170 if ($host = $changes['uri']->getHost()) { 211 $host = $changes['uri']->getHost(); 212 if ($host !== '') { 213 if (isset($changes['set_headers']) && is_array($changes['set_headers'])) { 214 foreach (array_keys($changes['set_headers']) as $header) { 215 if (strtolower((string) $header) === 'host') { 216 throw new \InvalidArgumentException( 217 'Cannot modify request with both a URI containing a host and an explicit Host header.' 218 ); 219 } 220 } 221 } 222 171 223 $changes['set_headers']['Host'] = $host; 172 224 … … 257 309 258 310 return $new; 311 } 312 313 /** 314 * @param array<array-key, mixed> $changes 315 */ 316 private static function warnOnInvalidModifyRequestChanges(array $changes): void 317 { 318 foreach (['method', 'query', 'version'] as $key) { 319 if (\array_key_exists($key, $changes) && !\is_string($changes[$key])) { 320 self::warnOnInvalidModifyRequestChange($key, 'string', $changes[$key]); 321 } 322 } 323 324 if (\array_key_exists('uri', $changes) && !$changes['uri'] instanceof UriInterface) { 325 self::warnOnInvalidModifyRequestChange('uri', 'UriInterface', $changes['uri']); 326 } 327 328 if (\array_key_exists('body', $changes) && $changes['body'] === null) { 329 self::warnOnInvalidModifyRequestChange('body', 'resource|string|int|float|bool|StreamInterface|callable|\Iterator|\Stringable', $changes['body']); 330 } 331 332 if (\array_key_exists('set_headers', $changes)) { 333 if (!\is_array($changes['set_headers'])) { 334 self::warnOnInvalidModifyRequestChange('set_headers', 'array<array-key, string|non-empty-array<array-key, string>>', $changes['set_headers']); 335 } else { 336 foreach ($changes['set_headers'] as $header => $value) { 337 $headerPath = \sprintf('set_headers.%s', (string) $header); 338 339 if (\is_array($value)) { 340 if ($value === []) { 341 self::warnOnInvalidModifyRequestChange($headerPath, 'string|non-empty-array<array-key, string>', $value); 342 343 break; 344 } 345 346 foreach ($value as $index => $item) { 347 if (!\is_string($item)) { 348 self::warnOnInvalidModifyRequestChange(\sprintf('%s.%s', $headerPath, (string) $index), 'string', $item); 349 350 break 2; 351 } 352 } 353 } elseif (!\is_string($value)) { 354 self::warnOnInvalidModifyRequestChange($headerPath, 'string|non-empty-array<array-key, string>', $value); 355 356 break; 357 } 358 } 359 } 360 } 361 362 if (!\array_key_exists('remove_headers', $changes)) { 363 return; 364 } 365 366 if (!\is_array($changes['remove_headers'])) { 367 self::warnOnInvalidModifyRequestChange('remove_headers', 'array<array-key, string|int>', $changes['remove_headers']); 368 369 return; 370 } 371 372 foreach ($changes['remove_headers'] as $index => $header) { 373 if (!\is_string($header) && !\is_int($header)) { 374 self::warnOnInvalidModifyRequestChange(\sprintf('remove_headers.%s', (string) $index), 'string|int', $header); 375 376 return; 377 } 378 } 379 } 380 381 /** 382 * @param mixed $value 383 */ 384 private static function warnOnInvalidModifyRequestChange(string $key, string $expected, $value): void 385 { 386 \trigger_deprecation( 387 'guzzlehttp/psr7', 388 '2.11', 389 'Passing %s to Utils::modifyRequest() change "%s" is deprecated; guzzlehttp/psr7 3.0 requires %s.', 390 \get_debug_type($value), 391 $key, 392 $expected 393 ); 259 394 } 260 395 … … 319 454 * uses the string value. 320 455 * - `NULL`: When `null` is passed, an empty stream object is returned. 321 * - `callable` When a callable is passed, a read-only stream object will be 322 * created that invokes the given callable. The callable is invoked with the 323 * number of suggested bytes to read. The callable can return any number of 324 * bytes, but MUST return `false` when there is no more data to return. The 325 * stream object that wraps the callable will invoke the callable until the 326 * number of requested bytes are available. Any additional bytes will be 327 * buffered and used in subsequent reads. 456 * - `callable`: When a callable array, closure, or invokable object is passed 457 * and no earlier resource or object rule applies, a read-only stream object 458 * will be created that invokes the given callable. The callable is invoked 459 * with the suggested number of bytes to read. The callable can return fewer 460 * or more bytes than requested, but MUST return `false` or `null` when there 461 * is no more data to return. Any additional bytes will be buffered and used 462 * in subsequent reads. String inputs are always treated as string bodies, 463 * even when they name callable functions. 328 464 * 329 465 * @param resource|string|int|float|bool|StreamInterface|callable|\Iterator|null $resource Entity body data
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)