v2.1.8
This commit is contained in:
parent
658eb9b4da
commit
476389b914
93 changed files with 1864 additions and 305 deletions
|
|
@ -1,5 +1,26 @@
|
||||||
== Changelog ==
|
== Changelog ==
|
||||||
|
|
||||||
|
= 2.1.8 =
|
||||||
|
|
||||||
|
_Release date: 2026-08-24_
|
||||||
|
|
||||||
|
**Changed**
|
||||||
|
|
||||||
|
* Added the `Update URI` header pointing to https://www.robotstxt.software/plugins/robotstxt-smtp-amazonses/ so WordPress never offers conflicting updates from other channels (takes effect on WordPress 5.8+); updates continue to be delivered exclusively through the Manager (by ROBOTSTXT) plugin.
|
||||||
|
* Updated bundled AWS SDK for PHP to 3.393.4 (now shipping Guzzle 8.1.0).
|
||||||
|
|
||||||
|
**Compatibility**
|
||||||
|
|
||||||
|
* WordPress: 5.7 - 7.1
|
||||||
|
* PHP: 8.2 - 8.5
|
||||||
|
|
||||||
|
**Tests**
|
||||||
|
|
||||||
|
* PHP_CodeSniffer: 3.13.6
|
||||||
|
* WordPress Coding Standards: 3.4.1
|
||||||
|
* PHPCompatibility: 9.3.5
|
||||||
|
* PHPStan: 2.2.9
|
||||||
|
|
||||||
= 2.1.7 =
|
= 2.1.7 =
|
||||||
|
|
||||||
_Release date: 2026-08-17_
|
_Release date: 2026-08-17_
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -1,9 +1,9 @@
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: SMTP Amazon SES (by ROBOTSTXT) 2.1.7\n"
|
"Project-Id-Version: SMTP Amazon SES (by ROBOTSTXT) 2.1.8\n"
|
||||||
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/robotstxt-smtp-"
|
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/robotstxt-smtp-"
|
||||||
"amazonses\n"
|
"amazonses\n"
|
||||||
"POT-Creation-Date: 2026-08-17T20:18:50+00:00\n"
|
"POT-Creation-Date: 2026-08-24T12:46:43+00:00\n"
|
||||||
"PO-Revision-Date: 2026-08-17 19:30+0000\n"
|
"PO-Revision-Date: 2026-08-17 19:30+0000\n"
|
||||||
"Last-Translator: ROBOTSTXT <robotstxt@robotstxt.es>\n"
|
"Last-Translator: ROBOTSTXT <robotstxt@robotstxt.es>\n"
|
||||||
"Language-Team: Catalan\n"
|
"Language-Team: Catalan\n"
|
||||||
|
|
@ -357,7 +357,7 @@ msgstr "L'ID de clau d'accés d'Amazon SES s'ha eliminat."
|
||||||
msgid "The Amazon SES Secret Access Key has been cleared."
|
msgid "The Amazon SES Secret Access Key has been cleared."
|
||||||
msgstr "La clau d'accés secreta d'Amazon SES s'ha eliminat."
|
msgstr "La clau d'accés secreta d'Amazon SES s'ha eliminat."
|
||||||
|
|
||||||
#: robotstxt-smtp-amazonses.php:83
|
#: robotstxt-smtp-amazonses.php:84
|
||||||
msgid ""
|
msgid ""
|
||||||
"SMTP Amazon SES (by ROBOTSTXT) requires the SMTP (by ROBOTSTXT) plugin to be "
|
"SMTP Amazon SES (by ROBOTSTXT) requires the SMTP (by ROBOTSTXT) plugin to be "
|
||||||
"installed and active."
|
"installed and active."
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -1,9 +1,9 @@
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: SMTP Amazon SES (by ROBOTSTXT) 2.1.7\n"
|
"Project-Id-Version: SMTP Amazon SES (by ROBOTSTXT) 2.1.8\n"
|
||||||
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/robotstxt-smtp-"
|
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/robotstxt-smtp-"
|
||||||
"amazonses\n"
|
"amazonses\n"
|
||||||
"POT-Creation-Date: 2026-08-17T20:18:50+00:00\n"
|
"POT-Creation-Date: 2026-08-24T12:46:43+00:00\n"
|
||||||
"PO-Revision-Date: 2026-08-17 19:30+0000\n"
|
"PO-Revision-Date: 2026-08-17 19:30+0000\n"
|
||||||
"Last-Translator: ROBOTSTXT <robotstxt@robotstxt.es>\n"
|
"Last-Translator: ROBOTSTXT <robotstxt@robotstxt.es>\n"
|
||||||
"Language-Team: Spanish\n"
|
"Language-Team: Spanish\n"
|
||||||
|
|
@ -356,7 +356,7 @@ msgstr "El ID de clave de acceso de Amazon SES se ha eliminado."
|
||||||
msgid "The Amazon SES Secret Access Key has been cleared."
|
msgid "The Amazon SES Secret Access Key has been cleared."
|
||||||
msgstr "La clave de acceso secreta de Amazon SES se ha eliminado."
|
msgstr "La clave de acceso secreta de Amazon SES se ha eliminado."
|
||||||
|
|
||||||
#: robotstxt-smtp-amazonses.php:83
|
#: robotstxt-smtp-amazonses.php:84
|
||||||
msgid ""
|
msgid ""
|
||||||
"SMTP Amazon SES (by ROBOTSTXT) requires the SMTP (by ROBOTSTXT) plugin to be "
|
"SMTP Amazon SES (by ROBOTSTXT) requires the SMTP (by ROBOTSTXT) plugin to be "
|
||||||
"installed and active."
|
"installed and active."
|
||||||
|
|
|
||||||
|
|
@ -2,14 +2,14 @@
|
||||||
# This file is distributed under the GPL-3.0-or-later.
|
# This file is distributed under the GPL-3.0-or-later.
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: SMTP Amazon SES (by ROBOTSTXT) 2.1.7\n"
|
"Project-Id-Version: SMTP Amazon SES (by ROBOTSTXT) 2.1.8\n"
|
||||||
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/robotstxt-smtp-amazonses\n"
|
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/robotstxt-smtp-amazonses\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"POT-Creation-Date: 2026-08-17T20:18:50+00:00\n"
|
"POT-Creation-Date: 2026-08-24T12:46:43+00:00\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"X-Generator: WP-CLI 2.12.0\n"
|
"X-Generator: WP-CLI 2.12.0\n"
|
||||||
"X-Domain: robotstxt-smtp-amazonses\n"
|
"X-Domain: robotstxt-smtp-amazonses\n"
|
||||||
|
|
@ -339,6 +339,6 @@ msgstr ""
|
||||||
msgid "The Amazon SES Secret Access Key has been cleared."
|
msgid "The Amazon SES Secret Access Key has been cleared."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: robotstxt-smtp-amazonses.php:83
|
#: robotstxt-smtp-amazonses.php:84
|
||||||
msgid "SMTP Amazon SES (by ROBOTSTXT) requires the SMTP (by ROBOTSTXT) plugin to be installed and active."
|
msgid "SMTP Amazon SES (by ROBOTSTXT) requires the SMTP (by ROBOTSTXT) plugin to be installed and active."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
|
||||||
50
readme.txt
50
readme.txt
|
|
@ -3,9 +3,9 @@ Contributors: robotstxt, javiercasares
|
||||||
Tags: amazon-ses, smtp, email, mail
|
Tags: amazon-ses, smtp, email, mail
|
||||||
Requires at least: 5.7
|
Requires at least: 5.7
|
||||||
Tested up to: 7.1
|
Tested up to: 7.1
|
||||||
Stable tag: 2.1.7
|
Stable tag: 2.1.8
|
||||||
Requires PHP: 8.2
|
Requires PHP: 8.2
|
||||||
Version: 2.1.7
|
Version: 2.1.8
|
||||||
License: GPL-3.0-or-later
|
License: GPL-3.0-or-later
|
||||||
License URI: https://www.gnu.org/licenses/gpl-3.0.html
|
License URI: https://www.gnu.org/licenses/gpl-3.0.html
|
||||||
|
|
||||||
|
|
@ -57,6 +57,27 @@ Updates are delivered through the **Manager (by ROBOTSTXT)** plugin. The main SM
|
||||||
|
|
||||||
Only the 3 last versions. The full changelog will be at changelog.txt
|
Only the 3 last versions. The full changelog will be at changelog.txt
|
||||||
|
|
||||||
|
= 2.1.8 =
|
||||||
|
|
||||||
|
_Release date: 2026-08-24_
|
||||||
|
|
||||||
|
**Changed**
|
||||||
|
|
||||||
|
* Added the `Update URI` header pointing to https://www.robotstxt.software/plugins/robotstxt-smtp-amazonses/ so WordPress never offers conflicting updates from other channels (takes effect on WordPress 5.8+); updates continue to be delivered exclusively through the Manager (by ROBOTSTXT) plugin.
|
||||||
|
* Updated bundled AWS SDK for PHP to 3.393.4 (now shipping Guzzle 8.1.0).
|
||||||
|
|
||||||
|
**Compatibility**
|
||||||
|
|
||||||
|
* WordPress: 5.7 - 7.1
|
||||||
|
* PHP: 8.2 - 8.5
|
||||||
|
|
||||||
|
**Tests**
|
||||||
|
|
||||||
|
* PHP_CodeSniffer: 3.13.6
|
||||||
|
* WordPress Coding Standards: 3.4.1
|
||||||
|
* PHPCompatibility: 9.3.5
|
||||||
|
* PHPStan: 2.2.9
|
||||||
|
|
||||||
= 2.1.7 =
|
= 2.1.7 =
|
||||||
|
|
||||||
_Release date: 2026-08-17_
|
_Release date: 2026-08-17_
|
||||||
|
|
@ -100,31 +121,6 @@ _Release date: 2026-06-09_
|
||||||
* PHPCompatibility: 9.3.5
|
* PHPCompatibility: 9.3.5
|
||||||
* PHPStan: 2.2.2
|
* PHPStan: 2.2.2
|
||||||
|
|
||||||
= 2.1.5 =
|
|
||||||
|
|
||||||
_Release date: 2026-06-09_
|
|
||||||
|
|
||||||
**Added**
|
|
||||||
|
|
||||||
* Runtime check at initialization: if the parent SMTP (by ROBOTSTXT) plugin is missing or inactive, the plugin skips initialization and displays an admin notice instead of producing a fatal error.
|
|
||||||
|
|
||||||
**Fixed**
|
|
||||||
|
|
||||||
* Credentials never saving on first entry: credential validation now only blocks saving for definitive authentication failures. All other AWS errors allow saving.
|
|
||||||
* Reply-to email field cannot be cleared: submitting an empty value now explicitly removes the stored address.
|
|
||||||
|
|
||||||
**Compatibility**
|
|
||||||
|
|
||||||
* WordPress: 5.7 - 7.1
|
|
||||||
* PHP: 8.2 - 8.5
|
|
||||||
|
|
||||||
**Tests**
|
|
||||||
|
|
||||||
* PHP_CodeSniffer: 3.13.5
|
|
||||||
* WordPress Coding Standards: 3.3.0
|
|
||||||
* PHPCompatibility: 9.3.5
|
|
||||||
* PHPStan: 2.2.2
|
|
||||||
|
|
||||||
= Previous versions =
|
= Previous versions =
|
||||||
|
|
||||||
If you want to see the full changelog, visit the [changelog](https://www.robotstxt.software/plugins/robotstxt-smtp-amazonses/) page.
|
If you want to see the full changelog, visit the [changelog](https://www.robotstxt.software/plugins/robotstxt-smtp-amazonses/) page.
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,8 @@
|
||||||
* Plugin Name: SMTP Amazon SES (by ROBOTSTXT)
|
* Plugin Name: SMTP Amazon SES (by ROBOTSTXT)
|
||||||
* Plugin URI: https://www.robotstxt.software/plugins/robotstxt-smtp-amazonses/
|
* Plugin URI: https://www.robotstxt.software/plugins/robotstxt-smtp-amazonses/
|
||||||
* Description: Adds Amazon SES configuration support to the ROBOTSTXT SMTP plugin.
|
* Description: Adds Amazon SES configuration support to the ROBOTSTXT SMTP plugin.
|
||||||
* Version: 2.1.7
|
* Update URI: https://www.robotstxt.software/plugins/robotstxt-smtp-amazonses/
|
||||||
|
* Version: 2.1.8
|
||||||
* Requires at least: 5.7
|
* Requires at least: 5.7
|
||||||
* Requires PHP: 8.2
|
* Requires PHP: 8.2
|
||||||
* Network: true
|
* Network: true
|
||||||
|
|
@ -24,7 +25,7 @@ if ( ! defined( 'ABSPATH' ) ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ! defined( 'ROBOTSTXT_SMTP_AMAZONSES_VERSION' ) ) {
|
if ( ! defined( 'ROBOTSTXT_SMTP_AMAZONSES_VERSION' ) ) {
|
||||||
define( 'ROBOTSTXT_SMTP_AMAZONSES_VERSION', '2.1.7' );
|
define( 'ROBOTSTXT_SMTP_AMAZONSES_VERSION', '2.1.8' );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ! defined( 'ROBOTSTXT_SMTP_AMAZONSES_FILE' ) ) {
|
if ( ! defined( 'ROBOTSTXT_SMTP_AMAZONSES_FILE' ) ) {
|
||||||
|
|
|
||||||
28
update.json
28
update.json
|
|
@ -1,28 +0,0 @@
|
||||||
{
|
|
||||||
"name": "SMTP (by ROBOTSTXT) Amazon SES",
|
|
||||||
"slug": "robotstxt-smtp-amazonses",
|
|
||||||
"version": "2.1.7",
|
|
||||||
"download_url": "https://git.robotstxt.es/ROBOTSTXT/robotstxt-smtp-amazonses/releases/download/2.1.7/robotstxt-smtp-amazonses-2.1.7.zip",
|
|
||||||
"requires": "5.7",
|
|
||||||
"requires_php": "8.2",
|
|
||||||
"tested": "7.1",
|
|
||||||
"last_updated": "2026-06-09",
|
|
||||||
"author": "ROBOTSTXT",
|
|
||||||
"author_profile": "https://www.robotstxt.es/",
|
|
||||||
"homepage": "https://git.robotstxt.es/ROBOTSTXT/robotstxt-smtp-amazonses",
|
|
||||||
"requires_plugins": ["robotstxt-smtp"],
|
|
||||||
"description": "Adds Amazon SES (Simple Email Service) configuration support to the ROBOTSTXT SMTP plugin. Integrates seamlessly with AWS SDK for PHP to send emails through Amazon SES infrastructure.",
|
|
||||||
"changelog": "",
|
|
||||||
"sections": {
|
|
||||||
"description": "Adds Amazon SES (Simple Email Service) configuration support to the ROBOTSTXT SMTP plugin. Integrates seamlessly with AWS SDK for PHP to send emails through Amazon SES infrastructure.",
|
|
||||||
"changelog": ""
|
|
||||||
},
|
|
||||||
"banners": {
|
|
||||||
"low": "",
|
|
||||||
"high": ""
|
|
||||||
},
|
|
||||||
"icons": {
|
|
||||||
"1x": "",
|
|
||||||
"2x": ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
7
vendor/aws/aws-sdk-php/src/AwsClient.php
vendored
7
vendor/aws/aws-sdk-php/src/AwsClient.php
vendored
|
|
@ -204,6 +204,13 @@ class AwsClient implements AwsClientInterface
|
||||||
* signature version to use with a service (e.g., v4). Note that
|
* signature version to use with a service (e.g., v4). Note that
|
||||||
* per/operation signature version MAY override this requested signature
|
* per/operation signature version MAY override this requested signature
|
||||||
* version.
|
* version.
|
||||||
|
* - transport_sharing: (string) Set to a transport sharing mode ("none",
|
||||||
|
* "handler_prefer", "handler_require", "persistent_prefer", or
|
||||||
|
* "persistent_require") to enable connection sharing on the default
|
||||||
|
* HTTP handler. The "*_prefer" modes degrade gracefully when the
|
||||||
|
* installed version of Guzzle or the runtime cannot honor them, and
|
||||||
|
* the "*_require" modes throw. This option only applies when the SDK
|
||||||
|
* creates the default HTTP handler.
|
||||||
* - use_aws_shared_config_files: (bool, default=bool(true)) Set to false to
|
* - use_aws_shared_config_files: (bool, default=bool(true)) Set to false to
|
||||||
* disable checking for shared config file in '~/.aws/config' and
|
* disable checking for shared config file in '~/.aws/config' and
|
||||||
* '~/.aws/credentials'. This will override the AWS_CONFIG_FILE
|
* '~/.aws/credentials'. This will override the AWS_CONFIG_FILE
|
||||||
|
|
|
||||||
24
vendor/aws/aws-sdk-php/src/ClientResolver.php
vendored
24
vendor/aws/aws-sdk-php/src/ClientResolver.php
vendored
|
|
@ -30,6 +30,7 @@ use Aws\EndpointV2\EndpointDefinitionProvider;
|
||||||
use Aws\EndpointV2\EndpointProviderV2;
|
use Aws\EndpointV2\EndpointProviderV2;
|
||||||
use Aws\Exception\AwsException;
|
use Aws\Exception\AwsException;
|
||||||
use Aws\Exception\InvalidRegionException;
|
use Aws\Exception\InvalidRegionException;
|
||||||
|
use Aws\Handler\HttpTransportSharing;
|
||||||
use Aws\Retry\ConfigurationInterface as RetryConfigInterface;
|
use Aws\Retry\ConfigurationInterface as RetryConfigInterface;
|
||||||
use Aws\Retry\ConfigurationProvider as RetryConfigProvider;
|
use Aws\Retry\ConfigurationProvider as RetryConfigProvider;
|
||||||
use Aws\Retry\V3\OptIn as NewRetriesOptIn;
|
use Aws\Retry\V3\OptIn as NewRetriesOptIn;
|
||||||
|
|
@ -293,6 +294,12 @@ class ClientResolver
|
||||||
'default' => [],
|
'default' => [],
|
||||||
'doc' => 'Set to an array of SDK request options to apply to each request (e.g., proxy, verify, etc.).',
|
'doc' => 'Set to an array of SDK request options to apply to each request (e.g., proxy, verify, etc.).',
|
||||||
],
|
],
|
||||||
|
'transport_sharing' => [
|
||||||
|
'type' => 'value',
|
||||||
|
'valid' => ['string'],
|
||||||
|
'doc' => 'Set to a transport sharing mode ("none", "handler_prefer", "handler_require", "persistent_prefer", or "persistent_require") to enable connection sharing on the default HTTP handler. The "*_prefer" modes degrade gracefully when the installed version of Guzzle or the runtime cannot honor them, and the "*_require" modes throw. This option only applies when the SDK creates the default HTTP handler, and the "*_require" modes throw when combined with a custom "handler" or "http_handler" option.',
|
||||||
|
'fn' => [__CLASS__, '_apply_transport_sharing'],
|
||||||
|
],
|
||||||
'http_handler' => [
|
'http_handler' => [
|
||||||
'type' => 'value',
|
'type' => 'value',
|
||||||
'valid' => ['callable'],
|
'valid' => ['callable'],
|
||||||
|
|
@ -988,7 +995,7 @@ class ClientResolver
|
||||||
public static function _default_handler(array &$args)
|
public static function _default_handler(array &$args)
|
||||||
{
|
{
|
||||||
return new WrappedHttpHandler(
|
return new WrappedHttpHandler(
|
||||||
default_http_handler(),
|
default_http_handler($args['transport_sharing'] ?? null),
|
||||||
$args['parser'],
|
$args['parser'],
|
||||||
$args['error_parser'],
|
$args['error_parser'],
|
||||||
$args['exception_class'],
|
$args['exception_class'],
|
||||||
|
|
@ -1007,6 +1014,21 @@ class ClientResolver
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function _apply_transport_sharing($value, array &$args)
|
||||||
|
{
|
||||||
|
HttpTransportSharing::validate($value);
|
||||||
|
|
||||||
|
if ((isset($args['http_handler']) || isset($args['handler']))
|
||||||
|
&& HttpTransportSharing::isRequired($value)
|
||||||
|
) {
|
||||||
|
throw new IAE('The "transport_sharing" option can only'
|
||||||
|
. ' require transport sharing when the SDK creates the'
|
||||||
|
. ' default HTTP handler. Remove the "handler" or'
|
||||||
|
. ' "http_handler" option, or configure transport sharing'
|
||||||
|
. ' on the custom handler instead.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static function _apply_app_id($value, array &$args)
|
public static function _apply_app_id($value, array &$args)
|
||||||
{
|
{
|
||||||
// AppId should not be longer than 50 chars
|
// AppId should not be longer than 50 chars
|
||||||
|
|
|
||||||
|
|
@ -95,6 +95,8 @@ use Aws\AwsClient;
|
||||||
* @method \GuzzleHttp\Promise\Promise createEmailAddressAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise createEmailAddressAsync(array $args = [])
|
||||||
* @method \Aws\Result createEvaluationForm(array $args = [])
|
* @method \Aws\Result createEvaluationForm(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise createEvaluationFormAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise createEvaluationFormAsync(array $args = [])
|
||||||
|
* @method \Aws\Result createExtractionDefinition(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise createExtractionDefinitionAsync(array $args = [])
|
||||||
* @method \Aws\Result createHoursOfOperation(array $args = [])
|
* @method \Aws\Result createHoursOfOperation(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise createHoursOfOperationAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise createHoursOfOperationAsync(array $args = [])
|
||||||
* @method \Aws\Result createHoursOfOperationOverride(array $args = [])
|
* @method \Aws\Result createHoursOfOperationOverride(array $args = [])
|
||||||
|
|
@ -175,6 +177,8 @@ use Aws\AwsClient;
|
||||||
* @method \GuzzleHttp\Promise\Promise deleteEmailAddressAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise deleteEmailAddressAsync(array $args = [])
|
||||||
* @method \Aws\Result deleteEvaluationForm(array $args = [])
|
* @method \Aws\Result deleteEvaluationForm(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise deleteEvaluationFormAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise deleteEvaluationFormAsync(array $args = [])
|
||||||
|
* @method \Aws\Result deleteExtractionDefinition(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise deleteExtractionDefinitionAsync(array $args = [])
|
||||||
* @method \Aws\Result deleteHoursOfOperation(array $args = [])
|
* @method \Aws\Result deleteHoursOfOperation(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise deleteHoursOfOperationAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise deleteHoursOfOperationAsync(array $args = [])
|
||||||
* @method \Aws\Result deleteHoursOfOperationOverride(array $args = [])
|
* @method \Aws\Result deleteHoursOfOperationOverride(array $args = [])
|
||||||
|
|
@ -253,6 +257,8 @@ use Aws\AwsClient;
|
||||||
* @method \GuzzleHttp\Promise\Promise describeEmailAddressAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise describeEmailAddressAsync(array $args = [])
|
||||||
* @method \Aws\Result describeEvaluationForm(array $args = [])
|
* @method \Aws\Result describeEvaluationForm(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise describeEvaluationFormAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise describeEvaluationFormAsync(array $args = [])
|
||||||
|
* @method \Aws\Result describeExtractionDefinition(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise describeExtractionDefinitionAsync(array $args = [])
|
||||||
* @method \Aws\Result describeHoursOfOperation(array $args = [])
|
* @method \Aws\Result describeHoursOfOperation(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise describeHoursOfOperationAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise describeHoursOfOperationAsync(array $args = [])
|
||||||
* @method \Aws\Result describeHoursOfOperationOverride(array $args = [])
|
* @method \Aws\Result describeHoursOfOperationOverride(array $args = [])
|
||||||
|
|
@ -421,6 +427,8 @@ use Aws\AwsClient;
|
||||||
* @method \GuzzleHttp\Promise\Promise listEvaluationFormVersionsAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise listEvaluationFormVersionsAsync(array $args = [])
|
||||||
* @method \Aws\Result listEvaluationForms(array $args = [])
|
* @method \Aws\Result listEvaluationForms(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise listEvaluationFormsAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise listEvaluationFormsAsync(array $args = [])
|
||||||
|
* @method \Aws\Result listExtractionDefinitions(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise listExtractionDefinitionsAsync(array $args = [])
|
||||||
* @method \Aws\Result listFlowAssociations(array $args = [])
|
* @method \Aws\Result listFlowAssociations(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise listFlowAssociationsAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise listFlowAssociationsAsync(array $args = [])
|
||||||
* @method \Aws\Result listHoursOfOperationOverrides(array $args = [])
|
* @method \Aws\Result listHoursOfOperationOverrides(array $args = [])
|
||||||
|
|
@ -687,6 +695,8 @@ use Aws\AwsClient;
|
||||||
* @method \GuzzleHttp\Promise\Promise updateEmailAddressMetadataAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise updateEmailAddressMetadataAsync(array $args = [])
|
||||||
* @method \Aws\Result updateEvaluationForm(array $args = [])
|
* @method \Aws\Result updateEvaluationForm(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise updateEvaluationFormAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise updateEvaluationFormAsync(array $args = [])
|
||||||
|
* @method \Aws\Result updateExtractionDefinition(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise updateExtractionDefinitionAsync(array $args = [])
|
||||||
* @method \Aws\Result updateHoursOfOperation(array $args = [])
|
* @method \Aws\Result updateHoursOfOperation(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise updateHoursOfOperationAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise updateHoursOfOperationAsync(array $args = [])
|
||||||
* @method \Aws\Result updateHoursOfOperationOverride(array $args = [])
|
* @method \Aws\Result updateHoursOfOperationOverride(array $args = [])
|
||||||
|
|
|
||||||
10
vendor/aws/aws-sdk-php/src/EKS/EKSClient.php
vendored
10
vendor/aws/aws-sdk-php/src/EKS/EKSClient.php
vendored
|
|
@ -5,6 +5,8 @@ use Aws\AwsClient;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This client is used to interact with the **Amazon Elastic Container Service for Kubernetes** service.
|
* This client is used to interact with the **Amazon Elastic Container Service for Kubernetes** service.
|
||||||
|
* @method \Aws\Result activateCertificateAuthority(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise activateCertificateAuthorityAsync(array $args = [])
|
||||||
* @method \Aws\Result associateAccessPolicy(array $args = [])
|
* @method \Aws\Result associateAccessPolicy(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise associateAccessPolicyAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise associateAccessPolicyAsync(array $args = [])
|
||||||
* @method \Aws\Result associateEncryptionConfig(array $args = [])
|
* @method \Aws\Result associateEncryptionConfig(array $args = [])
|
||||||
|
|
@ -19,6 +21,8 @@ use Aws\AwsClient;
|
||||||
* @method \GuzzleHttp\Promise\Promise createAddonAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise createAddonAsync(array $args = [])
|
||||||
* @method \Aws\Result createCapability(array $args = [])
|
* @method \Aws\Result createCapability(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise createCapabilityAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise createCapabilityAsync(array $args = [])
|
||||||
|
* @method \Aws\Result createCertificateAuthority(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise createCertificateAuthorityAsync(array $args = [])
|
||||||
* @method \Aws\Result createCluster(array $args = [])
|
* @method \Aws\Result createCluster(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise createClusterAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise createClusterAsync(array $args = [])
|
||||||
* @method \Aws\Result createEksAnywhereSubscription(array $args = [])
|
* @method \Aws\Result createEksAnywhereSubscription(array $args = [])
|
||||||
|
|
@ -35,6 +39,8 @@ use Aws\AwsClient;
|
||||||
* @method \GuzzleHttp\Promise\Promise deleteAddonAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise deleteAddonAsync(array $args = [])
|
||||||
* @method \Aws\Result deleteCapability(array $args = [])
|
* @method \Aws\Result deleteCapability(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise deleteCapabilityAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise deleteCapabilityAsync(array $args = [])
|
||||||
|
* @method \Aws\Result deleteCertificateAuthority(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise deleteCertificateAuthorityAsync(array $args = [])
|
||||||
* @method \Aws\Result deleteCluster(array $args = [])
|
* @method \Aws\Result deleteCluster(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise deleteClusterAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise deleteClusterAsync(array $args = [])
|
||||||
* @method \Aws\Result deleteEksAnywhereSubscription(array $args = [])
|
* @method \Aws\Result deleteEksAnywhereSubscription(array $args = [])
|
||||||
|
|
@ -57,6 +63,8 @@ use Aws\AwsClient;
|
||||||
* @method \GuzzleHttp\Promise\Promise describeAddonVersionsAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise describeAddonVersionsAsync(array $args = [])
|
||||||
* @method \Aws\Result describeCapability(array $args = [])
|
* @method \Aws\Result describeCapability(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise describeCapabilityAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise describeCapabilityAsync(array $args = [])
|
||||||
|
* @method \Aws\Result describeCertificateAuthority(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise describeCertificateAuthorityAsync(array $args = [])
|
||||||
* @method \Aws\Result describeCluster(array $args = [])
|
* @method \Aws\Result describeCluster(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise describeClusterAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise describeClusterAsync(array $args = [])
|
||||||
* @method \Aws\Result describeClusterVersions(array $args = [])
|
* @method \Aws\Result describeClusterVersions(array $args = [])
|
||||||
|
|
@ -91,6 +99,8 @@ use Aws\AwsClient;
|
||||||
* @method \GuzzleHttp\Promise\Promise listAssociatedAccessPoliciesAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise listAssociatedAccessPoliciesAsync(array $args = [])
|
||||||
* @method \Aws\Result listCapabilities(array $args = [])
|
* @method \Aws\Result listCapabilities(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise listCapabilitiesAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise listCapabilitiesAsync(array $args = [])
|
||||||
|
* @method \Aws\Result listCertificateAuthorities(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise listCertificateAuthoritiesAsync(array $args = [])
|
||||||
* @method \Aws\Result listClusters(array $args = [])
|
* @method \Aws\Result listClusters(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise listClustersAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise listClustersAsync(array $args = [])
|
||||||
* @method \Aws\Result listEksAnywhereSubscriptions(array $args = [])
|
* @method \Aws\Result listEksAnywhereSubscriptions(array $args = [])
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
namespace Aws\Handler\Guzzle;
|
namespace Aws\Handler\Guzzle;
|
||||||
|
|
||||||
use Aws\Handler\HttpHandlerError;
|
use Aws\Handler\HttpHandlerError;
|
||||||
|
use Aws\Handler\HttpTransportSharing;
|
||||||
use GuzzleHttp\Utils;
|
use GuzzleHttp\Utils;
|
||||||
use GuzzleHttp\Promise;
|
use GuzzleHttp\Promise;
|
||||||
use GuzzleHttp\Client;
|
use GuzzleHttp\Client;
|
||||||
|
|
@ -18,11 +19,23 @@ class GuzzleHandler
|
||||||
private $client;
|
private $client;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param ClientInterface $client
|
* @param ClientInterface|null $client
|
||||||
|
* @param string|null $transportSharing
|
||||||
*/
|
*/
|
||||||
public function __construct(?ClientInterface $client = null)
|
public function __construct(
|
||||||
{
|
?ClientInterface $client = null,
|
||||||
$this->client = $client ?: new Client();
|
?string $transportSharing = null
|
||||||
|
) {
|
||||||
|
if ($client !== null && HttpTransportSharing::isRequired($transportSharing)) {
|
||||||
|
throw new \InvalidArgumentException('The provided transport'
|
||||||
|
. ' sharing mode cannot require sharing when a client is'
|
||||||
|
. ' provided. Configure the "transport_sharing" option on'
|
||||||
|
. ' the provided client instead.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->client = $client ?: new Client(
|
||||||
|
HttpTransportSharing::toClientConfig($transportSharing)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
118
vendor/aws/aws-sdk-php/src/Handler/HttpTransportSharing.php
vendored
Normal file
118
vendor/aws/aws-sdk-php/src/Handler/HttpTransportSharing.php
vendored
Normal file
|
|
@ -0,0 +1,118 @@
|
||||||
|
<?php
|
||||||
|
namespace Aws\Handler;
|
||||||
|
|
||||||
|
use GuzzleHttp\TransportSharing;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
final class HttpTransportSharing
|
||||||
|
{
|
||||||
|
private const NONE = 'none';
|
||||||
|
private const HANDLER_PREFER = 'handler_prefer';
|
||||||
|
private const HANDLER_REQUIRE = 'handler_require';
|
||||||
|
private const PERSISTENT_PREFER = 'persistent_prefer';
|
||||||
|
private const PERSISTENT_REQUIRE = 'persistent_require';
|
||||||
|
|
||||||
|
private const MODES = [
|
||||||
|
self::NONE,
|
||||||
|
self::HANDLER_PREFER,
|
||||||
|
self::HANDLER_REQUIRE,
|
||||||
|
self::PERSISTENT_PREFER,
|
||||||
|
self::PERSISTENT_REQUIRE,
|
||||||
|
];
|
||||||
|
|
||||||
|
public static function isRequired(?string $mode): bool
|
||||||
|
{
|
||||||
|
return $mode === self::HANDLER_REQUIRE
|
||||||
|
|| $mode === self::PERSISTENT_REQUIRE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates a requested transport sharing mode without resolving it
|
||||||
|
* against the capabilities of the installed version of Guzzle.
|
||||||
|
*/
|
||||||
|
public static function validate(?string $mode): void
|
||||||
|
{
|
||||||
|
if ($mode !== null && !in_array($mode, self::MODES, true)) {
|
||||||
|
throw new \InvalidArgumentException('The provided transport'
|
||||||
|
. ' sharing mode "' . $mode . '" is invalid. Valid modes are:'
|
||||||
|
. ' "none", "handler_prefer", "handler_require",'
|
||||||
|
. ' "persistent_prefer", "persistent_require".');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resolves a requested transport sharing mode to the mode that should be
|
||||||
|
* passed to the installed version of Guzzle, or null when no mode should
|
||||||
|
* be passed. The "*_prefer" modes degrade gracefully when the installed
|
||||||
|
* version of Guzzle cannot honor them, and the "*_require" modes throw.
|
||||||
|
*/
|
||||||
|
public static function resolve(?string $mode): ?string
|
||||||
|
{
|
||||||
|
self::validate($mode);
|
||||||
|
|
||||||
|
if ($mode === null || $mode === self::NONE) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Guzzle 8: all modes are understood, and Guzzle enforces the
|
||||||
|
// runtime requirements of the "*_require" modes itself.
|
||||||
|
if (self::supportsPersistentSharing()) {
|
||||||
|
return $mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Guzzle 7.11+: handler-lifetime sharing only.
|
||||||
|
if (self::supportsHandlerSharing()) {
|
||||||
|
if ($mode === self::PERSISTENT_PREFER) {
|
||||||
|
return self::HANDLER_PREFER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($mode === self::PERSISTENT_REQUIRE) {
|
||||||
|
throw new \RuntimeException('The "persistent_require"'
|
||||||
|
. ' transport sharing mode requires guzzlehttp/guzzle'
|
||||||
|
. ' ^8.0.');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Guzzle < 7.11: no transport sharing support.
|
||||||
|
if ($mode === self::PERSISTENT_REQUIRE) {
|
||||||
|
throw new \RuntimeException('The "persistent_require" transport'
|
||||||
|
. ' sharing mode requires guzzlehttp/guzzle ^8.0.');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($mode === self::HANDLER_REQUIRE) {
|
||||||
|
throw new \RuntimeException('The "handler_require" transport'
|
||||||
|
. ' sharing mode requires guzzlehttp/guzzle ^7.11 || ^8.0.');
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resolves a requested transport sharing mode to a Guzzle client
|
||||||
|
* constructor configuration array.
|
||||||
|
*/
|
||||||
|
public static function toClientConfig(?string $mode): array
|
||||||
|
{
|
||||||
|
$mode = self::resolve($mode);
|
||||||
|
|
||||||
|
return $mode === null ? [] : ['transport_sharing' => $mode];
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function supportsPersistentSharing(): bool
|
||||||
|
{
|
||||||
|
static $supported;
|
||||||
|
|
||||||
|
return $supported ??= defined(TransportSharing::class . '::PERSISTENT_PREFER');
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function supportsHandlerSharing(): bool
|
||||||
|
{
|
||||||
|
static $supported;
|
||||||
|
|
||||||
|
return $supported ??= class_exists(TransportSharing::class);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -48,6 +48,8 @@ use Aws\Middleware;
|
||||||
* @method \GuzzleHttp\Promise\Promise deleteLayerVersionAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise deleteLayerVersionAsync(array $args = [])
|
||||||
* @method \Aws\Result deleteProvisionedConcurrencyConfig(array $args = [])
|
* @method \Aws\Result deleteProvisionedConcurrencyConfig(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise deleteProvisionedConcurrencyConfigAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise deleteProvisionedConcurrencyConfigAsync(array $args = [])
|
||||||
|
* @method \Aws\Result deleteResourcePolicy(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise deleteResourcePolicyAsync(array $args = [])
|
||||||
* @method \Aws\Result getAccountSettings(array $args = [])
|
* @method \Aws\Result getAccountSettings(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise getAccountSettingsAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise getAccountSettingsAsync(array $args = [])
|
||||||
* @method \Aws\Result getAlias(array $args = [])
|
* @method \Aws\Result getAlias(array $args = [])
|
||||||
|
|
@ -90,6 +92,8 @@ use Aws\Middleware;
|
||||||
* @method \GuzzleHttp\Promise\Promise getPolicyAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise getPolicyAsync(array $args = [])
|
||||||
* @method \Aws\Result getProvisionedConcurrencyConfig(array $args = [])
|
* @method \Aws\Result getProvisionedConcurrencyConfig(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise getProvisionedConcurrencyConfigAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise getProvisionedConcurrencyConfigAsync(array $args = [])
|
||||||
|
* @method \Aws\Result getResourcePolicy(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise getResourcePolicyAsync(array $args = [])
|
||||||
* @method \Aws\Result getRuntimeManagementConfig(array $args = [])
|
* @method \Aws\Result getRuntimeManagementConfig(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise getRuntimeManagementConfigAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise getRuntimeManagementConfigAsync(array $args = [])
|
||||||
* @method \Aws\Result invoke(array $args = [])
|
* @method \Aws\Result invoke(array $args = [])
|
||||||
|
|
@ -144,6 +148,8 @@ use Aws\Middleware;
|
||||||
* @method \GuzzleHttp\Promise\Promise putFunctionScalingConfigAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise putFunctionScalingConfigAsync(array $args = [])
|
||||||
* @method \Aws\Result putProvisionedConcurrencyConfig(array $args = [])
|
* @method \Aws\Result putProvisionedConcurrencyConfig(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise putProvisionedConcurrencyConfigAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise putProvisionedConcurrencyConfigAsync(array $args = [])
|
||||||
|
* @method \Aws\Result putResourcePolicy(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise putResourcePolicyAsync(array $args = [])
|
||||||
* @method \Aws\Result putRuntimeManagementConfig(array $args = [])
|
* @method \Aws\Result putRuntimeManagementConfig(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise putRuntimeManagementConfigAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise putRuntimeManagementConfigAsync(array $args = [])
|
||||||
* @method \Aws\Result removeLayerVersionPermission(array $args = [])
|
* @method \Aws\Result removeLayerVersionPermission(array $args = [])
|
||||||
|
|
|
||||||
|
|
@ -11,12 +11,16 @@ use Aws\AwsClient;
|
||||||
* @method \GuzzleHttp\Promise\Promise cancelChangeSetAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise cancelChangeSetAsync(array $args = [])
|
||||||
* @method \Aws\Result deleteResourcePolicy(array $args = [])
|
* @method \Aws\Result deleteResourcePolicy(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise deleteResourcePolicyAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise deleteResourcePolicyAsync(array $args = [])
|
||||||
|
* @method \Aws\Result describeAssessment(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise describeAssessmentAsync(array $args = [])
|
||||||
* @method \Aws\Result describeChangeSet(array $args = [])
|
* @method \Aws\Result describeChangeSet(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise describeChangeSetAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise describeChangeSetAsync(array $args = [])
|
||||||
* @method \Aws\Result describeEntity(array $args = [])
|
* @method \Aws\Result describeEntity(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise describeEntityAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise describeEntityAsync(array $args = [])
|
||||||
* @method \Aws\Result getResourcePolicy(array $args = [])
|
* @method \Aws\Result getResourcePolicy(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise getResourcePolicyAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise getResourcePolicyAsync(array $args = [])
|
||||||
|
* @method \Aws\Result listAssessments(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise listAssessmentsAsync(array $args = [])
|
||||||
* @method \Aws\Result listChangeSets(array $args = [])
|
* @method \Aws\Result listChangeSets(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise listChangeSetsAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise listChangeSetsAsync(array $args = [])
|
||||||
* @method \Aws\Result listEntities(array $args = [])
|
* @method \Aws\Result listEntities(array $args = [])
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,8 @@ use Aws\AwsClient;
|
||||||
* @method \GuzzleHttp\Promise\Promise createOrderAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise createOrderAsync(array $args = [])
|
||||||
* @method \Aws\Result createOutpost(array $args = [])
|
* @method \Aws\Result createOutpost(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise createOutpostAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise createOutpostAsync(array $args = [])
|
||||||
|
* @method \Aws\Result createPrivateConnectivityConfig(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise createPrivateConnectivityConfigAsync(array $args = [])
|
||||||
* @method \Aws\Result createQuote(array $args = [])
|
* @method \Aws\Result createQuote(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise createQuoteAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise createQuoteAsync(array $args = [])
|
||||||
* @method \Aws\Result createRenewal(array $args = [])
|
* @method \Aws\Result createRenewal(array $args = [])
|
||||||
|
|
@ -41,6 +43,8 @@ use Aws\AwsClient;
|
||||||
* @method \GuzzleHttp\Promise\Promise getOutpostInstanceTypesAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise getOutpostInstanceTypesAsync(array $args = [])
|
||||||
* @method \Aws\Result getOutpostSupportedInstanceTypes(array $args = [])
|
* @method \Aws\Result getOutpostSupportedInstanceTypes(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise getOutpostSupportedInstanceTypesAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise getOutpostSupportedInstanceTypesAsync(array $args = [])
|
||||||
|
* @method \Aws\Result getPrivateConnectivityConfig(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise getPrivateConnectivityConfigAsync(array $args = [])
|
||||||
* @method \Aws\Result getQuote(array $args = [])
|
* @method \Aws\Result getQuote(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise getQuoteAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise getQuoteAsync(array $args = [])
|
||||||
* @method \Aws\Result getRenewalPricing(array $args = [])
|
* @method \Aws\Result getRenewalPricing(array $args = [])
|
||||||
|
|
|
||||||
7
vendor/aws/aws-sdk-php/src/Sdk.php
vendored
7
vendor/aws/aws-sdk-php/src/Sdk.php
vendored
|
|
@ -865,7 +865,7 @@ namespace Aws;
|
||||||
*/
|
*/
|
||||||
class Sdk
|
class Sdk
|
||||||
{
|
{
|
||||||
const VERSION = '3.392.3';
|
const VERSION = '3.393.4';
|
||||||
|
|
||||||
/** @var array Arguments for creating clients */
|
/** @var array Arguments for creating clients */
|
||||||
private $args;
|
private $args;
|
||||||
|
|
@ -884,7 +884,10 @@ class Sdk
|
||||||
$this->args = $args;
|
$this->args = $args;
|
||||||
|
|
||||||
if (!isset($args['handler']) && !isset($args['http_handler'])) {
|
if (!isset($args['handler']) && !isset($args['http_handler'])) {
|
||||||
$this->args['http_handler'] = default_http_handler();
|
$this->args['http_handler'] = default_http_handler(
|
||||||
|
$args['transport_sharing'] ?? null
|
||||||
|
);
|
||||||
|
unset($this->args['transport_sharing']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1,3 +1,3 @@
|
||||||
<?php
|
<?php
|
||||||
// This file was auto-generated from sdk-root/src/data/drs/2020-02-26/paginators-1.json
|
// This file was auto-generated from sdk-root/src/data/drs/2020-02-26/paginators-1.json
|
||||||
return [ 'pagination' => [ 'DescribeJobLogItems' => [ 'input_token' => 'nextToken', 'output_token' => 'nextToken', 'limit_key' => 'maxResults', 'result_key' => 'items', ], 'DescribeJobs' => [ 'input_token' => 'nextToken', 'output_token' => 'nextToken', 'limit_key' => 'maxResults', 'result_key' => 'items', ], 'DescribeLaunchConfigurationTemplates' => [ 'input_token' => 'nextToken', 'output_token' => 'nextToken', 'limit_key' => 'maxResults', 'result_key' => 'items', ], 'DescribeRecoveryInstances' => [ 'input_token' => 'nextToken', 'output_token' => 'nextToken', 'limit_key' => 'maxResults', 'result_key' => 'items', ], 'DescribeRecoverySnapshots' => [ 'input_token' => 'nextToken', 'output_token' => 'nextToken', 'limit_key' => 'maxResults', 'result_key' => 'items', ], 'DescribeReplicationConfigurationTemplates' => [ 'input_token' => 'nextToken', 'output_token' => 'nextToken', 'limit_key' => 'maxResults', 'result_key' => 'items', ], 'DescribeSourceNetworks' => [ 'input_token' => 'nextToken', 'output_token' => 'nextToken', 'limit_key' => 'maxResults', 'result_key' => 'items', ], 'DescribeSourceServers' => [ 'input_token' => 'nextToken', 'output_token' => 'nextToken', 'limit_key' => 'maxResults', 'result_key' => 'items', ], 'ListExtensibleSourceServers' => [ 'input_token' => 'nextToken', 'output_token' => 'nextToken', 'limit_key' => 'maxResults', 'result_key' => 'items', ], 'ListLaunchActions' => [ 'input_token' => 'nextToken', 'output_token' => 'nextToken', 'limit_key' => 'maxResults', 'result_key' => 'items', ], 'ListStagingAccounts' => [ 'input_token' => 'nextToken', 'output_token' => 'nextToken', 'limit_key' => 'maxResults', 'result_key' => 'accounts', ], ],];
|
return [ 'pagination' => [ 'DescribeJobLogItems' => [ 'input_token' => 'nextToken', 'output_token' => 'nextToken', 'limit_key' => 'maxResults', 'result_key' => 'items', ], 'DescribeJobs' => [ 'input_token' => 'nextToken', 'output_token' => 'nextToken', 'limit_key' => 'maxResults', 'result_key' => 'items', ], 'DescribeLaunchConfigurationTemplates' => [ 'input_token' => 'nextToken', 'output_token' => 'nextToken', 'limit_key' => 'maxResults', 'result_key' => 'items', ], 'DescribeRecoveryInstances' => [ 'input_token' => 'nextToken', 'output_token' => 'nextToken', 'limit_key' => 'maxResults', 'result_key' => 'items', ], 'DescribeRecoverySnapshots' => [ 'input_token' => 'nextToken', 'output_token' => 'nextToken', 'limit_key' => 'maxResults', 'result_key' => 'items', ], 'DescribeReplicationConfigurationTemplates' => [ 'input_token' => 'nextToken', 'output_token' => 'nextToken', 'limit_key' => 'maxResults', 'result_key' => 'items', ], 'DescribeSourceNetworks' => [ 'input_token' => 'nextToken', 'output_token' => 'nextToken', 'limit_key' => 'maxResults', 'result_key' => 'items', ], 'DescribeSourceServers' => [ 'input_token' => 'nextToken', 'output_token' => 'nextToken', 'limit_key' => 'maxResults', 'result_key' => 'items', ], 'ListExtensibleSourceServers' => [ 'input_token' => 'nextToken', 'output_token' => 'nextToken', 'limit_key' => 'maxResults', 'result_key' => 'items', ], 'ListLaunchActions' => [ 'input_token' => 'nextToken', 'output_token' => 'nextToken', 'limit_key' => 'maxResults', 'result_key' => 'items', ], 'ListRecoveryPlanExecutionSteps' => [ 'input_token' => 'nextToken', 'output_token' => 'nextToken', 'limit_key' => 'maxResults', 'result_key' => 'recoveryPlanExecutionSteps', ], 'ListRecoveryPlanExecutions' => [ 'input_token' => 'nextToken', 'output_token' => 'nextToken', 'limit_key' => 'maxResults', 'result_key' => 'recoveryPlanExecutions', ], 'ListRecoveryPlanSteps' => [ 'input_token' => 'nextToken', 'output_token' => 'nextToken', 'limit_key' => 'maxResults', 'result_key' => 'recoveryPlanSteps', ], 'ListRecoveryPlans' => [ 'input_token' => 'nextToken', 'output_token' => 'nextToken', 'limit_key' => 'maxResults', 'result_key' => 'recoveryPlans', ], 'ListStagingAccounts' => [ 'input_token' => 'nextToken', 'output_token' => 'nextToken', 'limit_key' => 'maxResults', 'result_key' => 'accounts', ], ],];
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1,3 +1,3 @@
|
||||||
<?php
|
<?php
|
||||||
// This file was auto-generated from sdk-root/src/data/eks/2017-11-01/paginators-1.json
|
// This file was auto-generated from sdk-root/src/data/eks/2017-11-01/paginators-1.json
|
||||||
return [ 'pagination' => [ 'DescribeAddonVersions' => [ 'input_token' => 'nextToken', 'limit_key' => 'maxResults', 'output_token' => 'nextToken', 'result_key' => 'addons', ], 'DescribeClusterVersions' => [ 'input_token' => 'nextToken', 'limit_key' => 'maxResults', 'output_token' => 'nextToken', 'result_key' => 'clusterVersions', ], 'ListAccessEntries' => [ 'input_token' => 'nextToken', 'limit_key' => 'maxResults', 'output_token' => 'nextToken', 'result_key' => 'accessEntries', ], 'ListAccessPolicies' => [ 'input_token' => 'nextToken', 'limit_key' => 'maxResults', 'output_token' => 'nextToken', 'result_key' => 'accessPolicies', ], 'ListAddons' => [ 'input_token' => 'nextToken', 'limit_key' => 'maxResults', 'output_token' => 'nextToken', 'result_key' => 'addons', ], 'ListAssociatedAccessPolicies' => [ 'input_token' => 'nextToken', 'limit_key' => 'maxResults', 'non_aggregate_keys' => [ 'clusterName', 'principalArn', ], 'output_token' => 'nextToken', 'result_key' => 'associatedAccessPolicies', ], 'ListCapabilities' => [ 'input_token' => 'nextToken', 'limit_key' => 'maxResults', 'output_token' => 'nextToken', 'result_key' => 'capabilities', ], 'ListClusters' => [ 'input_token' => 'nextToken', 'limit_key' => 'maxResults', 'output_token' => 'nextToken', 'result_key' => 'clusters', ], 'ListEksAnywhereSubscriptions' => [ 'input_token' => 'nextToken', 'limit_key' => 'maxResults', 'output_token' => 'nextToken', 'result_key' => 'subscriptions', ], 'ListFargateProfiles' => [ 'input_token' => 'nextToken', 'limit_key' => 'maxResults', 'output_token' => 'nextToken', 'result_key' => 'fargateProfileNames', ], 'ListIdentityProviderConfigs' => [ 'input_token' => 'nextToken', 'limit_key' => 'maxResults', 'output_token' => 'nextToken', 'result_key' => 'identityProviderConfigs', ], 'ListInsights' => [ 'input_token' => 'nextToken', 'limit_key' => 'maxResults', 'output_token' => 'nextToken', 'result_key' => 'insights', ], 'ListNodegroups' => [ 'input_token' => 'nextToken', 'limit_key' => 'maxResults', 'output_token' => 'nextToken', 'result_key' => 'nodegroups', ], 'ListPodIdentityAssociations' => [ 'input_token' => 'nextToken', 'limit_key' => 'maxResults', 'output_token' => 'nextToken', 'result_key' => 'associations', ], 'ListUpdates' => [ 'input_token' => 'nextToken', 'limit_key' => 'maxResults', 'output_token' => 'nextToken', 'result_key' => 'updateIds', ], ],];
|
return [ 'pagination' => [ 'DescribeAddonVersions' => [ 'input_token' => 'nextToken', 'limit_key' => 'maxResults', 'output_token' => 'nextToken', 'result_key' => 'addons', ], 'DescribeClusterVersions' => [ 'input_token' => 'nextToken', 'limit_key' => 'maxResults', 'output_token' => 'nextToken', 'result_key' => 'clusterVersions', ], 'ListAccessEntries' => [ 'input_token' => 'nextToken', 'limit_key' => 'maxResults', 'output_token' => 'nextToken', 'result_key' => 'accessEntries', ], 'ListAccessPolicies' => [ 'input_token' => 'nextToken', 'limit_key' => 'maxResults', 'output_token' => 'nextToken', 'result_key' => 'accessPolicies', ], 'ListAddons' => [ 'input_token' => 'nextToken', 'limit_key' => 'maxResults', 'output_token' => 'nextToken', 'result_key' => 'addons', ], 'ListAssociatedAccessPolicies' => [ 'input_token' => 'nextToken', 'limit_key' => 'maxResults', 'non_aggregate_keys' => [ 'clusterName', 'principalArn', ], 'output_token' => 'nextToken', 'result_key' => 'associatedAccessPolicies', ], 'ListCapabilities' => [ 'input_token' => 'nextToken', 'limit_key' => 'maxResults', 'output_token' => 'nextToken', 'result_key' => 'capabilities', ], 'ListCertificateAuthorities' => [ 'input_token' => 'nextToken', 'limit_key' => 'maxResults', 'output_token' => 'nextToken', 'result_key' => 'certificateAuthorities', ], 'ListClusters' => [ 'input_token' => 'nextToken', 'limit_key' => 'maxResults', 'output_token' => 'nextToken', 'result_key' => 'clusters', ], 'ListEksAnywhereSubscriptions' => [ 'input_token' => 'nextToken', 'limit_key' => 'maxResults', 'output_token' => 'nextToken', 'result_key' => 'subscriptions', ], 'ListFargateProfiles' => [ 'input_token' => 'nextToken', 'limit_key' => 'maxResults', 'output_token' => 'nextToken', 'result_key' => 'fargateProfileNames', ], 'ListIdentityProviderConfigs' => [ 'input_token' => 'nextToken', 'limit_key' => 'maxResults', 'output_token' => 'nextToken', 'result_key' => 'identityProviderConfigs', ], 'ListInsights' => [ 'input_token' => 'nextToken', 'limit_key' => 'maxResults', 'output_token' => 'nextToken', 'result_key' => 'insights', ], 'ListNodegroups' => [ 'input_token' => 'nextToken', 'limit_key' => 'maxResults', 'output_token' => 'nextToken', 'result_key' => 'nodegroups', ], 'ListPodIdentityAssociations' => [ 'input_token' => 'nextToken', 'limit_key' => 'maxResults', 'output_token' => 'nextToken', 'result_key' => 'associations', ], 'ListUpdates' => [ 'input_token' => 'nextToken', 'limit_key' => 'maxResults', 'output_token' => 'nextToken', 'result_key' => 'updateIds', ], ],];
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
<?php
|
<?php
|
||||||
// This file was auto-generated from sdk-root/src/data/eks/2017-11-01/waiters-2.json
|
// This file was auto-generated from sdk-root/src/data/eks/2017-11-01/waiters-2.json
|
||||||
return [ 'version' => 2, 'waiters' => [ 'ClusterActive' => [ 'delay' => 30, 'operation' => 'DescribeCluster', 'maxAttempts' => 40, 'acceptors' => [ [ 'expected' => 'DELETING', 'matcher' => 'path', 'state' => 'failure', 'argument' => 'cluster.status', ], [ 'expected' => 'FAILED', 'matcher' => 'path', 'state' => 'failure', 'argument' => 'cluster.status', ], [ 'expected' => 'ACTIVE', 'matcher' => 'path', 'state' => 'success', 'argument' => 'cluster.status', ], ], ], 'ClusterDeleted' => [ 'delay' => 30, 'operation' => 'DescribeCluster', 'maxAttempts' => 40, 'acceptors' => [ [ 'expected' => 'ACTIVE', 'matcher' => 'path', 'state' => 'failure', 'argument' => 'cluster.status', ], [ 'expected' => 'CREATING', 'matcher' => 'path', 'state' => 'failure', 'argument' => 'cluster.status', ], [ 'expected' => 'PENDING', 'matcher' => 'path', 'state' => 'failure', 'argument' => 'cluster.status', ], [ 'expected' => 'ResourceNotFoundException', 'matcher' => 'error', 'state' => 'success', ], ], ], 'NodegroupActive' => [ 'delay' => 30, 'operation' => 'DescribeNodegroup', 'maxAttempts' => 80, 'acceptors' => [ [ 'expected' => 'CREATE_FAILED', 'matcher' => 'path', 'state' => 'failure', 'argument' => 'nodegroup.status', ], [ 'expected' => 'ACTIVE', 'matcher' => 'path', 'state' => 'success', 'argument' => 'nodegroup.status', ], ], ], 'NodegroupDeleted' => [ 'delay' => 30, 'operation' => 'DescribeNodegroup', 'maxAttempts' => 40, 'acceptors' => [ [ 'expected' => 'DELETE_FAILED', 'matcher' => 'path', 'state' => 'failure', 'argument' => 'nodegroup.status', ], [ 'expected' => 'ResourceNotFoundException', 'matcher' => 'error', 'state' => 'success', ], ], ], 'AddonActive' => [ 'delay' => 10, 'operation' => 'DescribeAddon', 'maxAttempts' => 60, 'acceptors' => [ [ 'expected' => 'CREATE_FAILED', 'matcher' => 'path', 'state' => 'failure', 'argument' => 'addon.status', ], [ 'expected' => 'DEGRADED', 'matcher' => 'path', 'state' => 'failure', 'argument' => 'addon.status', ], [ 'expected' => 'ACTIVE', 'matcher' => 'path', 'state' => 'success', 'argument' => 'addon.status', ], ], ], 'AddonDeleted' => [ 'delay' => 10, 'operation' => 'DescribeAddon', 'maxAttempts' => 60, 'acceptors' => [ [ 'expected' => 'DELETE_FAILED', 'matcher' => 'path', 'state' => 'failure', 'argument' => 'addon.status', ], [ 'expected' => 'ResourceNotFoundException', 'matcher' => 'error', 'state' => 'success', ], ], ], 'FargateProfileActive' => [ 'delay' => 10, 'operation' => 'DescribeFargateProfile', 'maxAttempts' => 60, 'acceptors' => [ [ 'expected' => 'CREATE_FAILED', 'matcher' => 'path', 'state' => 'failure', 'argument' => 'fargateProfile.status', ], [ 'expected' => 'ACTIVE', 'matcher' => 'path', 'state' => 'success', 'argument' => 'fargateProfile.status', ], ], ], 'FargateProfileDeleted' => [ 'delay' => 30, 'operation' => 'DescribeFargateProfile', 'maxAttempts' => 60, 'acceptors' => [ [ 'expected' => 'DELETE_FAILED', 'matcher' => 'path', 'state' => 'failure', 'argument' => 'fargateProfile.status', ], [ 'expected' => 'ResourceNotFoundException', 'matcher' => 'error', 'state' => 'success', ], ], ], ],];
|
return [ 'version' => 2, 'waiters' => [ 'ClusterActive' => [ 'delay' => 30, 'operation' => 'DescribeCluster', 'maxAttempts' => 40, 'acceptors' => [ [ 'expected' => 'DELETING', 'matcher' => 'path', 'state' => 'failure', 'argument' => 'cluster.status', ], [ 'expected' => 'FAILED', 'matcher' => 'path', 'state' => 'failure', 'argument' => 'cluster.status', ], [ 'expected' => 'ACTIVE', 'matcher' => 'path', 'state' => 'success', 'argument' => 'cluster.status', ], ], ], 'ClusterDeleted' => [ 'delay' => 30, 'operation' => 'DescribeCluster', 'maxAttempts' => 40, 'acceptors' => [ [ 'expected' => 'ACTIVE', 'matcher' => 'path', 'state' => 'failure', 'argument' => 'cluster.status', ], [ 'expected' => 'CREATING', 'matcher' => 'path', 'state' => 'failure', 'argument' => 'cluster.status', ], [ 'expected' => 'PENDING', 'matcher' => 'path', 'state' => 'failure', 'argument' => 'cluster.status', ], [ 'expected' => 'ResourceNotFoundException', 'matcher' => 'error', 'state' => 'success', ], ], ], 'NodegroupActive' => [ 'delay' => 30, 'operation' => 'DescribeNodegroup', 'maxAttempts' => 80, 'acceptors' => [ [ 'expected' => 'CREATE_FAILED', 'matcher' => 'path', 'state' => 'failure', 'argument' => 'nodegroup.status', ], [ 'expected' => 'ACTIVE', 'matcher' => 'path', 'state' => 'success', 'argument' => 'nodegroup.status', ], ], ], 'NodegroupDeleted' => [ 'delay' => 30, 'operation' => 'DescribeNodegroup', 'maxAttempts' => 40, 'acceptors' => [ [ 'expected' => 'DELETE_FAILED', 'matcher' => 'path', 'state' => 'failure', 'argument' => 'nodegroup.status', ], [ 'expected' => 'ResourceNotFoundException', 'matcher' => 'error', 'state' => 'success', ], ], ], 'AddonActive' => [ 'delay' => 10, 'operation' => 'DescribeAddon', 'maxAttempts' => 60, 'acceptors' => [ [ 'expected' => 'CREATE_FAILED', 'matcher' => 'path', 'state' => 'failure', 'argument' => 'addon.status', ], [ 'expected' => 'DEGRADED', 'matcher' => 'path', 'state' => 'failure', 'argument' => 'addon.status', ], [ 'expected' => 'ACTIVE', 'matcher' => 'path', 'state' => 'success', 'argument' => 'addon.status', ], ], ], 'AddonDeleted' => [ 'delay' => 10, 'operation' => 'DescribeAddon', 'maxAttempts' => 60, 'acceptors' => [ [ 'expected' => 'DELETE_FAILED', 'matcher' => 'path', 'state' => 'failure', 'argument' => 'addon.status', ], [ 'expected' => 'ResourceNotFoundException', 'matcher' => 'error', 'state' => 'success', ], ], ], 'FargateProfileActive' => [ 'delay' => 10, 'operation' => 'DescribeFargateProfile', 'maxAttempts' => 60, 'acceptors' => [ [ 'expected' => 'CREATE_FAILED', 'matcher' => 'path', 'state' => 'failure', 'argument' => 'fargateProfile.status', ], [ 'expected' => 'ACTIVE', 'matcher' => 'path', 'state' => 'success', 'argument' => 'fargateProfile.status', ], ], ], 'FargateProfileDeleted' => [ 'delay' => 30, 'operation' => 'DescribeFargateProfile', 'maxAttempts' => 60, 'acceptors' => [ [ 'expected' => 'DELETE_FAILED', 'matcher' => 'path', 'state' => 'failure', 'argument' => 'fargateProfile.status', ], [ 'expected' => 'ResourceNotFoundException', 'matcher' => 'error', 'state' => 'success', ], ], ], 'CertificateAuthorityUpdateComplete' => [ 'delay' => 30, 'operation' => 'DescribeUpdate', 'maxAttempts' => 40, 'acceptors' => [ [ 'expected' => 'Failed', 'matcher' => 'path', 'state' => 'failure', 'argument' => 'update.status', ], [ 'expected' => 'Cancelled', 'matcher' => 'path', 'state' => 'failure', 'argument' => 'update.status', ], [ 'expected' => 'Successful', 'matcher' => 'path', 'state' => 'success', 'argument' => 'update.status', ], ], ], ],];
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1,3 +1,3 @@
|
||||||
<?php
|
<?php
|
||||||
// This file was auto-generated from sdk-root/src/data/geo-maps/2020-11-19/endpoint-bdd-1.json
|
// This file was auto-generated from sdk-root/src/data/geo-maps/2020-11-19/endpoint-bdd-1.json
|
||||||
return [ 'version' => '1.1', 'parameters' => [ 'UseDualStack' => [ 'builtIn' => 'AWS::UseDualStack', 'required' => true, 'default' => false, 'documentation' => 'When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.', 'type' => 'boolean', ], 'UseFIPS' => [ 'builtIn' => 'AWS::UseFIPS', 'required' => true, 'default' => false, 'documentation' => 'When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.', 'type' => 'boolean', ], 'Endpoint' => [ 'builtIn' => 'SDK::Endpoint', 'required' => false, 'documentation' => 'Override the endpoint used to send this request', 'type' => 'string', ], 'Region' => [ 'builtIn' => 'AWS::Region', 'required' => false, 'documentation' => 'The AWS region used to dispatch the request.', 'type' => 'string', ], ], 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Region', ], ], ], [ 'fn' => 'aws.partition', 'argv' => [ [ 'ref' => 'Region', ], ], 'assign' => 'PartitionResult', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'PartitionResult', ], 'name', ], ], 'aws-us-gov', ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'PartitionResult', ], 'name', ], ], 'aws', ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'PartitionResult', ], 'supportsFIPS', ], ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'PartitionResult', ], 'supportsDualStack', ], ], true, ], ], ], 'results' => [ [ 'conditions' => [], 'error' => 'Invalid Configuration: FIPS and custom endpoint are not supported', 'type' => 'error', ], [ 'conditions' => [], 'error' => 'Invalid Configuration: Dualstack and custom endpoint are not supported', 'type' => 'error', ], [ 'conditions' => [], 'endpoint' => [ 'url' => [ 'ref' => 'Endpoint', ], 'properties' => [], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://maps.geo.{Region}.{PartitionResult#dnsSuffix}/v2', 'properties' => [], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://maps.geo-fips.{Region}.{PartitionResult#dualStackDnsSuffix}/v2', 'properties' => [], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://maps.geo-fips.{Region}.{PartitionResult#dnsSuffix}/v2', 'properties' => [], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://maps.geo.{Region}.{PartitionResult#dualStackDnsSuffix}/v2', 'properties' => [], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://geo-maps-fips.{Region}.{PartitionResult#dualStackDnsSuffix}', 'properties' => [], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'error' => 'FIPS and DualStack are enabled, but this partition does not support one or both', 'type' => 'error', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://geo-maps-fips.{Region}.{PartitionResult#dnsSuffix}', 'properties' => [], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'error' => 'FIPS is enabled but this partition does not support FIPS', 'type' => 'error', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://geo-maps.{Region}.{PartitionResult#dualStackDnsSuffix}', 'properties' => [], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'error' => 'DualStack is enabled but this partition does not support DualStack', 'type' => 'error', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://geo-maps.{Region}.{PartitionResult#dnsSuffix}', 'properties' => [], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'error' => 'Invalid Configuration: Missing Region', 'type' => 'error', ], ], 'root' => 2, 'nodeCount' => 18, 'nodes' => '/////wAAAAH/////AAAAAAAAABEAAAADAAAAAQAAAAQF9eEPAAAAAgAAAAUF9eEPAAAAAwAAAA4AAAAGAAAABAAAAA4AAAAHAAAABQAAAAoAAAAIAAAABwAAAAkF9eEOAAAACAX14QwF9eENAAAABgAAAAwAAAALAAAABwX14QkF9eELAAAABwAAAA0F9eEKAAAACAX14QgF9eEJAAAABQAAABAAAAAPAAAABwX14QcF9eEEAAAABwX14QUF9eEGAAAABQX14QEAAAASAAAABwX14QIF9eED',];
|
return [ 'version' => '1.1', 'parameters' => [ 'UseDualStack' => [ 'builtIn' => 'AWS::UseDualStack', 'required' => true, 'default' => false, 'documentation' => 'When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.', 'type' => 'boolean', ], 'UseFIPS' => [ 'builtIn' => 'AWS::UseFIPS', 'required' => true, 'default' => false, 'documentation' => 'When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.', 'type' => 'boolean', ], 'Endpoint' => [ 'builtIn' => 'SDK::Endpoint', 'required' => false, 'documentation' => 'Override the endpoint used to send this request', 'type' => 'string', ], 'Region' => [ 'builtIn' => 'AWS::Region', 'required' => false, 'documentation' => 'The AWS region used to dispatch the request.', 'type' => 'string', ], ], 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Region', ], ], ], [ 'fn' => 'aws.partition', 'argv' => [ [ 'ref' => 'Region', ], ], 'assign' => 'PartitionResult', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'PartitionResult', ], 'name', ], ], 'aws-us-gov', ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'PartitionResult', ], 'name', ], ], 'aws', ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'PartitionResult', ], 'supportsFIPS', ], ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'PartitionResult', ], 'supportsDualStack', ], ], true, ], ], ], 'results' => [ [ 'conditions' => [], 'error' => 'Invalid Configuration: FIPS and custom endpoint are not supported', 'type' => 'error', ], [ 'conditions' => [], 'error' => 'Invalid Configuration: Dualstack and custom endpoint are not supported', 'type' => 'error', ], [ 'conditions' => [], 'endpoint' => [ 'url' => [ 'ref' => 'Endpoint', ], 'properties' => [], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://maps.geo.{Region}.{PartitionResult#dnsSuffix}', 'properties' => [], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://maps.geo-fips.{Region}.{PartitionResult#dualStackDnsSuffix}', 'properties' => [], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://maps.geo-fips.{Region}.{PartitionResult#dnsSuffix}', 'properties' => [], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://maps.geo.{Region}.{PartitionResult#dualStackDnsSuffix}', 'properties' => [], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://geo-maps-fips.{Region}.{PartitionResult#dualStackDnsSuffix}', 'properties' => [], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'error' => 'FIPS and DualStack are enabled, but this partition does not support one or both', 'type' => 'error', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://geo-maps-fips.{Region}.{PartitionResult#dnsSuffix}', 'properties' => [], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'error' => 'FIPS is enabled but this partition does not support FIPS', 'type' => 'error', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://geo-maps.{Region}.{PartitionResult#dualStackDnsSuffix}', 'properties' => [], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'error' => 'DualStack is enabled but this partition does not support DualStack', 'type' => 'error', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://geo-maps.{Region}.{PartitionResult#dnsSuffix}', 'properties' => [], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'error' => 'Invalid Configuration: Missing Region', 'type' => 'error', ], ], 'root' => 2, 'nodeCount' => 18, 'nodes' => '/////wAAAAH/////AAAAAAAAABEAAAADAAAAAQAAAAQF9eEPAAAAAgAAAAUF9eEPAAAAAwAAAA4AAAAGAAAABAAAAA4AAAAHAAAABQAAAAoAAAAIAAAABwAAAAkF9eEOAAAACAX14QwF9eENAAAABgAAAAwAAAALAAAABwX14QkF9eELAAAABwAAAA0F9eEKAAAACAX14QgF9eEJAAAABQAAABAAAAAPAAAABwX14QcF9eEEAAAABwX14QUF9eEGAAAABQX14QEAAAASAAAABwX14QIF9eED',];
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1,3 +1,3 @@
|
||||||
<?php
|
<?php
|
||||||
// This file was auto-generated from sdk-root/src/data/marketplace-catalog/2018-09-17/paginators-1.json
|
// This file was auto-generated from sdk-root/src/data/marketplace-catalog/2018-09-17/paginators-1.json
|
||||||
return [ 'pagination' => [ 'ListChangeSets' => [ 'input_token' => 'NextToken', 'output_token' => 'NextToken', 'limit_key' => 'MaxResults', 'result_key' => 'ChangeSetSummaryList', ], 'ListEntities' => [ 'input_token' => 'NextToken', 'output_token' => 'NextToken', 'limit_key' => 'MaxResults', 'result_key' => 'EntitySummaryList', ], ],];
|
return [ 'pagination' => [ 'DescribeAssessment' => [ 'input_token' => 'NextToken', 'output_token' => 'NextToken', 'limit_key' => 'MaxResults', 'result_key' => 'ControlAssessments', ], 'ListAssessments' => [ 'input_token' => 'NextToken', 'output_token' => 'NextToken', 'limit_key' => 'MaxResults', 'result_key' => 'AssessmentSummaryList', ], 'ListChangeSets' => [ 'input_token' => 'NextToken', 'output_token' => 'NextToken', 'limit_key' => 'MaxResults', 'result_key' => 'ChangeSetSummaryList', ], 'ListEntities' => [ 'input_token' => 'NextToken', 'output_token' => 'NextToken', 'limit_key' => 'MaxResults', 'result_key' => 'EntitySummaryList', ], ],];
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
40
vendor/aws/aws-sdk-php/src/drs/drsClient.php
vendored
40
vendor/aws/aws-sdk-php/src/drs/drsClient.php
vendored
|
|
@ -7,10 +7,16 @@ use Aws\AwsClient;
|
||||||
* This client is used to interact with the **Elastic Disaster Recovery Service** service.
|
* This client is used to interact with the **Elastic Disaster Recovery Service** service.
|
||||||
* @method \Aws\Result associateSourceNetworkStack(array $args = [])
|
* @method \Aws\Result associateSourceNetworkStack(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise associateSourceNetworkStackAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise associateSourceNetworkStackAsync(array $args = [])
|
||||||
|
* @method \Aws\Result cancelRecoveryPlanExecution(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise cancelRecoveryPlanExecutionAsync(array $args = [])
|
||||||
* @method \Aws\Result createExtendedSourceServer(array $args = [])
|
* @method \Aws\Result createExtendedSourceServer(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise createExtendedSourceServerAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise createExtendedSourceServerAsync(array $args = [])
|
||||||
* @method \Aws\Result createLaunchConfigurationTemplate(array $args = [])
|
* @method \Aws\Result createLaunchConfigurationTemplate(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise createLaunchConfigurationTemplateAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise createLaunchConfigurationTemplateAsync(array $args = [])
|
||||||
|
* @method \Aws\Result createRecoveryPlan(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise createRecoveryPlanAsync(array $args = [])
|
||||||
|
* @method \Aws\Result createRecoveryPlanStep(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise createRecoveryPlanStepAsync(array $args = [])
|
||||||
* @method \Aws\Result createReplicationConfigurationTemplate(array $args = [])
|
* @method \Aws\Result createReplicationConfigurationTemplate(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise createReplicationConfigurationTemplateAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise createReplicationConfigurationTemplateAsync(array $args = [])
|
||||||
* @method \Aws\Result createSourceNetwork(array $args = [])
|
* @method \Aws\Result createSourceNetwork(array $args = [])
|
||||||
|
|
@ -23,6 +29,12 @@ use Aws\AwsClient;
|
||||||
* @method \GuzzleHttp\Promise\Promise deleteLaunchConfigurationTemplateAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise deleteLaunchConfigurationTemplateAsync(array $args = [])
|
||||||
* @method \Aws\Result deleteRecoveryInstance(array $args = [])
|
* @method \Aws\Result deleteRecoveryInstance(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise deleteRecoveryInstanceAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise deleteRecoveryInstanceAsync(array $args = [])
|
||||||
|
* @method \Aws\Result deleteRecoveryPlan(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise deleteRecoveryPlanAsync(array $args = [])
|
||||||
|
* @method \Aws\Result deleteRecoveryPlanExecution(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise deleteRecoveryPlanExecutionAsync(array $args = [])
|
||||||
|
* @method \Aws\Result deleteRecoveryPlanStep(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise deleteRecoveryPlanStepAsync(array $args = [])
|
||||||
* @method \Aws\Result deleteReplicationConfigurationTemplate(array $args = [])
|
* @method \Aws\Result deleteReplicationConfigurationTemplate(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise deleteReplicationConfigurationTemplateAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise deleteReplicationConfigurationTemplateAsync(array $args = [])
|
||||||
* @method \Aws\Result deleteSourceNetwork(array $args = [])
|
* @method \Aws\Result deleteSourceNetwork(array $args = [])
|
||||||
|
|
@ -55,6 +67,14 @@ use Aws\AwsClient;
|
||||||
* @method \GuzzleHttp\Promise\Promise getFailbackReplicationConfigurationAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise getFailbackReplicationConfigurationAsync(array $args = [])
|
||||||
* @method \Aws\Result getLaunchConfiguration(array $args = [])
|
* @method \Aws\Result getLaunchConfiguration(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise getLaunchConfigurationAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise getLaunchConfigurationAsync(array $args = [])
|
||||||
|
* @method \Aws\Result getRecoveryPlan(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise getRecoveryPlanAsync(array $args = [])
|
||||||
|
* @method \Aws\Result getRecoveryPlanExecution(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise getRecoveryPlanExecutionAsync(array $args = [])
|
||||||
|
* @method \Aws\Result getRecoveryPlanExecutionStep(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise getRecoveryPlanExecutionStepAsync(array $args = [])
|
||||||
|
* @method \Aws\Result getRecoveryPlanStep(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise getRecoveryPlanStepAsync(array $args = [])
|
||||||
* @method \Aws\Result getReplicationConfiguration(array $args = [])
|
* @method \Aws\Result getReplicationConfiguration(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise getReplicationConfigurationAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise getReplicationConfigurationAsync(array $args = [])
|
||||||
* @method \Aws\Result initializeService(array $args = [])
|
* @method \Aws\Result initializeService(array $args = [])
|
||||||
|
|
@ -63,20 +83,34 @@ use Aws\AwsClient;
|
||||||
* @method \GuzzleHttp\Promise\Promise listExtensibleSourceServersAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise listExtensibleSourceServersAsync(array $args = [])
|
||||||
* @method \Aws\Result listLaunchActions(array $args = [])
|
* @method \Aws\Result listLaunchActions(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise listLaunchActionsAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise listLaunchActionsAsync(array $args = [])
|
||||||
|
* @method \Aws\Result listRecoveryPlanExecutionSteps(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise listRecoveryPlanExecutionStepsAsync(array $args = [])
|
||||||
|
* @method \Aws\Result listRecoveryPlanExecutions(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise listRecoveryPlanExecutionsAsync(array $args = [])
|
||||||
|
* @method \Aws\Result listRecoveryPlanSteps(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise listRecoveryPlanStepsAsync(array $args = [])
|
||||||
|
* @method \Aws\Result listRecoveryPlans(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise listRecoveryPlansAsync(array $args = [])
|
||||||
* @method \Aws\Result listStagingAccounts(array $args = [])
|
* @method \Aws\Result listStagingAccounts(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise listStagingAccountsAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise listStagingAccountsAsync(array $args = [])
|
||||||
* @method \Aws\Result listTagsForResource(array $args = [])
|
* @method \Aws\Result listTagsForResource(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise listTagsForResourceAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise listTagsForResourceAsync(array $args = [])
|
||||||
* @method \Aws\Result putLaunchAction(array $args = [])
|
* @method \Aws\Result putLaunchAction(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise putLaunchActionAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise putLaunchActionAsync(array $args = [])
|
||||||
|
* @method \Aws\Result reorderRecoveryPlanSteps(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise reorderRecoveryPlanStepsAsync(array $args = [])
|
||||||
* @method \Aws\Result retryDataReplication(array $args = [])
|
* @method \Aws\Result retryDataReplication(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise retryDataReplicationAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise retryDataReplicationAsync(array $args = [])
|
||||||
|
* @method \Aws\Result retryRecoveryPlanExecutionStep(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise retryRecoveryPlanExecutionStepAsync(array $args = [])
|
||||||
* @method \Aws\Result reverseReplication(array $args = [])
|
* @method \Aws\Result reverseReplication(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise reverseReplicationAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise reverseReplicationAsync(array $args = [])
|
||||||
* @method \Aws\Result startFailbackLaunch(array $args = [])
|
* @method \Aws\Result startFailbackLaunch(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise startFailbackLaunchAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise startFailbackLaunchAsync(array $args = [])
|
||||||
* @method \Aws\Result startRecovery(array $args = [])
|
* @method \Aws\Result startRecovery(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise startRecoveryAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise startRecoveryAsync(array $args = [])
|
||||||
|
* @method \Aws\Result startRecoveryPlanExecution(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise startRecoveryPlanExecutionAsync(array $args = [])
|
||||||
* @method \Aws\Result startReplication(array $args = [])
|
* @method \Aws\Result startReplication(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise startReplicationAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise startReplicationAsync(array $args = [])
|
||||||
* @method \Aws\Result startSourceNetworkRecovery(array $args = [])
|
* @method \Aws\Result startSourceNetworkRecovery(array $args = [])
|
||||||
|
|
@ -101,6 +135,12 @@ use Aws\AwsClient;
|
||||||
* @method \GuzzleHttp\Promise\Promise updateLaunchConfigurationAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise updateLaunchConfigurationAsync(array $args = [])
|
||||||
* @method \Aws\Result updateLaunchConfigurationTemplate(array $args = [])
|
* @method \Aws\Result updateLaunchConfigurationTemplate(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise updateLaunchConfigurationTemplateAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise updateLaunchConfigurationTemplateAsync(array $args = [])
|
||||||
|
* @method \Aws\Result updateRecoveryPlan(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise updateRecoveryPlanAsync(array $args = [])
|
||||||
|
* @method \Aws\Result updateRecoveryPlanExecutionStep(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise updateRecoveryPlanExecutionStepAsync(array $args = [])
|
||||||
|
* @method \Aws\Result updateRecoveryPlanStep(array $args = [])
|
||||||
|
* @method \GuzzleHttp\Promise\Promise updateRecoveryPlanStepAsync(array $args = [])
|
||||||
* @method \Aws\Result updateReplicationConfiguration(array $args = [])
|
* @method \Aws\Result updateReplicationConfiguration(array $args = [])
|
||||||
* @method \GuzzleHttp\Promise\Promise updateReplicationConfigurationAsync(array $args = [])
|
* @method \GuzzleHttp\Promise\Promise updateReplicationConfigurationAsync(array $args = [])
|
||||||
* @method \Aws\Result updateReplicationConfigurationTemplate(array $args = [])
|
* @method \Aws\Result updateReplicationConfigurationTemplate(array $args = [])
|
||||||
|
|
|
||||||
10
vendor/aws/aws-sdk-php/src/functions.php
vendored
10
vendor/aws/aws-sdk-php/src/functions.php
vendored
|
|
@ -270,11 +270,17 @@ function describe_type($input)
|
||||||
/**
|
/**
|
||||||
* Creates a default HTTP handler based on the available clients.
|
* Creates a default HTTP handler based on the available clients.
|
||||||
*
|
*
|
||||||
|
* @param string|null $transportSharing Optional transport sharing mode
|
||||||
|
* ("none", "handler_prefer", "handler_require", "persistent_prefer",
|
||||||
|
* or "persistent_require") to apply to the underlying HTTP client.
|
||||||
|
* The "*_prefer" modes degrade gracefully when the installed version
|
||||||
|
* of Guzzle cannot honor them, and the "*_require" modes throw.
|
||||||
|
*
|
||||||
* @return callable
|
* @return callable
|
||||||
*/
|
*/
|
||||||
function default_http_handler()
|
function default_http_handler(?string $transportSharing = null)
|
||||||
{
|
{
|
||||||
return new \Aws\Handler\Guzzle\GuzzleHandler();
|
return new \Aws\Handler\Guzzle\GuzzleHandler(null, $transportSharing);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
3
vendor/composer/autoload_classmap.php
vendored
3
vendor/composer/autoload_classmap.php
vendored
|
|
@ -607,6 +607,7 @@ return array(
|
||||||
'Aws\\HandlerList' => $vendorDir . '/aws/aws-sdk-php/src/HandlerList.php',
|
'Aws\\HandlerList' => $vendorDir . '/aws/aws-sdk-php/src/HandlerList.php',
|
||||||
'Aws\\Handler\\Guzzle\\GuzzleHandler' => $vendorDir . '/aws/aws-sdk-php/src/Handler/Guzzle/GuzzleHandler.php',
|
'Aws\\Handler\\Guzzle\\GuzzleHandler' => $vendorDir . '/aws/aws-sdk-php/src/Handler/Guzzle/GuzzleHandler.php',
|
||||||
'Aws\\Handler\\HttpHandlerError' => $vendorDir . '/aws/aws-sdk-php/src/Handler/HttpHandlerError.php',
|
'Aws\\Handler\\HttpHandlerError' => $vendorDir . '/aws/aws-sdk-php/src/Handler/HttpHandlerError.php',
|
||||||
|
'Aws\\Handler\\HttpTransportSharing' => $vendorDir . '/aws/aws-sdk-php/src/Handler/HttpTransportSharing.php',
|
||||||
'Aws\\HasDataTrait' => $vendorDir . '/aws/aws-sdk-php/src/HasDataTrait.php',
|
'Aws\\HasDataTrait' => $vendorDir . '/aws/aws-sdk-php/src/HasDataTrait.php',
|
||||||
'Aws\\HasMonitoringEventsTrait' => $vendorDir . '/aws/aws-sdk-php/src/HasMonitoringEventsTrait.php',
|
'Aws\\HasMonitoringEventsTrait' => $vendorDir . '/aws/aws-sdk-php/src/HasMonitoringEventsTrait.php',
|
||||||
'Aws\\HashInterface' => $vendorDir . '/aws/aws-sdk-php/src/HashInterface.php',
|
'Aws\\HashInterface' => $vendorDir . '/aws/aws-sdk-php/src/HashInterface.php',
|
||||||
|
|
@ -1335,9 +1336,11 @@ return array(
|
||||||
'GuzzleHttp\\Handler\\ProxyEnv' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/ProxyEnv.php',
|
'GuzzleHttp\\Handler\\ProxyEnv' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/ProxyEnv.php',
|
||||||
'GuzzleHttp\\Handler\\RequestFraming' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/RequestFraming.php',
|
'GuzzleHttp\\Handler\\RequestFraming' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/RequestFraming.php',
|
||||||
'GuzzleHttp\\Handler\\StreamHandler' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/StreamHandler.php',
|
'GuzzleHttp\\Handler\\StreamHandler' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/StreamHandler.php',
|
||||||
|
'GuzzleHttp\\Handler\\StreamTlsSessionCache' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/StreamTlsSessionCache.php',
|
||||||
'GuzzleHttp\\Handler\\Timeout' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/Timeout.php',
|
'GuzzleHttp\\Handler\\Timeout' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/Timeout.php',
|
||||||
'GuzzleHttp\\Handler\\TlsVersion' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/TlsVersion.php',
|
'GuzzleHttp\\Handler\\TlsVersion' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/TlsVersion.php',
|
||||||
'GuzzleHttp\\Handler\\TransferByteCounter' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/TransferByteCounter.php',
|
'GuzzleHttp\\Handler\\TransferByteCounter' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/TransferByteCounter.php',
|
||||||
|
'GuzzleHttp\\Handler\\UriDiagnostic' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/UriDiagnostic.php',
|
||||||
'GuzzleHttp\\HostIdentity' => $vendorDir . '/guzzlehttp/guzzle/src/HostIdentity.php',
|
'GuzzleHttp\\HostIdentity' => $vendorDir . '/guzzlehttp/guzzle/src/HostIdentity.php',
|
||||||
'GuzzleHttp\\Idn' => $vendorDir . '/guzzlehttp/guzzle/src/Idn.php',
|
'GuzzleHttp\\Idn' => $vendorDir . '/guzzlehttp/guzzle/src/Idn.php',
|
||||||
'GuzzleHttp\\MessageFormatter' => $vendorDir . '/guzzlehttp/guzzle/src/MessageFormatter.php',
|
'GuzzleHttp\\MessageFormatter' => $vendorDir . '/guzzlehttp/guzzle/src/MessageFormatter.php',
|
||||||
|
|
|
||||||
3
vendor/composer/autoload_static.php
vendored
3
vendor/composer/autoload_static.php
vendored
|
|
@ -700,6 +700,7 @@ class ComposerStaticInit85325c0f13ef626582fea9d1df635a9d
|
||||||
'Aws\\HandlerList' => __DIR__ . '/..' . '/aws/aws-sdk-php/src/HandlerList.php',
|
'Aws\\HandlerList' => __DIR__ . '/..' . '/aws/aws-sdk-php/src/HandlerList.php',
|
||||||
'Aws\\Handler\\Guzzle\\GuzzleHandler' => __DIR__ . '/..' . '/aws/aws-sdk-php/src/Handler/Guzzle/GuzzleHandler.php',
|
'Aws\\Handler\\Guzzle\\GuzzleHandler' => __DIR__ . '/..' . '/aws/aws-sdk-php/src/Handler/Guzzle/GuzzleHandler.php',
|
||||||
'Aws\\Handler\\HttpHandlerError' => __DIR__ . '/..' . '/aws/aws-sdk-php/src/Handler/HttpHandlerError.php',
|
'Aws\\Handler\\HttpHandlerError' => __DIR__ . '/..' . '/aws/aws-sdk-php/src/Handler/HttpHandlerError.php',
|
||||||
|
'Aws\\Handler\\HttpTransportSharing' => __DIR__ . '/..' . '/aws/aws-sdk-php/src/Handler/HttpTransportSharing.php',
|
||||||
'Aws\\HasDataTrait' => __DIR__ . '/..' . '/aws/aws-sdk-php/src/HasDataTrait.php',
|
'Aws\\HasDataTrait' => __DIR__ . '/..' . '/aws/aws-sdk-php/src/HasDataTrait.php',
|
||||||
'Aws\\HasMonitoringEventsTrait' => __DIR__ . '/..' . '/aws/aws-sdk-php/src/HasMonitoringEventsTrait.php',
|
'Aws\\HasMonitoringEventsTrait' => __DIR__ . '/..' . '/aws/aws-sdk-php/src/HasMonitoringEventsTrait.php',
|
||||||
'Aws\\HashInterface' => __DIR__ . '/..' . '/aws/aws-sdk-php/src/HashInterface.php',
|
'Aws\\HashInterface' => __DIR__ . '/..' . '/aws/aws-sdk-php/src/HashInterface.php',
|
||||||
|
|
@ -1428,9 +1429,11 @@ class ComposerStaticInit85325c0f13ef626582fea9d1df635a9d
|
||||||
'GuzzleHttp\\Handler\\ProxyEnv' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/ProxyEnv.php',
|
'GuzzleHttp\\Handler\\ProxyEnv' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/ProxyEnv.php',
|
||||||
'GuzzleHttp\\Handler\\RequestFraming' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/RequestFraming.php',
|
'GuzzleHttp\\Handler\\RequestFraming' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/RequestFraming.php',
|
||||||
'GuzzleHttp\\Handler\\StreamHandler' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/StreamHandler.php',
|
'GuzzleHttp\\Handler\\StreamHandler' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/StreamHandler.php',
|
||||||
|
'GuzzleHttp\\Handler\\StreamTlsSessionCache' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/StreamTlsSessionCache.php',
|
||||||
'GuzzleHttp\\Handler\\Timeout' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/Timeout.php',
|
'GuzzleHttp\\Handler\\Timeout' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/Timeout.php',
|
||||||
'GuzzleHttp\\Handler\\TlsVersion' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/TlsVersion.php',
|
'GuzzleHttp\\Handler\\TlsVersion' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/TlsVersion.php',
|
||||||
'GuzzleHttp\\Handler\\TransferByteCounter' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/TransferByteCounter.php',
|
'GuzzleHttp\\Handler\\TransferByteCounter' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/TransferByteCounter.php',
|
||||||
|
'GuzzleHttp\\Handler\\UriDiagnostic' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/UriDiagnostic.php',
|
||||||
'GuzzleHttp\\HostIdentity' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/HostIdentity.php',
|
'GuzzleHttp\\HostIdentity' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/HostIdentity.php',
|
||||||
'GuzzleHttp\\Idn' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Idn.php',
|
'GuzzleHttp\\Idn' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Idn.php',
|
||||||
'GuzzleHttp\\MessageFormatter' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/MessageFormatter.php',
|
'GuzzleHttp\\MessageFormatter' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/MessageFormatter.php',
|
||||||
|
|
|
||||||
74
vendor/composer/installed.json
vendored
74
vendor/composer/installed.json
vendored
|
|
@ -59,17 +59,17 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "aws/aws-sdk-php",
|
"name": "aws/aws-sdk-php",
|
||||||
"version": "3.392.3",
|
"version": "3.393.4",
|
||||||
"version_normalized": "3.392.3.0",
|
"version_normalized": "3.393.4.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/aws/aws-sdk-php.git",
|
"url": "https://github.com/aws/aws-sdk-php.git",
|
||||||
"reference": "0ca19a44856b2497ae426f800d35ad97ee179d1a"
|
"reference": "a5880510e500aa0fe13a6410183cd222b3263890"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/0ca19a44856b2497ae426f800d35ad97ee179d1a",
|
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/a5880510e500aa0fe13a6410183cd222b3263890",
|
||||||
"reference": "0ca19a44856b2497ae426f800d35ad97ee179d1a",
|
"reference": "a5880510e500aa0fe13a6410183cd222b3263890",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -109,7 +109,7 @@
|
||||||
"ext-pcntl": "To use client-side monitoring",
|
"ext-pcntl": "To use client-side monitoring",
|
||||||
"ext-sockets": "To use client-side monitoring"
|
"ext-sockets": "To use client-side monitoring"
|
||||||
},
|
},
|
||||||
"time": "2026-08-14T18:11:43+00:00",
|
"time": "2026-08-21T18:24:57+00:00",
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
|
|
@ -153,29 +153,29 @@
|
||||||
"support": {
|
"support": {
|
||||||
"forum": "https://github.com/aws/aws-sdk-php/discussions",
|
"forum": "https://github.com/aws/aws-sdk-php/discussions",
|
||||||
"issues": "https://github.com/aws/aws-sdk-php/issues",
|
"issues": "https://github.com/aws/aws-sdk-php/issues",
|
||||||
"source": "https://github.com/aws/aws-sdk-php/tree/3.392.3"
|
"source": "https://github.com/aws/aws-sdk-php/tree/3.393.4"
|
||||||
},
|
},
|
||||||
"install-path": "../aws/aws-sdk-php"
|
"install-path": "../aws/aws-sdk-php"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "guzzlehttp/guzzle",
|
"name": "guzzlehttp/guzzle",
|
||||||
"version": "8.0.2",
|
"version": "8.1.0",
|
||||||
"version_normalized": "8.0.2.0",
|
"version_normalized": "8.1.0.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/guzzle/guzzle.git",
|
"url": "https://github.com/guzzle/guzzle.git",
|
||||||
"reference": "d1cbca76970939a9c2ced55b1e25ea26f34fc773"
|
"reference": "2cdae51a4a02c3fe2c38d42e25a7bb952e27b768"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/d1cbca76970939a9c2ced55b1e25ea26f34fc773",
|
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/2cdae51a4a02c3fe2c38d42e25a7bb952e27b768",
|
||||||
"reference": "d1cbca76970939a9c2ced55b1e25ea26f34fc773",
|
"reference": "2cdae51a4a02c3fe2c38d42e25a7bb952e27b768",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"ext-json": "*",
|
"ext-json": "*",
|
||||||
"guzzlehttp/promises": "^3.0.1",
|
"guzzlehttp/promises": "^3.0.2",
|
||||||
"guzzlehttp/psr7": "^3.0",
|
"guzzlehttp/psr7": "^3.1",
|
||||||
"php": "^7.4 || ^8.0",
|
"php": "^7.4 || ^8.0",
|
||||||
"psr/http-client": "^1.0",
|
"psr/http-client": "^1.0",
|
||||||
"psr/http-factory": "^1.0",
|
"psr/http-factory": "^1.0",
|
||||||
|
|
@ -199,7 +199,7 @@
|
||||||
"ext-intl": "Required for Internationalized Domain Name (IDN) support",
|
"ext-intl": "Required for Internationalized Domain Name (IDN) support",
|
||||||
"psr/log": "Required for using the Log middleware"
|
"psr/log": "Required for using the Log middleware"
|
||||||
},
|
},
|
||||||
"time": "2026-08-05T19:50:26+00:00",
|
"time": "2026-08-24T11:07:02+00:00",
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"bamarni-bin": {
|
"bamarni-bin": {
|
||||||
|
|
@ -268,7 +268,7 @@
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/guzzle/guzzle/issues",
|
"issues": "https://github.com/guzzle/guzzle/issues",
|
||||||
"source": "https://github.com/guzzle/guzzle/tree/8.0.2"
|
"source": "https://github.com/guzzle/guzzle/tree/8.1.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -288,17 +288,17 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "guzzlehttp/promises",
|
"name": "guzzlehttp/promises",
|
||||||
"version": "3.0.1",
|
"version": "3.0.2",
|
||||||
"version_normalized": "3.0.1.0",
|
"version_normalized": "3.0.2.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/guzzle/promises.git",
|
"url": "https://github.com/guzzle/promises.git",
|
||||||
"reference": "64f38b87fa7d371853804161bfc701c9bc2cc00a"
|
"reference": "42118e66a53c492effaf92bc357e931985d5c6f9"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/guzzle/promises/zipball/64f38b87fa7d371853804161bfc701c9bc2cc00a",
|
"url": "https://api.github.com/repos/guzzle/promises/zipball/42118e66a53c492effaf92bc357e931985d5c6f9",
|
||||||
"reference": "64f38b87fa7d371853804161bfc701c9bc2cc00a",
|
"reference": "42118e66a53c492effaf92bc357e931985d5c6f9",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -308,7 +308,7 @@
|
||||||
"bamarni/composer-bin-plugin": "^1.8.2",
|
"bamarni/composer-bin-plugin": "^1.8.2",
|
||||||
"phpunit/phpunit": "^9.6.34"
|
"phpunit/phpunit": "^9.6.34"
|
||||||
},
|
},
|
||||||
"time": "2026-08-05T19:35:04+00:00",
|
"time": "2026-08-24T10:00:26+00:00",
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"bamarni-bin": {
|
"bamarni-bin": {
|
||||||
|
|
@ -354,7 +354,7 @@
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/guzzle/promises/issues",
|
"issues": "https://github.com/guzzle/promises/issues",
|
||||||
"source": "https://github.com/guzzle/promises/tree/3.0.1"
|
"source": "https://github.com/guzzle/promises/tree/3.0.2"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -374,17 +374,17 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "guzzlehttp/psr7",
|
"name": "guzzlehttp/psr7",
|
||||||
"version": "3.0.0",
|
"version": "3.1.0",
|
||||||
"version_normalized": "3.0.0.0",
|
"version_normalized": "3.1.0.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/guzzle/psr7.git",
|
"url": "https://github.com/guzzle/psr7.git",
|
||||||
"reference": "b094ded77ee97a6027ad6cf0e8c7b9f88381814c"
|
"reference": "a3059ba1a84c9139c4ae03cf0f45bea276c97c74"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/guzzle/psr7/zipball/b094ded77ee97a6027ad6cf0e8c7b9f88381814c",
|
"url": "https://api.github.com/repos/guzzle/psr7/zipball/a3059ba1a84c9139c4ae03cf0f45bea276c97c74",
|
||||||
"reference": "b094ded77ee97a6027ad6cf0e8c7b9f88381814c",
|
"reference": "a3059ba1a84c9139c4ae03cf0f45bea276c97c74",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -408,7 +408,7 @@
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
|
"laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
|
||||||
},
|
},
|
||||||
"time": "2026-07-20T13:48:31+00:00",
|
"time": "2026-08-24T11:02:13+00:00",
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"bamarni-bin": {
|
"bamarni-bin": {
|
||||||
|
|
@ -476,7 +476,7 @@
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/guzzle/psr7/issues",
|
"issues": "https://github.com/guzzle/psr7/issues",
|
||||||
"source": "https://github.com/guzzle/psr7/tree/3.0.0"
|
"source": "https://github.com/guzzle/psr7/tree/3.1.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -808,17 +808,17 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/filesystem",
|
"name": "symfony/filesystem",
|
||||||
"version": "v8.1.2",
|
"version": "v8.1.5",
|
||||||
"version_normalized": "8.1.2.0",
|
"version_normalized": "8.1.5.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/filesystem.git",
|
"url": "https://github.com/symfony/filesystem.git",
|
||||||
"reference": "17856b7a222664a26a5ea1cb06ee0721c2438217"
|
"reference": "6b2f4a0eeb28b5d74f90862592923a654bc629b3"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/filesystem/zipball/17856b7a222664a26a5ea1cb06ee0721c2438217",
|
"url": "https://api.github.com/repos/symfony/filesystem/zipball/6b2f4a0eeb28b5d74f90862592923a654bc629b3",
|
||||||
"reference": "17856b7a222664a26a5ea1cb06ee0721c2438217",
|
"reference": "6b2f4a0eeb28b5d74f90862592923a654bc629b3",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -830,7 +830,7 @@
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"symfony/process": "^7.4|^8.0"
|
"symfony/process": "^7.4|^8.0"
|
||||||
},
|
},
|
||||||
"time": "2026-07-22T15:42:13+00:00",
|
"time": "2026-08-21T12:16:08+00:00",
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"installation-source": "dist",
|
"installation-source": "dist",
|
||||||
"autoload": {
|
"autoload": {
|
||||||
|
|
@ -858,7 +858,7 @@
|
||||||
"description": "Provides basic utilities for the filesystem",
|
"description": "Provides basic utilities for the filesystem",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/filesystem/tree/v8.1.2"
|
"source": "https://github.com/symfony/filesystem/tree/v8.1.5"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
|
||||||
34
vendor/composer/installed.php
vendored
34
vendor/composer/installed.php
vendored
|
|
@ -3,7 +3,7 @@
|
||||||
'name' => 'robotstxt/robotstxt-smtp-amazonses',
|
'name' => 'robotstxt/robotstxt-smtp-amazonses',
|
||||||
'pretty_version' => 'dev-main',
|
'pretty_version' => 'dev-main',
|
||||||
'version' => 'dev-main',
|
'version' => 'dev-main',
|
||||||
'reference' => '93d4bb9a81c0312101aa481dfc9024939d5f3f8d',
|
'reference' => 'b9acd96e5f784f4f7d6c26807a76adc62b05d0de',
|
||||||
'type' => 'wordpress-plugin',
|
'type' => 'wordpress-plugin',
|
||||||
'install_path' => __DIR__ . '/../../',
|
'install_path' => __DIR__ . '/../../',
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
|
|
@ -20,36 +20,36 @@
|
||||||
'dev_requirement' => false,
|
'dev_requirement' => false,
|
||||||
),
|
),
|
||||||
'aws/aws-sdk-php' => array(
|
'aws/aws-sdk-php' => array(
|
||||||
'pretty_version' => '3.392.3',
|
'pretty_version' => '3.393.4',
|
||||||
'version' => '3.392.3.0',
|
'version' => '3.393.4.0',
|
||||||
'reference' => '0ca19a44856b2497ae426f800d35ad97ee179d1a',
|
'reference' => 'a5880510e500aa0fe13a6410183cd222b3263890',
|
||||||
'type' => 'library',
|
'type' => 'library',
|
||||||
'install_path' => __DIR__ . '/../aws/aws-sdk-php',
|
'install_path' => __DIR__ . '/../aws/aws-sdk-php',
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
'dev_requirement' => false,
|
'dev_requirement' => false,
|
||||||
),
|
),
|
||||||
'guzzlehttp/guzzle' => array(
|
'guzzlehttp/guzzle' => array(
|
||||||
'pretty_version' => '8.0.2',
|
'pretty_version' => '8.1.0',
|
||||||
'version' => '8.0.2.0',
|
'version' => '8.1.0.0',
|
||||||
'reference' => 'd1cbca76970939a9c2ced55b1e25ea26f34fc773',
|
'reference' => '2cdae51a4a02c3fe2c38d42e25a7bb952e27b768',
|
||||||
'type' => 'library',
|
'type' => 'library',
|
||||||
'install_path' => __DIR__ . '/../guzzlehttp/guzzle',
|
'install_path' => __DIR__ . '/../guzzlehttp/guzzle',
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
'dev_requirement' => false,
|
'dev_requirement' => false,
|
||||||
),
|
),
|
||||||
'guzzlehttp/promises' => array(
|
'guzzlehttp/promises' => array(
|
||||||
'pretty_version' => '3.0.1',
|
'pretty_version' => '3.0.2',
|
||||||
'version' => '3.0.1.0',
|
'version' => '3.0.2.0',
|
||||||
'reference' => '64f38b87fa7d371853804161bfc701c9bc2cc00a',
|
'reference' => '42118e66a53c492effaf92bc357e931985d5c6f9',
|
||||||
'type' => 'library',
|
'type' => 'library',
|
||||||
'install_path' => __DIR__ . '/../guzzlehttp/promises',
|
'install_path' => __DIR__ . '/../guzzlehttp/promises',
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
'dev_requirement' => false,
|
'dev_requirement' => false,
|
||||||
),
|
),
|
||||||
'guzzlehttp/psr7' => array(
|
'guzzlehttp/psr7' => array(
|
||||||
'pretty_version' => '3.0.0',
|
'pretty_version' => '3.1.0',
|
||||||
'version' => '3.0.0.0',
|
'version' => '3.1.0.0',
|
||||||
'reference' => 'b094ded77ee97a6027ad6cf0e8c7b9f88381814c',
|
'reference' => 'a3059ba1a84c9139c4ae03cf0f45bea276c97c74',
|
||||||
'type' => 'library',
|
'type' => 'library',
|
||||||
'install_path' => __DIR__ . '/../guzzlehttp/psr7',
|
'install_path' => __DIR__ . '/../guzzlehttp/psr7',
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
|
|
@ -112,7 +112,7 @@
|
||||||
'robotstxt/robotstxt-smtp-amazonses' => array(
|
'robotstxt/robotstxt-smtp-amazonses' => array(
|
||||||
'pretty_version' => 'dev-main',
|
'pretty_version' => 'dev-main',
|
||||||
'version' => 'dev-main',
|
'version' => 'dev-main',
|
||||||
'reference' => '93d4bb9a81c0312101aa481dfc9024939d5f3f8d',
|
'reference' => 'b9acd96e5f784f4f7d6c26807a76adc62b05d0de',
|
||||||
'type' => 'wordpress-plugin',
|
'type' => 'wordpress-plugin',
|
||||||
'install_path' => __DIR__ . '/../../',
|
'install_path' => __DIR__ . '/../../',
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
|
|
@ -128,9 +128,9 @@
|
||||||
'dev_requirement' => false,
|
'dev_requirement' => false,
|
||||||
),
|
),
|
||||||
'symfony/filesystem' => array(
|
'symfony/filesystem' => array(
|
||||||
'pretty_version' => 'v8.1.2',
|
'pretty_version' => 'v8.1.5',
|
||||||
'version' => '8.1.2.0',
|
'version' => '8.1.5.0',
|
||||||
'reference' => '17856b7a222664a26a5ea1cb06ee0721c2438217',
|
'reference' => '6b2f4a0eeb28b5d74f90862592923a654bc629b3',
|
||||||
'type' => 'library',
|
'type' => 'library',
|
||||||
'install_path' => __DIR__ . '/../symfony/filesystem',
|
'install_path' => __DIR__ . '/../symfony/filesystem',
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
|
|
|
||||||
26
vendor/guzzlehttp/guzzle/CHANGELOG.md
vendored
26
vendor/guzzlehttp/guzzle/CHANGELOG.md
vendored
|
|
@ -3,6 +3,32 @@
|
||||||
Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version.
|
Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version.
|
||||||
|
|
||||||
|
|
||||||
|
## 8.1.0 - Upcoming
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add PHP 8.6+ stream TLS session sharing, while persistent sharing remains cURL-only
|
||||||
|
- Add support for PHP 8.6
|
||||||
|
- Add in-transfer resends of seekable streamed uploads when PHP exposes `CURLOPT_SEEKFUNCTION`
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Adjusted `guzzlehttp/promises` version constraint to `^3.0.2`
|
||||||
|
- Adjusted `guzzlehttp/psr7` version constraint to `^3.1`
|
||||||
|
- Classify stream handler transport failures using PHP 8.6+ structured stream error codes
|
||||||
|
- Hide URI credentials, queries, and fragments in automatic exception messages
|
||||||
|
- Match `no_proxy` rules against IPv4 hosts written in the shorthand a transport reads as an address
|
||||||
|
- Hold the cURL easy handle out of the reuse pool until a silent retry has been dispatched
|
||||||
|
- Treat a deferred resolved with a pending retry promise as progress when waiting on cURL transfers
|
||||||
|
|
||||||
|
|
||||||
|
## 8.0.3 - 2026-08-24
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Adjusted `guzzlehttp/psr7` version constraint to `^3.0.1`
|
||||||
|
|
||||||
|
|
||||||
## 8.0.2 - 2026-08-05
|
## 8.0.2 - 2026-08-05
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
|
||||||
4
vendor/guzzlehttp/guzzle/README.md
vendored
4
vendor/guzzlehttp/guzzle/README.md
vendored
|
|
@ -30,8 +30,8 @@ composer require guzzlehttp/guzzle
|
||||||
|
|
||||||
| Version | Status | PHP Version |
|
| Version | Status | PHP Version |
|
||||||
|---------|--------------|--------------|
|
|---------|--------------|--------------|
|
||||||
| 8.0 | Latest | >=7.4,<8.6 |
|
| 8.1 | Latest | >=7.4,<8.7 |
|
||||||
| 7.15 | Maintenance | >=7.2.5,<8.6 |
|
| 7.15 | Maintenance | >=7.2.5,<8.7 |
|
||||||
| 6.5 | End of Life | >=5.5,<8.0 |
|
| 6.5 | End of Life | >=5.5,<8.0 |
|
||||||
|
|
||||||
## Quick Start
|
## Quick Start
|
||||||
|
|
|
||||||
6
vendor/guzzlehttp/guzzle/src/Client.php
vendored
6
vendor/guzzlehttp/guzzle/src/Client.php
vendored
|
|
@ -199,8 +199,10 @@ class Client implements ClientInterface, \Psr\Http\Client\ClientInterface
|
||||||
throw new InvalidArgumentException('handler must be a callable');
|
throw new InvalidArgumentException('handler must be a callable');
|
||||||
} elseif ($handlerOptions !== []) {
|
} elseif ($handlerOptions !== []) {
|
||||||
throw new InvalidArgumentException('The "max_host_connections" and "max_total_connections" client options require Guzzle to create the default handler. Configure the options on the CurlMultiHandler constructor for numeric enforcement, or on the StreamHandler constructor to reject enabled response streaming, when providing a custom handler.');
|
throw new InvalidArgumentException('The "max_host_connections" and "max_total_connections" client options require Guzzle to create the default handler. Configure the options on the CurlMultiHandler constructor for numeric enforcement, or on the StreamHandler constructor to reject enabled response streaming, when providing a custom handler.');
|
||||||
} elseif (\in_array($transportSharingMode, [TransportSharing::HANDLER_REQUIRE, TransportSharing::PERSISTENT_REQUIRE], true)) {
|
} elseif ($transportSharingMode === TransportSharing::HANDLER_REQUIRE) {
|
||||||
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.');
|
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, CurlMultiHandler, or StreamHandler when providing a custom handler.');
|
||||||
|
} elseif ($transportSharingMode === TransportSharing::PERSISTENT_REQUIRE) {
|
||||||
|
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 handler.');
|
||||||
}
|
}
|
||||||
|
|
||||||
$factory = new HttpFactory();
|
$factory = new HttpFactory();
|
||||||
|
|
|
||||||
|
|
@ -60,14 +60,14 @@ class RequestException extends TransferException implements RequestExceptionInte
|
||||||
$label = 'Unsuccessful request';
|
$label = 'Unsuccessful request';
|
||||||
}
|
}
|
||||||
|
|
||||||
$uri = \GuzzleHttp\Psr7\Utils::redactUserInfo($request->getUri());
|
$uri = \GuzzleHttp\Psr7\Utils::redactUriForMessage($request->getUri());
|
||||||
|
|
||||||
// Client error: `GET /` resulted in a `404 Not Found` response: <html> ... (truncated)
|
// Client error: `GET /` resulted in a `404 Not Found` response: <html> ... (truncated)
|
||||||
$message = \sprintf(
|
$message = \sprintf(
|
||||||
'%s: `%s %s` resulted in a `%s %s` response',
|
'%s: `%s %s` resulted in a `%s %s` response',
|
||||||
$label,
|
$label,
|
||||||
DiagnosticValue::escape($request->getMethod()),
|
DiagnosticValue::escape($request->getMethod()),
|
||||||
DiagnosticValue::escape($uri->__toString()),
|
$uri,
|
||||||
$response->getStatusCode(),
|
$response->getStatusCode(),
|
||||||
DiagnosticValue::escape($response->getReasonPhrase())
|
DiagnosticValue::escape($response->getReasonPhrase())
|
||||||
);
|
);
|
||||||
|
|
|
||||||
202
vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php
vendored
202
vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php
vendored
|
|
@ -110,6 +110,26 @@ final class CurlFactory implements CurlFactoryInterface
|
||||||
*/
|
*/
|
||||||
private const CURL_READFUNC_ABORT = 0x10000000;
|
private const CURL_READFUNC_ABORT = 0x10000000;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* libcurl's CURL_SEEKFUNC_OK value.
|
||||||
|
*/
|
||||||
|
private const CURL_SEEKFUNC_OK = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* libcurl's CURL_SEEKFUNC_FAIL value.
|
||||||
|
*/
|
||||||
|
private const CURL_SEEKFUNC_FAIL = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* libcurl's CURL_SEEKFUNC_CANTSEEK value.
|
||||||
|
*/
|
||||||
|
private const CURL_SEEKFUNC_CANTSEEK = 2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maximum number of times libcurl may replay a streamed request body.
|
||||||
|
*/
|
||||||
|
private const CURL_SEEK_MAX_REPLAYS = 3;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* libcurl's CURLE_SEND_FAIL_REWIND value.
|
* libcurl's CURLE_SEND_FAIL_REWIND value.
|
||||||
*/
|
*/
|
||||||
|
|
@ -372,6 +392,7 @@ final class CurlFactory implements CurlFactoryInterface
|
||||||
* @param array<int|string, mixed> $conf
|
* @param array<int|string, mixed> $conf
|
||||||
*/
|
*/
|
||||||
private function applyCurlOptions(
|
private function applyCurlOptions(
|
||||||
|
#[\SensitiveParameter]
|
||||||
$handle,
|
$handle,
|
||||||
#[\SensitiveParameter]
|
#[\SensitiveParameter]
|
||||||
array $conf
|
array $conf
|
||||||
|
|
@ -712,6 +733,7 @@ final class CurlFactory implements CurlFactoryInterface
|
||||||
self::addConflictingCurlOption($options, 'CURLOPT_UPLOAD', 'the request body');
|
self::addConflictingCurlOption($options, 'CURLOPT_UPLOAD', 'the request body');
|
||||||
self::addConflictingCurlOption($options, 'CURLOPT_POSTFIELDS', 'the request body');
|
self::addConflictingCurlOption($options, 'CURLOPT_POSTFIELDS', 'the request body');
|
||||||
self::addConflictingCurlOption($options, 'CURLOPT_READFUNCTION', 'the request body');
|
self::addConflictingCurlOption($options, 'CURLOPT_READFUNCTION', 'the request body');
|
||||||
|
self::addConflictingCurlOption($options, 'CURLOPT_SEEKFUNCTION', 'the request body');
|
||||||
self::addConflictingCurlOption($options, 'CURLOPT_READDATA', 'the request body');
|
self::addConflictingCurlOption($options, 'CURLOPT_READDATA', 'the request body');
|
||||||
self::addConflictingCurlOption($options, 'CURLOPT_INFILE', 'the request body');
|
self::addConflictingCurlOption($options, 'CURLOPT_INFILE', 'the request body');
|
||||||
self::addConflictingCurlOption($options, 'CURLOPT_INFILESIZE', 'the request body');
|
self::addConflictingCurlOption($options, 'CURLOPT_INFILESIZE', 'the request body');
|
||||||
|
|
@ -952,8 +974,10 @@ final class CurlFactory implements CurlFactoryInterface
|
||||||
/**
|
/**
|
||||||
* @param resource|\CurlHandle $handle
|
* @param resource|\CurlHandle $handle
|
||||||
*/
|
*/
|
||||||
private function discardHandle($handle): void
|
private function discardHandle(
|
||||||
{
|
#[\SensitiveParameter]
|
||||||
|
$handle
|
||||||
|
): void {
|
||||||
$failure = null;
|
$failure = null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
@ -980,8 +1004,10 @@ final class CurlFactory implements CurlFactoryInterface
|
||||||
/**
|
/**
|
||||||
* @param resource|\CurlHandle $handle
|
* @param resource|\CurlHandle $handle
|
||||||
*/
|
*/
|
||||||
private function clearEasyHandleCallbacks($handle): void
|
private function clearEasyHandleCallbacks(
|
||||||
{
|
#[\SensitiveParameter]
|
||||||
|
$handle
|
||||||
|
): void {
|
||||||
curl_setopt($handle, \CURLOPT_HEADERFUNCTION, null);
|
curl_setopt($handle, \CURLOPT_HEADERFUNCTION, null);
|
||||||
curl_setopt($handle, \CURLOPT_READFUNCTION, null);
|
curl_setopt($handle, \CURLOPT_READFUNCTION, null);
|
||||||
curl_setopt($handle, \CURLOPT_WRITEFUNCTION, null);
|
curl_setopt($handle, \CURLOPT_WRITEFUNCTION, null);
|
||||||
|
|
@ -991,6 +1017,10 @@ final class CurlFactory implements CurlFactoryInterface
|
||||||
curl_setopt($handle, (int) \constant('CURLOPT_PREREQFUNCTION'), null);
|
curl_setopt($handle, (int) \constant('CURLOPT_PREREQFUNCTION'), null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (\defined('CURLOPT_SEEKFUNCTION')) {
|
||||||
|
curl_setopt($handle, (int) \constant('CURLOPT_SEEKFUNCTION'), null);
|
||||||
|
}
|
||||||
|
|
||||||
if (\defined('CURLOPT_XFERINFOFUNCTION')) {
|
if (\defined('CURLOPT_XFERINFOFUNCTION')) {
|
||||||
curl_setopt($handle, (int) \constant('CURLOPT_XFERINFOFUNCTION'), null);
|
curl_setopt($handle, (int) \constant('CURLOPT_XFERINFOFUNCTION'), null);
|
||||||
}
|
}
|
||||||
|
|
@ -1136,21 +1166,39 @@ final class CurlFactory implements CurlFactoryInterface
|
||||||
): PromiseInterface {
|
): PromiseInterface {
|
||||||
// Get error information and release the handle to the factory.
|
// Get error information and release the handle to the factory.
|
||||||
$ctx = self::createErrorContext($easy);
|
$ctx = self::createErrorContext($easy);
|
||||||
|
|
||||||
|
if (self::shouldRetryFailedRewind($easy)) {
|
||||||
|
// Release after dispatching the retry so the replacement
|
||||||
|
// transfer cannot reuse this native handle ID.
|
||||||
|
try {
|
||||||
|
if ($onStats !== null && $stats !== null) {
|
||||||
|
$onStats($stats);
|
||||||
|
}
|
||||||
|
|
||||||
|
return self::retryFailedRewind($handler, $easy, $ctx);
|
||||||
|
} finally {
|
||||||
|
$factory->release($easy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$factory->release($easy);
|
$factory->release($easy);
|
||||||
|
|
||||||
if ($onStats !== null && $stats !== null) {
|
if ($onStats !== null && $stats !== null) {
|
||||||
$onStats($stats);
|
$onStats($stats);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (self::shouldRetryFailedRewind($easy)) {
|
if (self::isResponseRewindFailure($easy)) {
|
||||||
return self::retryFailedRewind($handler, $easy, $ctx);
|
$status = $easy->response !== null ? $easy->response->getStatusCode() : 0;
|
||||||
}
|
$ctx['error'] = $status === 401 || $status === 407
|
||||||
|
? 'The server issued an authentication challenge '
|
||||||
if (self::isChallengeRewindFailure($easy)) {
|
|
||||||
$ctx['error'] = 'The server issued an authentication challenge '
|
|
||||||
.'after the request body had already been sent, and the body '
|
.'after the request body had already been sent, and the body '
|
||||||
.'could not be rewound to resend it. The request was not '
|
.'could not be rewound to resend it. The request was not '
|
||||||
.'retried because a retry replays the same challenge. See '
|
.'retried because a retry replays the same challenge. See '
|
||||||
|
.'https://bugs.php.net/bug.php?id=47204 for more information.'
|
||||||
|
: 'The server responded after the request body had already '
|
||||||
|
.'been sent, and the body could not be rewound for '
|
||||||
|
.'libcurl\'s automatic retry. The request was not retried '
|
||||||
|
.'because a retry replays the same response. See '
|
||||||
.'https://bugs.php.net/bug.php?id=47204 for more information.';
|
.'https://bugs.php.net/bug.php?id=47204 for more information.';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1167,6 +1215,8 @@ final class CurlFactory implements CurlFactoryInterface
|
||||||
private static function hasLocalFailure(EasyHandle $easy): bool
|
private static function hasLocalFailure(EasyHandle $easy): bool
|
||||||
{
|
{
|
||||||
return $easy->bodyReadTimeoutException !== null
|
return $easy->bodyReadTimeoutException !== null
|
||||||
|
|| $easy->bodyRewindTimeoutException !== null
|
||||||
|
|| $easy->bodyRewindException !== null
|
||||||
|| $easy->bodyReadException !== null
|
|| $easy->bodyReadException !== null
|
||||||
|| $easy->responseHeaderException !== null
|
|| $easy->responseHeaderException !== null
|
||||||
|| $easy->sinkWriteTimeoutException !== null
|
|| $easy->sinkWriteTimeoutException !== null
|
||||||
|
|
@ -1181,10 +1231,10 @@ final class CurlFactory implements CurlFactoryInterface
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (self::isChallengeRewindFailure($easy)) {
|
if (self::isResponseRewindFailure($easy)) {
|
||||||
// Re-issuing the identical request replays the same challenge and
|
// Re-issuing the identical request replays the same response and
|
||||||
// the same in-transfer rewind, so retrying is futile and the
|
// the same in-transfer rewind, so retrying is futile and the
|
||||||
// challenge response is surfaced instead.
|
// received response is surfaced instead.
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1192,9 +1242,10 @@ final class CurlFactory implements CurlFactoryInterface
|
||||||
//
|
//
|
||||||
// - errno === CURLE_SEND_FAIL_REWIND (65): libcurl needed to rewind an
|
// - errno === CURLE_SEND_FAIL_REWIND (65): libcurl needed to rewind an
|
||||||
// already-partially-sent upload to resend it on a reused connection
|
// already-partially-sent upload to resend it on a reused connection
|
||||||
// that died before any response arrived, but could not, because PHP
|
// that died before any response arrived, but could not. PHP builds
|
||||||
// registers no seek callback for a streamed request body. See
|
// without CURLOPT_SEEKFUNCTION register no seek callback for a
|
||||||
// https://bugs.php.net/bug.php?id=47204.
|
// streamed request body (https://bugs.php.net/bug.php?id=47204);
|
||||||
|
// builds with it can still report 65 when the body is not seekable.
|
||||||
//
|
//
|
||||||
// - errno === 0: libcurl reported success yet no usable response
|
// - errno === 0: libcurl reported success yet no usable response
|
||||||
// reached us. This is the legacy curl_multi silent-failure variant of
|
// reached us. This is the legacy curl_multi silent-failure variant of
|
||||||
|
|
@ -1207,13 +1258,15 @@ final class CurlFactory implements CurlFactoryInterface
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether the transfer failed because libcurl could not rewind the
|
* Whether the transfer failed because libcurl could not rewind the
|
||||||
* request body to resend it in reply to a challenge response, such as a
|
* request body to resend it in reply to a response, such as a 401 or
|
||||||
* 401 or 407 during multi-pass authentication. libcurl's only other
|
* 407 during multi-pass authentication, or a 417 that makes libcurl
|
||||||
* rewind triggers are followed redirects, which the built-in handlers
|
* retry an Expect: 100-continue upload without the expectation. Rewinds
|
||||||
* never enable, and reused connections that died, which cannot have
|
* for replays that follow no response, such as a reused connection that
|
||||||
* produced a response.
|
* died or a refused HTTP/2 stream, retry through
|
||||||
|
* shouldRetryFailedRewind() instead. Followed redirects also rewind,
|
||||||
|
* but the built-in handlers never enable them.
|
||||||
*/
|
*/
|
||||||
private static function isChallengeRewindFailure(EasyHandle $easy): bool
|
private static function isResponseRewindFailure(EasyHandle $easy): bool
|
||||||
{
|
{
|
||||||
return $easy->errno === self::CURLE_SEND_FAIL_REWIND
|
return $easy->errno === self::CURLE_SEND_FAIL_REWIND
|
||||||
&& $easy->response !== null
|
&& $easy->response !== null
|
||||||
|
|
@ -1283,6 +1336,23 @@ final class CurlFactory implements CurlFactoryInterface
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($easy->bodyRewindTimeoutException) {
|
||||||
|
// Rewinding the request body stalled, which is a caller-stream failure.
|
||||||
|
return self::createRequestOrResponseRejection(
|
||||||
|
$easy,
|
||||||
|
'Timed out while rewinding the request body',
|
||||||
|
$easy->bodyRewindTimeoutException
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($easy->bodyRewindException) {
|
||||||
|
$message = $easy->bodyRewindException->getMessage() !== ''
|
||||||
|
? $easy->bodyRewindException->getMessage()
|
||||||
|
: 'Failed to rewind the request body';
|
||||||
|
|
||||||
|
return self::createRequestOrResponseRejection($easy, $message, $easy->bodyRewindException);
|
||||||
|
}
|
||||||
|
|
||||||
if ($easy->bodyReadException) {
|
if ($easy->bodyReadException) {
|
||||||
$message = $easy->bodyReadException->getMessage() !== ''
|
$message = $easy->bodyReadException->getMessage() !== ''
|
||||||
? $easy->bodyReadException->getMessage()
|
? $easy->bodyReadException->getMessage()
|
||||||
|
|
@ -1340,9 +1410,9 @@ final class CurlFactory implements CurlFactoryInterface
|
||||||
);
|
);
|
||||||
|
|
||||||
if ('' !== $sanitizedError) {
|
if ('' !== $sanitizedError) {
|
||||||
$redactedUriString = Psr7\DiagnosticValue::escape(Psr7\Utils::redactUserInfo($uri)->__toString());
|
$safeUri = Psr7\Utils::redactUriForMessage($uri);
|
||||||
if ($redactedUriString !== '' && false === \strpos($sanitizedError, $redactedUriString)) {
|
if ($safeUri !== '' && false === \strpos($sanitizedError, $safeUri)) {
|
||||||
$message .= \sprintf(' for %s', $redactedUriString);
|
$message .= \sprintf(' for %s', $safeUri);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1440,15 +1510,7 @@ final class CurlFactory implements CurlFactoryInterface
|
||||||
|
|
||||||
$error = self::redactProxyUserInfo($error, $proxy);
|
$error = self::redactProxyUserInfo($error, $proxy);
|
||||||
|
|
||||||
$baseUri = $uri->withQuery('')->withFragment('');
|
return UriDiagnostic::redactInMessage($error, $uri);
|
||||||
$baseUriString = $baseUri->__toString();
|
|
||||||
|
|
||||||
if ('' !== $baseUriString) {
|
|
||||||
$redactedUriString = Psr7\Utils::redactUserInfo($baseUri)->__toString();
|
|
||||||
$error = str_replace($baseUriString, $redactedUriString, $error);
|
|
||||||
}
|
|
||||||
|
|
||||||
return Psr7\DiagnosticValue::escape($error);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static function redactProxyUserInfo(
|
private static function redactProxyUserInfo(
|
||||||
|
|
@ -2242,6 +2304,9 @@ final class CurlFactory implements CurlFactoryInterface
|
||||||
$conf[\CURLOPT_FILE],
|
$conf[\CURLOPT_FILE],
|
||||||
$conf[\CURLOPT_INFILE]
|
$conf[\CURLOPT_INFILE]
|
||||||
);
|
);
|
||||||
|
if (\defined('CURLOPT_SEEKFUNCTION')) {
|
||||||
|
unset($conf[(int) \constant('CURLOPT_SEEKFUNCTION')]);
|
||||||
|
}
|
||||||
if (\trim($easy->request->getHeaderLine('Content-Length'), " \n\r\t\0\x0B") !== '0') {
|
if (\trim($easy->request->getHeaderLine('Content-Length'), " \n\r\t\0\x0B") !== '0') {
|
||||||
$this->removeHeader('Content-Length', $conf);
|
$this->removeHeader('Content-Length', $conf);
|
||||||
}
|
}
|
||||||
|
|
@ -2301,7 +2366,13 @@ final class CurlFactory implements CurlFactoryInterface
|
||||||
* @return int|string
|
* @return int|string
|
||||||
*/
|
*/
|
||||||
$remaining = $contentLength;
|
$remaining = $contentLength;
|
||||||
$conf[\CURLOPT_READFUNCTION] = static function ($ch, $fd, int $length) use ($easy, $body, &$remaining) {
|
$conf[\CURLOPT_READFUNCTION] = static function (
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
$ch,
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
$fd,
|
||||||
|
int $length
|
||||||
|
) use ($easy, $body, &$remaining) {
|
||||||
if ($remaining === 0) {
|
if ($remaining === 0) {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
@ -2339,6 +2410,56 @@ final class CurlFactory implements CurlFactoryInterface
|
||||||
|
|
||||||
return $data;
|
return $data;
|
||||||
};
|
};
|
||||||
|
if (\defined('CURLOPT_SEEKFUNCTION')) {
|
||||||
|
// Give libcurl a seek callback so it can reposition the
|
||||||
|
// streamed upload itself when a transfer must resend the body
|
||||||
|
// (multi-pass auth such as NTLM/Negotiate, or a reused
|
||||||
|
// connection that died) instead of failing with
|
||||||
|
// CURLE_SEND_FAIL_REWIND. See
|
||||||
|
// https://bugs.php.net/bug.php?id=47204. A failed seek is
|
||||||
|
// recorded so the rejection carries the caller's exception
|
||||||
|
// and the failed-rewind retry does not fire.
|
||||||
|
$successfulSeeks = 0;
|
||||||
|
$conf[(int) \constant('CURLOPT_SEEKFUNCTION')] = static function (
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
$ch,
|
||||||
|
int $offset,
|
||||||
|
int $origin
|
||||||
|
) use ($easy, $body, $contentLength, &$remaining, &$successfulSeeks): int {
|
||||||
|
if ($origin !== \SEEK_SET) {
|
||||||
|
return self::CURL_SEEKFUNC_CANTSEEK;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (!$body->isSeekable()) {
|
||||||
|
return self::CURL_SEEKFUNC_CANTSEEK;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($offset < 0 || ($contentLength !== null && $offset > $contentLength)) {
|
||||||
|
throw new \RuntimeException('Request body seek offset is outside the declared Content-Length');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($successfulSeeks >= self::CURL_SEEK_MAX_REPLAYS) {
|
||||||
|
throw new \RuntimeException(\sprintf('Request body cannot be replayed more than %d times', self::CURL_SEEK_MAX_REPLAYS));
|
||||||
|
}
|
||||||
|
|
||||||
|
$body->seek($offset, \SEEK_SET);
|
||||||
|
} catch (TimeoutException $e) {
|
||||||
|
$easy->bodyRewindTimeoutException = $e;
|
||||||
|
|
||||||
|
return self::CURL_SEEKFUNC_FAIL;
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
$easy->bodyRewindException = $e;
|
||||||
|
|
||||||
|
return self::CURL_SEEKFUNC_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
$remaining = $contentLength === null ? null : $contentLength - $offset;
|
||||||
|
++$successfulSeeks;
|
||||||
|
|
||||||
|
return self::CURL_SEEKFUNC_OK;
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the Expect header is not present, prevent curl from adding it
|
// If the Expect header is not present, prevent curl from adding it
|
||||||
|
|
@ -2692,11 +2813,12 @@ final class CurlFactory implements CurlFactoryInterface
|
||||||
/** @var (callable(int, int, int, int): mixed)|null $progress */
|
/** @var (callable(int, int, int, int): mixed)|null $progress */
|
||||||
$conf[\CURLOPT_NOPROGRESS] = false;
|
$conf[\CURLOPT_NOPROGRESS] = false;
|
||||||
$progressCallback = static function ($resource, $downloadSize, $downloaded, $uploadSize, $uploaded) use ($easy, $progress): int {
|
$progressCallback = static function ($resource, $downloadSize, $downloaded, $uploadSize, $uploaded) use ($easy, $progress): int {
|
||||||
// Abort the transfer when the request body read failed (the
|
// Abort the transfer when the request body read or rewind
|
||||||
// cross-version abort path, since older PHP ignores the read
|
// failed (the cross-version abort path, since older PHP
|
||||||
// callback's return). progressAborted is left unset so the
|
// ignores the read callback's return). progressAborted is left
|
||||||
// failure is classified from the stored request-body exception.
|
// unset so the failure is classified from the stored
|
||||||
if ($easy->bodyReadTimeoutException !== null || $easy->bodyReadException !== null) {
|
// request-body exception.
|
||||||
|
if ($easy->bodyReadTimeoutException !== null || $easy->bodyRewindTimeoutException !== null || $easy->bodyRewindException !== null || $easy->bodyReadException !== null) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -319,7 +319,7 @@ final class CurlMultiHandler
|
||||||
|
|
||||||
// Never null: assigned below before any wait can invoke this.
|
// Never null: assigned below before any wait can invoke this.
|
||||||
/** @var Promise<ResponseInterface, mixed> $promise */
|
/** @var Promise<ResponseInterface, mixed> $promise */
|
||||||
if (!P\Is::pending($promise)) {
|
if ($easy->deferredSettled || !P\Is::pending($promise)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1328,8 +1328,10 @@ final class CurlMultiHandler
|
||||||
/**
|
/**
|
||||||
* @param resource|\CurlHandle $handle
|
* @param resource|\CurlHandle $handle
|
||||||
*/
|
*/
|
||||||
private function clearEasyHandleCallbacks($handle): void
|
private function clearEasyHandleCallbacks(
|
||||||
{
|
#[\SensitiveParameter]
|
||||||
|
$handle
|
||||||
|
): void {
|
||||||
curl_setopt($handle, \CURLOPT_HEADERFUNCTION, null);
|
curl_setopt($handle, \CURLOPT_HEADERFUNCTION, null);
|
||||||
curl_setopt($handle, \CURLOPT_READFUNCTION, null);
|
curl_setopt($handle, \CURLOPT_READFUNCTION, null);
|
||||||
curl_setopt($handle, \CURLOPT_WRITEFUNCTION, null);
|
curl_setopt($handle, \CURLOPT_WRITEFUNCTION, null);
|
||||||
|
|
@ -1339,6 +1341,10 @@ final class CurlMultiHandler
|
||||||
curl_setopt($handle, (int) \constant('CURLOPT_PREREQFUNCTION'), null);
|
curl_setopt($handle, (int) \constant('CURLOPT_PREREQFUNCTION'), null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (\defined('CURLOPT_SEEKFUNCTION')) {
|
||||||
|
curl_setopt($handle, (int) \constant('CURLOPT_SEEKFUNCTION'), null);
|
||||||
|
}
|
||||||
|
|
||||||
if (\defined('CURLOPT_XFERINFOFUNCTION')) {
|
if (\defined('CURLOPT_XFERINFOFUNCTION')) {
|
||||||
curl_setopt($handle, (int) \constant('CURLOPT_XFERINFOFUNCTION'), null);
|
curl_setopt($handle, (int) \constant('CURLOPT_XFERINFOFUNCTION'), null);
|
||||||
}
|
}
|
||||||
|
|
@ -1347,8 +1353,11 @@ final class CurlMultiHandler
|
||||||
/**
|
/**
|
||||||
* @param resource|\CurlHandle $handle
|
* @param resource|\CurlHandle $handle
|
||||||
*/
|
*/
|
||||||
private function removeHandleFromMulti(int $id, $handle): void
|
private function removeHandleFromMulti(
|
||||||
{
|
int $id,
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
$handle
|
||||||
|
): void {
|
||||||
// Removing a still-running transfer performs a final progress update
|
// Removing a still-running transfer performs a final progress update
|
||||||
// that can run a user progress callback, so removal is guarded like
|
// that can run a user progress callback, so removal is guarded like
|
||||||
// native execution.
|
// native execution.
|
||||||
|
|
@ -1530,6 +1539,7 @@ final class CurlMultiHandler
|
||||||
$result = CurlFactory::finish($this, $entry['easy'], $this->factory);
|
$result = CurlFactory::finish($this, $entry['easy'], $this->factory);
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
if (P\Is::pending($entry['deferred'])) {
|
if (P\Is::pending($entry['deferred'])) {
|
||||||
|
$entry['easy']->deferredSettled = true;
|
||||||
$entry['deferred']->reject($e);
|
$entry['deferred']->reject($e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1537,6 +1547,7 @@ final class CurlMultiHandler
|
||||||
}
|
}
|
||||||
|
|
||||||
if (P\Is::pending($entry['deferred'])) {
|
if (P\Is::pending($entry['deferred'])) {
|
||||||
|
$entry['easy']->deferredSettled = true;
|
||||||
$entry['deferred']->resolve($result);
|
$entry['deferred']->resolve($result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -106,6 +106,24 @@ final class CurlShareHandleState
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether cURL can share both the DNS and SSL session cache state that
|
||||||
|
* required handler-lifetime sharing needs, checked without configuring a
|
||||||
|
* share handle so default handler selection can fall back to the stream
|
||||||
|
* handler instead.
|
||||||
|
*/
|
||||||
|
public static function supportsHandlerRequireShare(): bool
|
||||||
|
{
|
||||||
|
return CurlVersion::supportsHandlerSharing()
|
||||||
|
&& CurlVersion::supportsSslSessionSharing()
|
||||||
|
&& \function_exists('curl_share_init')
|
||||||
|
&& \function_exists('curl_share_setopt')
|
||||||
|
&& \defined('CURLOPT_SHARE')
|
||||||
|
&& \defined('CURLSHOPT_SHARE')
|
||||||
|
&& \defined('CURL_LOCK_DATA_DNS')
|
||||||
|
&& \defined('CURL_LOCK_DATA_SSL_SESSION');
|
||||||
|
}
|
||||||
|
|
||||||
private static function createHandlerShareOrNull(string $mode): ?self
|
private static function createHandlerShareOrNull(string $mode): ?self
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,12 @@ final class EasyHandle
|
||||||
*/
|
*/
|
||||||
public bool $usesPipewait = false;
|
public bool $usesPipewait = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var bool Whether processMessages() settled the deferred promise, which
|
||||||
|
* a rewind retry settles with a still-pending promise
|
||||||
|
*/
|
||||||
|
public bool $deferredSettled = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var ResponseInterface|null Received response (if any)
|
* @var ResponseInterface|null Received response (if any)
|
||||||
*/
|
*/
|
||||||
|
|
@ -108,6 +114,16 @@ final class EasyHandle
|
||||||
*/
|
*/
|
||||||
public ?TimeoutException $bodyReadTimeoutException = null;
|
public ?TimeoutException $bodyReadTimeoutException = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var TimeoutException|null Exception during request body rewind timeout.
|
||||||
|
*/
|
||||||
|
public ?TimeoutException $bodyRewindTimeoutException = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var \Throwable|null Exception during request body rewind.
|
||||||
|
*/
|
||||||
|
public ?\Throwable $bodyRewindException = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var \Throwable|null Exception during request body read.
|
* @var \Throwable|null Exception during request body read.
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ use GuzzleHttp\RequestOptions;
|
||||||
use GuzzleHttp\TransferStats;
|
use GuzzleHttp\TransferStats;
|
||||||
use GuzzleHttp\TransportSharing;
|
use GuzzleHttp\TransportSharing;
|
||||||
use GuzzleHttp\Utils;
|
use GuzzleHttp\Utils;
|
||||||
|
use Openssl\Session;
|
||||||
use Psr\Http\Message\RequestInterface;
|
use Psr\Http\Message\RequestInterface;
|
||||||
use Psr\Http\Message\ResponseFactoryInterface;
|
use Psr\Http\Message\ResponseFactoryInterface;
|
||||||
use Psr\Http\Message\ResponseInterface;
|
use Psr\Http\Message\ResponseInterface;
|
||||||
|
|
@ -46,6 +47,12 @@ final class StreamHandler
|
||||||
'transport_sharing' => true,
|
'transport_sharing' => true,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Peers tracked by the TLS session cache, matching libcurl's share handle
|
||||||
|
* TLS session cache (25 peers, up to 2 sessions each).
|
||||||
|
*/
|
||||||
|
private const TLS_SESSION_CACHE_MAX_KEYS = 25;
|
||||||
|
|
||||||
private const CONNECTION_ERRORS = [
|
private const CONNECTION_ERRORS = [
|
||||||
'php_network_getaddresses:',
|
'php_network_getaddresses:',
|
||||||
'getaddrinfo',
|
'getaddrinfo',
|
||||||
|
|
@ -76,6 +83,21 @@ final class StreamHandler
|
||||||
'unexpected eof while reading',
|
'unexpected eof while reading',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
// PHP's HTTP wrapper can collapse wrapper-level errors to OpenFailed.
|
||||||
|
// These codes classify only errors delivered directly to the context
|
||||||
|
// handler. NetworkRecvFailed is omitted because PHP currently emits it for
|
||||||
|
// handshake-time certificate policy failures.
|
||||||
|
private const STRUCTURED_NETWORK_ERROR_CODES = [
|
||||||
|
'NetworkSendFailed',
|
||||||
|
];
|
||||||
|
|
||||||
|
// SslNotSupported can be emitted directly by a transport that cannot
|
||||||
|
// enable crypto. Standard ext-openssl proxy failures are normally
|
||||||
|
// collapsed to OpenFailed and continue to use message classification.
|
||||||
|
private const STRUCTURED_CONNECTION_ERROR_CODES = [
|
||||||
|
'SslNotSupported',
|
||||||
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default idle timeout in milliseconds when the "read_timeout" option is
|
* Default idle timeout in milliseconds when the "read_timeout" option is
|
||||||
* not set. Matches PHP's default_socket_timeout default, which the
|
* not set. Matches PHP's default_socket_timeout default, which the
|
||||||
|
|
@ -93,6 +115,8 @@ final class StreamHandler
|
||||||
|
|
||||||
private bool $connectionCapsConfigured = false;
|
private bool $connectionCapsConfigured = false;
|
||||||
|
|
||||||
|
private ?StreamTlsSessionCache $sessionCache = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Accepts an associative array of options:
|
* Accepts an associative array of options:
|
||||||
*
|
*
|
||||||
|
|
@ -225,19 +249,7 @@ final class StreamHandler
|
||||||
|
|
||||||
if (!$e instanceof TransferException) {
|
if (!$e instanceof TransferException) {
|
||||||
$message = $e->getMessage();
|
$message = $e->getMessage();
|
||||||
if (self::isSendError($message)) {
|
$e = self::createStreamFailureException($message, $request, $e, []);
|
||||||
$e = self::isConnectTimeoutError($message)
|
|
||||||
? new NetworkTimeoutException($message, $request, $e)
|
|
||||||
: new NetworkException($message, $request, $e);
|
|
||||||
} elseif (self::isConnectTimeoutError($message)) {
|
|
||||||
$e = new ConnectTimeoutException($message, $request, $e);
|
|
||||||
} elseif (self::isConnectionError($message)) {
|
|
||||||
$e = new ConnectException($message, $request, $e);
|
|
||||||
} elseif (self::isNetworkError($message)) {
|
|
||||||
$e = new NetworkException($message, $request, $e);
|
|
||||||
} else {
|
|
||||||
$e = new RequestException($message, $request, 0, $e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
$this->invokeStats($options, $request, $startTime, null, $e);
|
$this->invokeStats($options, $request, $startTime, null, $e);
|
||||||
|
|
||||||
|
|
@ -296,6 +308,56 @@ final class StreamHandler
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string[] $streamErrorCodes
|
||||||
|
*/
|
||||||
|
private static function createStreamFailureException(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $message,
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
RequestInterface $request,
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
\Exception $previous,
|
||||||
|
array $streamErrorCodes
|
||||||
|
): TransferException {
|
||||||
|
if (self::isSendError($message) || self::hasStreamErrorCode($streamErrorCodes, self::STRUCTURED_NETWORK_ERROR_CODES)) {
|
||||||
|
return self::isConnectTimeoutError($message)
|
||||||
|
? new NetworkTimeoutException($message, $request, $previous)
|
||||||
|
: new NetworkException($message, $request, $previous);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (self::isConnectTimeoutError($message)) {
|
||||||
|
return new ConnectTimeoutException($message, $request, $previous);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (self::hasStreamErrorCode($streamErrorCodes, self::STRUCTURED_CONNECTION_ERROR_CODES) || self::isConnectionError($message)) {
|
||||||
|
return new ConnectException($message, $request, $previous);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (self::isNetworkError($message)) {
|
||||||
|
return new NetworkException($message, $request, $previous);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new RequestException($message, $request, 0, $previous);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string[] $streamErrorCodes
|
||||||
|
* @param string[] $codes
|
||||||
|
*/
|
||||||
|
private static function hasStreamErrorCode(array $streamErrorCodes, array $codes): bool
|
||||||
|
{
|
||||||
|
foreach ($streamErrorCodes as $streamErrorCode) {
|
||||||
|
foreach ($codes as $code) {
|
||||||
|
if ($streamErrorCode === $code) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
private function invokeStats(
|
private function invokeStats(
|
||||||
#[\SensitiveParameter]
|
#[\SensitiveParameter]
|
||||||
array $options,
|
array $options,
|
||||||
|
|
@ -829,8 +891,11 @@ final class StreamHandler
|
||||||
*
|
*
|
||||||
* @throws \RuntimeException when the callback returns false or resource creation emits an error.
|
* @throws \RuntimeException when the callback returns false or resource creation emits an error.
|
||||||
*/
|
*/
|
||||||
private function createResource(callable $callback)
|
private function createResource(
|
||||||
{
|
callable $callback,
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
?UriInterface $diagnosticUri = null
|
||||||
|
) {
|
||||||
$errors = [];
|
$errors = [];
|
||||||
\set_error_handler(static function (int $_, string $msg, string $file, int $line) use (&$errors): bool {
|
\set_error_handler(static function (int $_, string $msg, string $file, int $line) use (&$errors): bool {
|
||||||
$errors[] = [
|
$errors[] = [
|
||||||
|
|
@ -852,7 +917,10 @@ final class StreamHandler
|
||||||
$details = [];
|
$details = [];
|
||||||
foreach ($errors as $err) {
|
foreach ($errors as $err) {
|
||||||
foreach ($err as $key => $value) {
|
foreach ($err as $key => $value) {
|
||||||
$details[] = \sprintf('[%s] %s', $key, Psr7\DiagnosticValue::escape((string) $value));
|
$rendered = $key === 'message' && $diagnosticUri !== null
|
||||||
|
? UriDiagnostic::redactInMessage((string) $value, $diagnosticUri)
|
||||||
|
: Psr7\DiagnosticValue::escape((string) $value);
|
||||||
|
$details[] = \sprintf('[%s] %s', $key, $rendered);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -877,6 +945,10 @@ final class StreamHandler
|
||||||
array $options,
|
array $options,
|
||||||
string $body
|
string $body
|
||||||
) {
|
) {
|
||||||
|
// Report a stream-open failure against the request passed here, not the
|
||||||
|
// Connection: close clone built for the wire.
|
||||||
|
$callerRequest = $request;
|
||||||
|
|
||||||
// HTTP/1.1 streams using the PHP stream wrapper require a
|
// HTTP/1.1 streams using the PHP stream wrapper require a
|
||||||
// Connection: close header
|
// Connection: close header
|
||||||
if ($request->getProtocolVersion() === '1.1'
|
if ($request->getProtocolVersion() === '1.1'
|
||||||
|
|
@ -892,6 +964,7 @@ final class StreamHandler
|
||||||
|
|
||||||
$params = [];
|
$params = [];
|
||||||
$context = $this->getDefaultContext($request, $body);
|
$context = $this->getDefaultContext($request, $body);
|
||||||
|
$customSslContext = [];
|
||||||
|
|
||||||
if (isset($options['on_headers']) && !\is_callable($options['on_headers'])) {
|
if (isset($options['on_headers']) && !\is_callable($options['on_headers'])) {
|
||||||
throw new InvalidArgumentException('on_headers must be callable');
|
throw new InvalidArgumentException('on_headers must be callable');
|
||||||
|
|
@ -921,10 +994,17 @@ final class StreamHandler
|
||||||
self::rejectConflictingStreamContextOptions($streamContext);
|
self::rejectConflictingStreamContextOptions($streamContext);
|
||||||
self::rejectUnsupportedStreamContextOptions($streamContext);
|
self::rejectUnsupportedStreamContextOptions($streamContext);
|
||||||
$context = \array_replace_recursive($context, $streamContext);
|
$context = \array_replace_recursive($context, $streamContext);
|
||||||
|
|
||||||
|
$sslContext = $streamContext['ssl'] ?? null;
|
||||||
|
if (\is_array($sslContext)) {
|
||||||
|
$customSslContext = $sslContext;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->addDefaultTlsMinimum($request, $context);
|
$this->addDefaultTlsMinimum($request, $context);
|
||||||
|
|
||||||
|
$commitTlsSessions = $this->applyTlsSessionResumption($request, $context, $customSslContext);
|
||||||
|
|
||||||
// The context timeout governs connecting and the header-phase packet
|
// The context timeout governs connecting and the header-phase packet
|
||||||
// gaps: the idle timeout, tightened to the deadline when that is
|
// gaps: the idle timeout, tightened to the deadline when that is
|
||||||
// lower; -1 disables it so default_socket_timeout is never consulted.
|
// lower; -1 disables it so default_socket_timeout is never consulted.
|
||||||
|
|
@ -936,6 +1016,10 @@ final class StreamHandler
|
||||||
$context['http']['timeout'] = -1;
|
$context['http']['timeout'] = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$streamErrorCodes = [];
|
||||||
|
$captureStreamErrors = true;
|
||||||
|
$this->addStructuredStreamErrorHandler($context, $streamErrorCodes, $captureStreamErrors);
|
||||||
|
|
||||||
$uri = $this->resolveHost($request, $options);
|
$uri = $this->resolveHost($request, $options);
|
||||||
|
|
||||||
$contextResource = $this->createResource(
|
$contextResource = $this->createResource(
|
||||||
|
|
@ -944,8 +1028,8 @@ final class StreamHandler
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
return $this->createResource(
|
try {
|
||||||
function () use ($uri, $contextResource, $idleTimeout, $timeout) {
|
$resource = $this->createResource(function () use ($uri, $contextResource, $idleTimeout, $timeout) {
|
||||||
$this->lastDeadline = $timeout > 0 ? Clock::now() + $timeout / 1000 : null;
|
$this->lastDeadline = $timeout > 0 ? Clock::now() + $timeout / 1000 : null;
|
||||||
|
|
||||||
// Blank the from ini setting for the transfer so ambient
|
// Blank the from ini setting for the transfer so ambient
|
||||||
|
|
@ -982,8 +1066,69 @@ final class StreamHandler
|
||||||
}
|
}
|
||||||
|
|
||||||
return $resource;
|
return $resource;
|
||||||
|
}, $uri);
|
||||||
|
} catch (TransferException $e) {
|
||||||
|
// Notification callbacks run during fopen(); an exception a
|
||||||
|
// callback throws is already a fully-formed transfer failure for
|
||||||
|
// its own request, so it passes through unchanged instead of
|
||||||
|
// being reclassified against this request.
|
||||||
|
throw $e;
|
||||||
|
} catch (\RuntimeException $e) {
|
||||||
|
throw self::createStreamFailureException($e->getMessage(), $callerRequest, $e, $streamErrorCodes);
|
||||||
|
} finally {
|
||||||
|
$captureStreamErrors = false;
|
||||||
}
|
}
|
||||||
);
|
|
||||||
|
if ($commitTlsSessions !== null) {
|
||||||
|
$commitTlsSessions();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $resource;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string[] $streamErrorCodes
|
||||||
|
*/
|
||||||
|
private function addStructuredStreamErrorHandler(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
array &$context,
|
||||||
|
array &$streamErrorCodes,
|
||||||
|
bool &$captureStreamErrors
|
||||||
|
): void {
|
||||||
|
if (!self::supportsStructuredStreamErrors()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($context['stream']) || !\is_array($context['stream'])) {
|
||||||
|
$context['stream'] = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$context['stream']['error_mode'] = \StreamErrorMode::Error;
|
||||||
|
$context['stream']['error_store'] = \StreamErrorStore::None;
|
||||||
|
/** @param \StreamError[] $errors */
|
||||||
|
$context['stream']['error_handler'] = static function (
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
array $errors
|
||||||
|
) use (&$streamErrorCodes, &$captureStreamErrors): void {
|
||||||
|
if (!$captureStreamErrors) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($errors as $error) {
|
||||||
|
$name = $error->code->name;
|
||||||
|
if (!\in_array($name, $streamErrorCodes, true)) {
|
||||||
|
$streamErrorCodes[] = $name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function supportsStructuredStreamErrors(): bool
|
||||||
|
{
|
||||||
|
// Any PHP 8.6 build qualifies, including pre-release and nightly
|
||||||
|
// builds; the class check keeps unstable builds that do not carry
|
||||||
|
// the final API fail-closed.
|
||||||
|
return \PHP_VERSION_ID >= 80600 && \class_exists(\StreamError::class, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static function assertRequestUriSupported(
|
private static function assertRequestUriSupported(
|
||||||
|
|
@ -1128,6 +1273,160 @@ final class StreamHandler
|
||||||
$context['ssl']['min_proto_version'] = \STREAM_CRYPTO_PROTO_TLSv1_2;
|
$context['ssl']['min_proto_version'] = \STREAM_CRYPTO_PROTO_TLSv1_2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wires PHP 8.6+ TLS session resumption into the SSL context. Preferred
|
||||||
|
* sharing modes fall back to no sharing when a request cannot safely use
|
||||||
|
* Guzzle-managed sessions; HANDLER_REQUIRE fails loudly instead.
|
||||||
|
*
|
||||||
|
* New sessions are held temporarily and committed only after the HTTPS
|
||||||
|
* stream opens successfully. If PHP rejects peer verification or another
|
||||||
|
* stream-open step fails, any session reported during that attempt is
|
||||||
|
* discarded.
|
||||||
|
*
|
||||||
|
* @param array $customSslContext User-supplied stream_context['ssl']
|
||||||
|
* values.
|
||||||
|
*/
|
||||||
|
private function applyTlsSessionResumption(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
RequestInterface $request,
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
array &$context,
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
array $customSslContext = []
|
||||||
|
): ?\Closure {
|
||||||
|
if (!$this->transportSharingRequested()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$uri = $request->getUri();
|
||||||
|
|
||||||
|
if ('https' !== $uri->getScheme()) {
|
||||||
|
$this->failRequiredTlsSharingForRequest($request, 'handler-lifetime TLS session sharing only applies to HTTPS requests.');
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$host = $uri->getHost();
|
||||||
|
|
||||||
|
// PHP opens a proxy transport with the full stream context, so a TLS
|
||||||
|
// proxy handshake would consume origin-keyed session state; only a
|
||||||
|
// tcp:// proxy keeps TLS on the origin leg alone.
|
||||||
|
$proxy = $context['http']['proxy'] ?? null;
|
||||||
|
if (\is_string($proxy) && ProxyOptions::proxyScheme($proxy) !== 'tcp') {
|
||||||
|
$this->failRequiredTlsSharingForRequest($request, 'the proxy uses a TLS stream transport, which would mix proxy and origin TLS session state.');
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($context['ssl']) || !\is_array($context['ssl'])) {
|
||||||
|
$this->failRequiredTlsSharingForConfiguration('the final stream SSL context is not an array.');
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$unsupported = StreamTlsSessionCache::unsupportedContextReason($context['ssl'], $customSslContext);
|
||||||
|
if ($unsupported !== null) {
|
||||||
|
$this->failRequiredTlsSharingForConfiguration($unsupported);
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$cache = $this->sessionCache();
|
||||||
|
if ($cache === null) {
|
||||||
|
$this->failRequiredTlsSharingForConfiguration('PHP 8.6+ with the OpenSSL session API is required.');
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$key = StreamTlsSessionCache::peerKey(self::canonicalConnectionHost($host), $uri->getPort() ?? 443, $context['ssl']);
|
||||||
|
$credentials = StreamTlsSessionCache::credentialFingerprint($context['ssl']);
|
||||||
|
|
||||||
|
$session = $cache->find($key, $credentials);
|
||||||
|
if ($session !== null) {
|
||||||
|
$context['ssl']['session_data'] = $session;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sessions captured before the stream opens are staged so handshakes
|
||||||
|
// that fail PHP's peer verification policy are never cached.
|
||||||
|
$accepted = false;
|
||||||
|
$staged = [];
|
||||||
|
|
||||||
|
$context['ssl']['session_new_cb'] = static function (
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
$stream,
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
Session $session
|
||||||
|
) use ($cache, $key, $credentials, &$accepted, &$staged): void {
|
||||||
|
if ($accepted) {
|
||||||
|
$cache->store($key, $credentials, $session);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// A server can stream session tickets while withholding response
|
||||||
|
// headers; keep only as many staged sessions as the cache retains.
|
||||||
|
if (\count($staged) >= StreamTlsSessionCache::MAX_SESSIONS_PER_KEY) {
|
||||||
|
\array_shift($staged);
|
||||||
|
}
|
||||||
|
|
||||||
|
$staged[] = $session;
|
||||||
|
};
|
||||||
|
|
||||||
|
return static function () use ($cache, $key, $credentials, &$accepted, &$staged): void {
|
||||||
|
$accepted = true;
|
||||||
|
|
||||||
|
foreach ($staged as $session) {
|
||||||
|
$cache->store($key, $credentials, $session);
|
||||||
|
}
|
||||||
|
|
||||||
|
$staged = [];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private function transportSharingRequested(): bool
|
||||||
|
{
|
||||||
|
return $this->transportSharingMode !== TransportSharing::NONE
|
||||||
|
&& $this->transportSharingMode !== TransportSharing::PERSISTENT_REQUIRE;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function transportSharingRequired(): bool
|
||||||
|
{
|
||||||
|
return $this->transportSharingMode === TransportSharing::HANDLER_REQUIRE;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function failRequiredTlsSharingForRequest(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
RequestInterface $request,
|
||||||
|
string $reason
|
||||||
|
): void {
|
||||||
|
if ($this->transportSharingRequired()) {
|
||||||
|
throw new RequestException('The "transport_sharing" option requires stream handler TLS session sharing, but '.$reason, $request);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function failRequiredTlsSharingForConfiguration(string $reason): void
|
||||||
|
{
|
||||||
|
if ($this->transportSharingRequired()) {
|
||||||
|
throw new InvalidArgumentException('The "transport_sharing" option requires stream handler TLS session sharing, but '.$reason);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns this handler's TLS session cache, or null when the configured
|
||||||
|
* sharing mode shares nothing or the OpenSSL session API is unavailable.
|
||||||
|
* Persistent (process-wide) sharing is a cURL-only feature, so
|
||||||
|
* PERSISTENT_PREFER degrades to this per-handler cache while
|
||||||
|
* PERSISTENT_REQUIRE is rejected before sharing applies.
|
||||||
|
*/
|
||||||
|
private function sessionCache(): ?StreamTlsSessionCache
|
||||||
|
{
|
||||||
|
if (!$this->transportSharingRequested() || !StreamTlsSessionCache::isSupported()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->sessionCache ?? ($this->sessionCache = new StreamTlsSessionCache(self::TLS_SESSION_CACHE_MAX_KEYS));
|
||||||
|
}
|
||||||
|
|
||||||
private function getDefaultContext(
|
private function getDefaultContext(
|
||||||
#[\SensitiveParameter]
|
#[\SensitiveParameter]
|
||||||
RequestInterface $request,
|
RequestInterface $request,
|
||||||
|
|
@ -1182,6 +1481,20 @@ final class StreamHandler
|
||||||
return $context;
|
return $context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function assertTransportSharingSupported(): void
|
||||||
|
{
|
||||||
|
// The stream handler cannot pool live connections or share state across
|
||||||
|
// handler instances; persistent sharing is cURL-only.
|
||||||
|
if ($this->transportSharingMode === TransportSharing::PERSISTENT_REQUIRE) {
|
||||||
|
throw new InvalidArgumentException('The "transport_sharing" option requires persistent transport sharing, which is only available through cURL share handles. The stream handler can only share handler-lifetime TLS sessions.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handler-scoped sharing needs the PHP 8.6+ OpenSSL session API.
|
||||||
|
if ($this->transportSharingMode === TransportSharing::HANDLER_REQUIRE && !StreamTlsSessionCache::isSupported()) {
|
||||||
|
throw new InvalidArgumentException('The "transport_sharing" option requires handler-lifetime transport sharing, but the stream handler only supports it through TLS session resumption on PHP 8.6+ with the OpenSSL session API.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static function rejectUnsupportedRequestOptions(
|
private static function rejectUnsupportedRequestOptions(
|
||||||
#[\SensitiveParameter]
|
#[\SensitiveParameter]
|
||||||
RequestInterface $request,
|
RequestInterface $request,
|
||||||
|
|
@ -1361,20 +1674,14 @@ final class StreamHandler
|
||||||
'verify_peer' => 'the "verify" request option',
|
'verify_peer' => 'the "verify" request option',
|
||||||
'verify_peer_name' => 'the "verify" request option',
|
'verify_peer_name' => 'the "verify" request option',
|
||||||
],
|
],
|
||||||
|
'stream' => [
|
||||||
|
'error_handler' => 'Guzzle stream error handling',
|
||||||
|
'error_mode' => 'Guzzle stream error handling',
|
||||||
|
'error_store' => 'Guzzle stream error handling',
|
||||||
|
],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
private function assertTransportSharingSupported(): void
|
|
||||||
{
|
|
||||||
if ($this->transportSharingMode === TransportSharing::PERSISTENT_REQUIRE) {
|
|
||||||
throw new InvalidArgumentException('The "transport_sharing" option requires persistent transport sharing, which is only available through cURL share handles.');
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->transportSharingMode === TransportSharing::HANDLER_REQUIRE) {
|
|
||||||
throw new InvalidArgumentException('The "transport_sharing" option requires transport sharing, but the stream handler does not support it.');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param mixed $value as passed via Request transfer options.
|
* @param mixed $value as passed via Request transfer options.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
583
vendor/guzzlehttp/guzzle/src/Handler/StreamTlsSessionCache.php
vendored
Normal file
583
vendor/guzzlehttp/guzzle/src/Handler/StreamTlsSessionCache.php
vendored
Normal file
|
|
@ -0,0 +1,583 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace GuzzleHttp\Handler;
|
||||||
|
|
||||||
|
use GuzzleHttp\Exception\InvalidArgumentException;
|
||||||
|
use GuzzleHttp\HostIdentity;
|
||||||
|
use GuzzleHttp\NonSerializableTrait;
|
||||||
|
use GuzzleHttp\Psr7;
|
||||||
|
use Openssl\Session;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Per-handler in-memory TLS session resumption cache for the stream handler.
|
||||||
|
*
|
||||||
|
* Backed by the OpenSSL TLS session API added in PHP 8.6. A session is only
|
||||||
|
* ever replayed for an identical TLS identity: the non-secret identity is
|
||||||
|
* encoded in the lookup key and secret material is matched in constant time.
|
||||||
|
* TLS resumption reuses the original certificate-chain verification result
|
||||||
|
* instead of building and verifying the chain again. Guzzle includes ambient
|
||||||
|
* trust configuration paths in the cache identity, but cannot detect
|
||||||
|
* trust-store contents rewritten at an unchanged path. Recreate the handler
|
||||||
|
* or disable transport sharing when trust changes must take effect
|
||||||
|
* immediately.
|
||||||
|
*
|
||||||
|
* New sessions are held temporarily and committed only after the HTTPS stream
|
||||||
|
* opens successfully. If PHP rejects peer verification or another stream-open
|
||||||
|
* step fails, any session reported during that attempt is discarded.
|
||||||
|
*
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
final class StreamTlsSessionCache
|
||||||
|
{
|
||||||
|
use NonSerializableTrait;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sessions retained per peer. libcurl uses 2 to buffer single-use TLS 1.3
|
||||||
|
* tickets; the synchronous stream handler does not need more.
|
||||||
|
*/
|
||||||
|
public const MAX_SESSIONS_PER_KEY = 2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TLS 1.3 tickets should not live longer than RFC 8446 allows. All
|
||||||
|
* pre-TLS-1.3 sessions use libcurl's tighter one-day cap.
|
||||||
|
*/
|
||||||
|
private const MAX_TLS13_LIFETIME = 604800;
|
||||||
|
private const MAX_PRE_TLS13_LIFETIME = 86400;
|
||||||
|
|
||||||
|
private const USER_MANAGED_SESSION_OPTIONS = [
|
||||||
|
'session_cache' => true,
|
||||||
|
'session_cache_size' => true,
|
||||||
|
'session_data' => true,
|
||||||
|
'session_get_cb' => true,
|
||||||
|
'session_id_context' => true,
|
||||||
|
'session_new_cb' => true,
|
||||||
|
'session_remove_cb' => true,
|
||||||
|
'session_stream' => true,
|
||||||
|
'session_timeout' => true,
|
||||||
|
];
|
||||||
|
|
||||||
|
private const USER_MANAGED_PSK_OPTIONS = [
|
||||||
|
'psk_client_cb' => true,
|
||||||
|
'psk_server_cb' => true,
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TLS 1.3 early data (0-RTT) options are deliberately never shared: an
|
||||||
|
* injected cached session would let PHP send the replayable early data
|
||||||
|
* payload ahead of the HTTP request.
|
||||||
|
*/
|
||||||
|
private const USER_MANAGED_EARLY_DATA_OPTIONS = [
|
||||||
|
'early_data' => true,
|
||||||
|
'early_data_cb' => true,
|
||||||
|
'max_early_data' => true,
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* File/path-bearing SSL context options are deliberately not shared: their
|
||||||
|
* contents can change outside this handler.
|
||||||
|
*/
|
||||||
|
private const PATH_OPTIONS = [
|
||||||
|
'SNI_server_certs' => true,
|
||||||
|
'cafile' => true,
|
||||||
|
'capath' => true,
|
||||||
|
'dh_param' => true,
|
||||||
|
'local_cert' => true,
|
||||||
|
'local_pk' => true,
|
||||||
|
];
|
||||||
|
|
||||||
|
private const CERT_CAPTURE_OPTIONS = [
|
||||||
|
'capture_peer_cert' => true,
|
||||||
|
'capture_peer_cert_chain' => true,
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scalar custom SSL context options that are known to be self-contained
|
||||||
|
* and safe to include in the TLS session cache identity.
|
||||||
|
*/
|
||||||
|
private const CUSTOM_SCALAR_KEYABLE_OPTIONS = [
|
||||||
|
'SNI_enabled' => true,
|
||||||
|
'allow_self_signed' => true,
|
||||||
|
'alpn_protocols' => true,
|
||||||
|
'ciphers' => true,
|
||||||
|
'crypto_method' => true,
|
||||||
|
'disable_compression' => true,
|
||||||
|
'max_proto_version' => true,
|
||||||
|
'min_proto_version' => true,
|
||||||
|
'peer_name' => true,
|
||||||
|
'security_level' => true,
|
||||||
|
'verify_depth' => true,
|
||||||
|
'verify_peer' => true,
|
||||||
|
'verify_peer_name' => true,
|
||||||
|
];
|
||||||
|
|
||||||
|
private const INVALID_PEER_FINGERPRINT_REASON = 'the SSL context option "peer_fingerprint" must be a string or a non-empty, flat array with string algorithm names and string fingerprints.';
|
||||||
|
|
||||||
|
private int $maxKeys;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array<string, list<array{session: Session, credentials: string, expiresAt: int, singleUse: bool}>>
|
||||||
|
*/
|
||||||
|
private array $sessions = [];
|
||||||
|
|
||||||
|
public function __construct(int $maxKeys)
|
||||||
|
{
|
||||||
|
if ($maxKeys < 1) {
|
||||||
|
throw new InvalidArgumentException('maxKeys must be a positive integer.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->maxKeys = $maxKeys;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function isSupported(): bool
|
||||||
|
{
|
||||||
|
// Any PHP 8.6 build qualifies, including pre-release and nightly
|
||||||
|
// builds; the class check keeps unstable builds that do not carry
|
||||||
|
// the final API fail-closed.
|
||||||
|
return \PHP_VERSION_ID >= 80600 && \class_exists(Session::class, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $ssl The assembled 'ssl' stream context array.
|
||||||
|
* @param array $customSsl The user-supplied stream_context['ssl'] array.
|
||||||
|
*/
|
||||||
|
public static function unsupportedContextReason(array $ssl, array $customSsl = []): ?string
|
||||||
|
{
|
||||||
|
foreach ($customSsl as $key => $value) {
|
||||||
|
if (
|
||||||
|
!isset(self::CUSTOM_SCALAR_KEYABLE_OPTIONS[$key])
|
||||||
|
&& !isset(self::PATH_OPTIONS[$key])
|
||||||
|
&& !isset(self::USER_MANAGED_SESSION_OPTIONS[$key])
|
||||||
|
&& !isset(self::USER_MANAGED_PSK_OPTIONS[$key])
|
||||||
|
&& !isset(self::USER_MANAGED_EARLY_DATA_OPTIONS[$key])
|
||||||
|
&& !isset(self::CERT_CAPTURE_OPTIONS[$key])
|
||||||
|
&& $key !== 'no_ticket'
|
||||||
|
&& $key !== 'peer_fingerprint'
|
||||||
|
) {
|
||||||
|
return \sprintf('the custom SSL context option "%s" is not known to be safe for TLS session sharing.', Psr7\DiagnosticValue::escape((string) $key));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($ssl as $key => $value) {
|
||||||
|
if (isset(self::PATH_OPTIONS[$key])) {
|
||||||
|
return \sprintf('the SSL context option "%s" uses file or path state that cannot be safely shared.', Psr7\DiagnosticValue::escape((string) $key));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset(self::USER_MANAGED_SESSION_OPTIONS[$key])) {
|
||||||
|
return \sprintf('the SSL context option "%s" is user-managed TLS session state.', Psr7\DiagnosticValue::escape((string) $key));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset(self::USER_MANAGED_PSK_OPTIONS[$key])) {
|
||||||
|
return \sprintf('the SSL context option "%s" is user-managed TLS PSK state.', Psr7\DiagnosticValue::escape((string) $key));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset(self::USER_MANAGED_EARLY_DATA_OPTIONS[$key])) {
|
||||||
|
return \sprintf('the SSL context option "%s" is user-managed TLS early data state.', Psr7\DiagnosticValue::escape((string) $key));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset(self::CERT_CAPTURE_OPTIONS[$key]) && $value) {
|
||||||
|
return \sprintf('the SSL context option "%s" requires a fresh peer certificate handshake.', Psr7\DiagnosticValue::escape((string) $key));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($key === 'no_ticket' && $value) {
|
||||||
|
return 'the SSL context option "no_ticket" disables TLS ticket sharing.';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($key === 'peer_fingerprint') {
|
||||||
|
if (!self::isPeerFingerprint($value)) {
|
||||||
|
return self::INVALID_PEER_FINGERPRINT_REASON;
|
||||||
|
}
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!self::isCanonicalScalar($value)) {
|
||||||
|
return \sprintf('the SSL context option "%s" cannot be safely included in the TLS session cache identity.', Psr7\DiagnosticValue::escape((string) $key));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds the non-secret lookup key: host/port plus every TLS parameter that
|
||||||
|
* defines the verification/identity context. Keyed on the connection host
|
||||||
|
* a transport reads, with numeric IPv4 spellings folded to one dotted
|
||||||
|
* quad; names are never resolved. Secret material is excluded.
|
||||||
|
*
|
||||||
|
* @param array $ssl The assembled 'ssl' stream context array.
|
||||||
|
*/
|
||||||
|
public static function peerKey(
|
||||||
|
string $host,
|
||||||
|
?int $port,
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
array $ssl
|
||||||
|
): string {
|
||||||
|
$identity = [
|
||||||
|
'schema' => 'guzzle-stream-tls-session-v1',
|
||||||
|
'runtime' => self::runtimeIdentity(),
|
||||||
|
'peer' => [
|
||||||
|
'host' => self::canonicalHost($host),
|
||||||
|
'port' => $port,
|
||||||
|
],
|
||||||
|
'ssl' => self::canonicalPeerSslContext($ssl),
|
||||||
|
];
|
||||||
|
|
||||||
|
return \hash('sha256', \serialize($identity));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds the secret-aware credential fingerprint matched in constant time,
|
||||||
|
* keeping the passphrase out of the loggable peer key.
|
||||||
|
*
|
||||||
|
* Every credential-bearing context is currently rejected by
|
||||||
|
* unsupportedContextReason() before sharing, so fingerprints can only
|
||||||
|
* diverge if the allow-lists are ever widened; the constant-time match is
|
||||||
|
* retained as defense in depth for that case.
|
||||||
|
*
|
||||||
|
* @param array $ssl The assembled 'ssl' stream context array.
|
||||||
|
*/
|
||||||
|
public static function credentialFingerprint(array $ssl): string
|
||||||
|
{
|
||||||
|
$material = [
|
||||||
|
'local_cert' => isset($ssl['local_cert']) && \is_string($ssl['local_cert']) ? self::pathIdentity($ssl['local_cert']) : null,
|
||||||
|
'local_pk' => isset($ssl['local_pk']) && \is_string($ssl['local_pk']) ? self::pathIdentity($ssl['local_pk']) : null,
|
||||||
|
'passphrase' => isset($ssl['passphrase']) && \is_string($ssl['passphrase']) ? $ssl['passphrase'] : null,
|
||||||
|
];
|
||||||
|
|
||||||
|
return \hash('sha256', \serialize($material));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function find(string $key, string $credentials): ?Session
|
||||||
|
{
|
||||||
|
if (!isset($this->sessions[$key])) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$now = \time();
|
||||||
|
$entries = $this->sessions[$key];
|
||||||
|
$found = null;
|
||||||
|
|
||||||
|
foreach ($entries as $i => $entry) {
|
||||||
|
if ($entry['expiresAt'] <= $now) {
|
||||||
|
unset($entries[$i]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!\hash_equals($entry['credentials'], $credentials)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$entry['session']->isResumable()) {
|
||||||
|
unset($entries[$i]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$found = $entry['session'];
|
||||||
|
|
||||||
|
// TLS 1.3 tickets are single-use; consume on take.
|
||||||
|
if ($entry['singleUse']) {
|
||||||
|
unset($entries[$i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($entries === []) {
|
||||||
|
unset($this->sessions[$key]);
|
||||||
|
} else {
|
||||||
|
$this->sessions[$key] = \array_values($entries);
|
||||||
|
if ($found !== null) {
|
||||||
|
$this->touch($key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $found;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function store(
|
||||||
|
string $key,
|
||||||
|
string $credentials,
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
Session $session
|
||||||
|
): void {
|
||||||
|
if (!$session->isResumable()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$expiresAt = self::expiry($session);
|
||||||
|
if ($expiresAt === null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$list = $this->sessions[$key] ?? [];
|
||||||
|
$list[] = [
|
||||||
|
'session' => $session,
|
||||||
|
'credentials' => $credentials,
|
||||||
|
'expiresAt' => $expiresAt,
|
||||||
|
'singleUse' => self::isTls13($session),
|
||||||
|
];
|
||||||
|
|
||||||
|
if (\count($list) > self::MAX_SESSIONS_PER_KEY) {
|
||||||
|
$list = \array_slice($list, -self::MAX_SESSIONS_PER_KEY);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->sessions[$key] = $list;
|
||||||
|
$this->touch($key);
|
||||||
|
$this->evictExcessKeys();
|
||||||
|
}
|
||||||
|
|
||||||
|
private function touch(string $key): void
|
||||||
|
{
|
||||||
|
if (!isset($this->sessions[$key])) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$value = $this->sessions[$key];
|
||||||
|
unset($this->sessions[$key]);
|
||||||
|
$this->sessions[$key] = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function evictExcessKeys(): void
|
||||||
|
{
|
||||||
|
while (\count($this->sessions) > $this->maxKeys) {
|
||||||
|
\array_shift($this->sessions);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function isTls13(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
Session $session
|
||||||
|
): bool {
|
||||||
|
$protocol = $session->getProtocol();
|
||||||
|
|
||||||
|
return $protocol !== null && Psr7\Utils::caselessContains($protocol, '1.3');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the absolute expiry timestamp, or null when the session must
|
||||||
|
* not be cached.
|
||||||
|
*/
|
||||||
|
private static function expiry(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
Session $session
|
||||||
|
): ?int {
|
||||||
|
return self::expiryFromLifetimes(
|
||||||
|
self::isTls13($session),
|
||||||
|
$session->hasTicket(),
|
||||||
|
$session->getTicketLifetimeHint(),
|
||||||
|
$session->getTimeout(),
|
||||||
|
$session->getCreatedAt(),
|
||||||
|
\time()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decides the absolute expiry timestamp from a session's scalar lifetime
|
||||||
|
* attributes, or null when the session must not be cached.
|
||||||
|
*
|
||||||
|
* A non-positive session timeout is never cached. TLS 1.3 resumption
|
||||||
|
* requires a New Session Ticket, so a TLS 1.3 session without a ticket
|
||||||
|
* or without a positive RFC 8446 ticket lifetime is not cached, and the
|
||||||
|
* ticket lifetime bounds the expiry together with the session timeout
|
||||||
|
* and the seven-day cap. Pre-TLS-1.3 tickets treat a zero or missing
|
||||||
|
* lifetime hint as unspecified per RFC 5077, so only a positive hint
|
||||||
|
* tightens the session timeout and the one-day cap. An expiry that has
|
||||||
|
* already passed is not cached.
|
||||||
|
*/
|
||||||
|
private static function expiryFromLifetimes(bool $isTls13, bool $hasTicket, ?int $ticketLifetimeHint, int $timeout, int $createdAt, int $now): ?int
|
||||||
|
{
|
||||||
|
if ($timeout <= 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$lifetime = \min($timeout, $isTls13 ? self::MAX_TLS13_LIFETIME : self::MAX_PRE_TLS13_LIFETIME);
|
||||||
|
|
||||||
|
if ($isTls13) {
|
||||||
|
if (!$hasTicket || $ticketLifetimeHint === null || $ticketLifetimeHint <= 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$lifetime = \min($lifetime, $ticketLifetimeHint);
|
||||||
|
} elseif ($hasTicket && $ticketLifetimeHint !== null && $ticketLifetimeHint > 0) {
|
||||||
|
$lifetime = \min($lifetime, $ticketLifetimeHint);
|
||||||
|
}
|
||||||
|
|
||||||
|
$expiresAt = $createdAt + $lifetime;
|
||||||
|
|
||||||
|
return $expiresAt > $now ? $expiresAt : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function runtimeIdentity(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'php' => \PHP_VERSION_ID,
|
||||||
|
'openssl' => \defined('OPENSSL_VERSION_NUMBER') ? \OPENSSL_VERSION_NUMBER : null,
|
||||||
|
'trust' => [
|
||||||
|
'openssl.cafile' => (string) \ini_get('openssl.cafile'),
|
||||||
|
'openssl.capath' => (string) \ini_get('openssl.capath'),
|
||||||
|
'SSL_CERT_FILE' => (string) \getenv('SSL_CERT_FILE'),
|
||||||
|
'SSL_CERT_DIR' => (string) \getenv('SSL_CERT_DIR'),
|
||||||
|
'cwd' => \getcwd(),
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the host identity hashed into the cache key. Valid bracketed
|
||||||
|
* IPv6 literals are canonicalized to their RFC 5952 form so equivalent
|
||||||
|
* spellings of one address share a single session entry; other valid
|
||||||
|
* hosts, such as reg-names and IPvFuture literals, fall back to ASCII
|
||||||
|
* case folding. Text that is not a valid RFC 3986 host, such as
|
||||||
|
* zone-bearing or malformed bracketed literals, must never become a
|
||||||
|
* usable cache key, so it is rejected.
|
||||||
|
*/
|
||||||
|
private static function canonicalHost(string $host): string
|
||||||
|
{
|
||||||
|
if (!Psr7\Rfc3986::isValidHost($host)) {
|
||||||
|
throw new InvalidArgumentException('Hosts used in the TLS session cache identity must be valid RFC 3986 hosts.');
|
||||||
|
}
|
||||||
|
|
||||||
|
return HostIdentity::canonicalHost($host);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function canonicalPeerSslContext(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
array $ssl
|
||||||
|
): array {
|
||||||
|
$context = [];
|
||||||
|
|
||||||
|
foreach ($ssl as $key => $value) {
|
||||||
|
if (isset(self::USER_MANAGED_SESSION_OPTIONS[$key]) || isset(self::USER_MANAGED_PSK_OPTIONS[$key]) || isset(self::USER_MANAGED_EARLY_DATA_OPTIONS[$key]) || $key === 'passphrase') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($key === 'peer_name' && \is_string($value)) {
|
||||||
|
$context[$key] = ['string', self::canonicalHost($value)];
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($key === 'peer_fingerprint') {
|
||||||
|
$context[$key] = self::canonicalPeerFingerprint($value);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (\in_array($key, ['cafile', 'capath', 'local_cert', 'local_pk'], true) && \is_string($value)) {
|
||||||
|
$context[$key] = self::pathIdentity($value);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$context[$key] = self::canonicalScalar($value);
|
||||||
|
}
|
||||||
|
|
||||||
|
\ksort($context);
|
||||||
|
|
||||||
|
return $context;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function pathIdentity(string $path): array
|
||||||
|
{
|
||||||
|
$realPath = \realpath($path);
|
||||||
|
|
||||||
|
return [
|
||||||
|
'path',
|
||||||
|
$realPath !== false ? $realPath : $path,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mixed $value
|
||||||
|
*/
|
||||||
|
private static function isCanonicalScalar($value): bool
|
||||||
|
{
|
||||||
|
return $value === null
|
||||||
|
|| \is_bool($value)
|
||||||
|
|| \is_int($value)
|
||||||
|
|| \is_float($value)
|
||||||
|
|| \is_string($value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mixed $value
|
||||||
|
*/
|
||||||
|
private static function isPeerFingerprint($value): bool
|
||||||
|
{
|
||||||
|
if (\is_string($value)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!\is_array($value) || $value === []) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($value as $algorithm => $fingerprint) {
|
||||||
|
if (!\is_string($algorithm) || !\is_string($fingerprint)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mixed $value
|
||||||
|
*
|
||||||
|
* @return array{0: string, 1: mixed}
|
||||||
|
*/
|
||||||
|
private static function canonicalScalar($value): array
|
||||||
|
{
|
||||||
|
if ($value === null) {
|
||||||
|
return ['null', null];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (\is_bool($value)) {
|
||||||
|
return ['bool', $value];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (\is_int($value)) {
|
||||||
|
return ['int', $value];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (\is_float($value)) {
|
||||||
|
return ['float', \bin2hex(\pack('E', $value))];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (\is_string($value)) {
|
||||||
|
return ['string', $value];
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new InvalidArgumentException('SSL context values used in the TLS session cache identity must be scalar or null.');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mixed $value
|
||||||
|
*
|
||||||
|
* @return array{0: string, 1: mixed}
|
||||||
|
*/
|
||||||
|
private static function canonicalPeerFingerprint($value): array
|
||||||
|
{
|
||||||
|
if (!self::isPeerFingerprint($value)) {
|
||||||
|
throw new InvalidArgumentException(self::INVALID_PEER_FINGERPRINT_REASON);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (\is_string($value)) {
|
||||||
|
return ['string', $value];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!\is_array($value)) {
|
||||||
|
throw new InvalidArgumentException(self::INVALID_PEER_FINGERPRINT_REASON);
|
||||||
|
}
|
||||||
|
|
||||||
|
$items = [];
|
||||||
|
foreach ($value as $algorithm => $fingerprint) {
|
||||||
|
$items[$algorithm] = ['string', $fingerprint];
|
||||||
|
}
|
||||||
|
\ksort($items, \SORT_STRING);
|
||||||
|
|
||||||
|
return ['map', $items];
|
||||||
|
}
|
||||||
|
}
|
||||||
39
vendor/guzzlehttp/guzzle/src/Handler/UriDiagnostic.php
vendored
Normal file
39
vendor/guzzlehttp/guzzle/src/Handler/UriDiagnostic.php
vendored
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace GuzzleHttp\Handler;
|
||||||
|
|
||||||
|
use GuzzleHttp\Psr7;
|
||||||
|
use Psr\Http\Message\UriInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
final class UriDiagnostic
|
||||||
|
{
|
||||||
|
private function __construct()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function redactInMessage(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $message,
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
UriInterface $uri
|
||||||
|
): string {
|
||||||
|
$message = Psr7\Utils::redactUserInfoInString($message, (string) $uri);
|
||||||
|
|
||||||
|
$query = $uri->getQuery();
|
||||||
|
if ($query !== '') {
|
||||||
|
$message = \str_replace('?'.$query, '', $message);
|
||||||
|
}
|
||||||
|
|
||||||
|
$fragment = $uri->getFragment();
|
||||||
|
if ($fragment !== '') {
|
||||||
|
$message = \str_replace('#'.$fragment, '', $message);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Psr7\DiagnosticValue::escape($message);
|
||||||
|
}
|
||||||
|
}
|
||||||
31
vendor/guzzlehttp/guzzle/src/ProxyOptions.php
vendored
31
vendor/guzzlehttp/guzzle/src/ProxyOptions.php
vendored
|
|
@ -240,7 +240,9 @@ final class ProxyOptions
|
||||||
*
|
*
|
||||||
* This method will strip a port from the host if it is present. Domain
|
* This method will strip a port from the host if it is present. Domain
|
||||||
* patterns are matched case-insensitively. Exact IP literal patterns are
|
* patterns are matched case-insensitively. Exact IP literal patterns are
|
||||||
* matched by their normalized binary address.
|
* matched by their normalized binary address, and a host or pattern
|
||||||
|
* written in the inet_aton() shorthand a transport reads as an address,
|
||||||
|
* such as 127.1 or 0x7f000001, is matched as that address.
|
||||||
*
|
*
|
||||||
* Areas are matched in the following cases:
|
* Areas are matched in the following cases:
|
||||||
* 1. "*" (without quotes) always matches any hosts.
|
* 1. "*" (without quotes) always matches any hosts.
|
||||||
|
|
@ -388,7 +390,7 @@ final class ProxyOptions
|
||||||
$host = $address;
|
$host = $address;
|
||||||
}
|
}
|
||||||
|
|
||||||
$packedIp = self::packIpAddress($host);
|
$packedIp = self::packHostAddress($host);
|
||||||
if ($packedIp !== false) {
|
if ($packedIp !== false) {
|
||||||
return [
|
return [
|
||||||
'type' => 'ip',
|
'type' => 'ip',
|
||||||
|
|
@ -442,7 +444,7 @@ final class ProxyOptions
|
||||||
return $port === null ? null : [$host, $port];
|
return $port === null ? null : [$host, $port];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (self::packIpAddress($area) !== false) {
|
if (self::packHostAddress($area) !== false) {
|
||||||
return [$area, null];
|
return [$area, null];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -494,6 +496,9 @@ final class ProxyOptions
|
||||||
$network = \substr($network, 1, -1);
|
$network = \substr($network, 1, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// A bare rule denotes a host identity, but a CIDR rule uses network
|
||||||
|
// configuration syntax, so the inet_aton() shorthand is not read as
|
||||||
|
// a network: 127/8 would name 0.0.0.127/8 rather than 127.0.0.0/8.
|
||||||
$network = self::packIpAddress($network);
|
$network = self::packIpAddress($network);
|
||||||
if ($network === false) {
|
if ($network === false) {
|
||||||
return null;
|
return null;
|
||||||
|
|
@ -576,11 +581,27 @@ final class ProxyOptions
|
||||||
*/
|
*/
|
||||||
private static function packIpAddress(string $ip)
|
private static function packIpAddress(string $ip)
|
||||||
{
|
{
|
||||||
if (!\filter_var($ip, \FILTER_VALIDATE_IP)) {
|
if (\filter_var($ip, \FILTER_VALIDATE_IP)) {
|
||||||
|
return \inet_pton($ip);
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return \inet_pton($ip);
|
/**
|
||||||
|
* @return string|false
|
||||||
|
*/
|
||||||
|
private static function packHostAddress(string $host)
|
||||||
|
{
|
||||||
|
$packed = self::packIpAddress($host);
|
||||||
|
if ($packed !== false) {
|
||||||
|
return $packed;
|
||||||
|
}
|
||||||
|
|
||||||
|
// A transport reads the inet_aton() shorthand as an address too, so a
|
||||||
|
// rule and a request host that name one address have to match
|
||||||
|
// whichever spelling each of them happens to use.
|
||||||
|
return HostIdentity::numericIpv4ToBinary($host) ?? false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static function ipMatchesPrefix(string $address, string $network, int $prefix): bool
|
private static function ipMatchesPrefix(string $address, string $network, int $prefix): bool
|
||||||
|
|
|
||||||
|
|
@ -351,12 +351,12 @@ class RedirectMiddleware
|
||||||
$resolvedUri = $uriFactory->createUri((string) $resolvedUri);
|
$resolvedUri = $uriFactory->createUri((string) $resolvedUri);
|
||||||
}
|
}
|
||||||
} catch (\InvalidArgumentException $e) {
|
} catch (\InvalidArgumentException $e) {
|
||||||
throw new BadResponseException(\sprintf('Redirect URI, %s, is invalid: %s', Psr7\DiagnosticValue::escape($location), $e->getMessage()), $request, $response, $e);
|
throw new BadResponseException(\sprintf('Redirect URI, %s, is invalid.', Psr7\Utils::redactUriStringForMessage($location)), $request, $response, $e);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ensure that the redirect URI is allowed based on the protocols.
|
// Ensure that the redirect URI is allowed based on the protocols.
|
||||||
if (!\in_array($resolvedUri->getScheme(), $protocols, true)) {
|
if (!\in_array($resolvedUri->getScheme(), $protocols, true)) {
|
||||||
throw new BadResponseException(\sprintf('Redirect URI, %s, does not use one of the allowed redirect protocols: %s', Psr7\DiagnosticValue::escape((string) $resolvedUri), \implode(', ', $protocols)), $request, $response);
|
throw new BadResponseException(\sprintf('Redirect URI, %s, does not use one of the allowed redirect protocols: %s', Psr7\Utils::redactUriForMessage($resolvedUri), \implode(', ', $protocols)), $request, $response);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $resolvedUri;
|
return $resolvedUri;
|
||||||
|
|
|
||||||
13
vendor/guzzlehttp/guzzle/src/RequestOptions.php
vendored
13
vendor/guzzlehttp/guzzle/src/RequestOptions.php
vendored
|
|
@ -12,7 +12,7 @@ use Psr\Http\Message\UriInterface;
|
||||||
/**
|
/**
|
||||||
* This class contains a list of built-in Guzzle request options.
|
* This class contains a list of built-in Guzzle request options.
|
||||||
*
|
*
|
||||||
* @see https://github.com/guzzle/guzzle/blob/8.0/docs/request-options.md
|
* @see https://github.com/guzzle/guzzle/blob/8.1/docs/request-options.md
|
||||||
*/
|
*/
|
||||||
final class RequestOptions
|
final class RequestOptions
|
||||||
{
|
{
|
||||||
|
|
@ -383,11 +383,12 @@ final class RequestOptions
|
||||||
* as a comma- or whitespace-delimited string, array of strings, or null to
|
* as a comma- or whitespace-delimited string, array of strings, or null to
|
||||||
* specify hosts, host-and-port pairs, IP literals, IP CIDR rules, or
|
* specify hosts, host-and-port pairs, IP literals, IP CIDR rules, or
|
||||||
* wildcard rules that should not be proxied. Domain rules are matched
|
* wildcard rules that should not be proxied. Domain rules are matched
|
||||||
* case-insensitively. Exact IP literals are normalized before matching.
|
* case-insensitively. Exact IP literals are normalized before matching,
|
||||||
* CIDR rules match IP literals only and are not port-specific. Custom
|
* including the inet_aton() shorthand spellings a transport reads as an
|
||||||
* handlers can use ProxyOptions::resolve() to apply Guzzle-compatible proxy
|
* address. CIDR rules match IP literals only and are not port-specific.
|
||||||
* selection; the built-in handlers' environment-variable fallback is not
|
* Custom handlers can use ProxyOptions::resolve() to apply
|
||||||
* part of that helper.
|
* Guzzle-compatible proxy selection; the built-in handlers'
|
||||||
|
* environment-variable fallback is not part of that helper.
|
||||||
*/
|
*/
|
||||||
public const PROXY = 'proxy';
|
public const PROXY = 'proxy';
|
||||||
|
|
||||||
|
|
|
||||||
21
vendor/guzzlehttp/guzzle/src/Utils.php
vendored
21
vendor/guzzlehttp/guzzle/src/Utils.php
vendored
|
|
@ -11,6 +11,7 @@ use GuzzleHttp\Handler\CurlShareHandleState;
|
||||||
use GuzzleHttp\Handler\CurlVersion;
|
use GuzzleHttp\Handler\CurlVersion;
|
||||||
use GuzzleHttp\Handler\Proxy;
|
use GuzzleHttp\Handler\Proxy;
|
||||||
use GuzzleHttp\Handler\StreamHandler;
|
use GuzzleHttp\Handler\StreamHandler;
|
||||||
|
use GuzzleHttp\Handler\StreamTlsSessionCache;
|
||||||
use GuzzleHttp\Promise\PromiseInterface;
|
use GuzzleHttp\Promise\PromiseInterface;
|
||||||
use Psr\Http\Message\RequestInterface;
|
use Psr\Http\Message\RequestInterface;
|
||||||
use Psr\Http\Message\ResponseInterface;
|
use Psr\Http\Message\ResponseInterface;
|
||||||
|
|
@ -88,8 +89,19 @@ final class Utils
|
||||||
|
|
||||||
$handler = self::createCurlHandler($sharingMode, $handlerOptions);
|
$handler = self::createCurlHandler($sharingMode, $handlerOptions);
|
||||||
|
|
||||||
|
// Handler-scoped required sharing can also be satisfied by the stream
|
||||||
|
// handler's TLS session resumption (PHP 8.6+); persistent required
|
||||||
|
// sharing is cURL-only.
|
||||||
|
$streamCanShareSessions = (bool) \ini_get('allow_url_fopen') && StreamTlsSessionCache::isSupported();
|
||||||
|
|
||||||
if ($sharingRequired && $handler === null) {
|
if ($sharingRequired && $handler === null) {
|
||||||
throw new \RuntimeException('Required transport sharing requires the PHP cURL extension, curl_exec() or curl_multi_exec(), and a supported libcurl version with SSL support.');
|
if ($sharingMode === TransportSharing::PERSISTENT_REQUIRE) {
|
||||||
|
throw new \RuntimeException('Required persistent transport sharing requires the PHP cURL extension, curl_exec() or curl_multi_exec(), and a supported libcurl version with SSL support.');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$streamCanShareSessions) {
|
||||||
|
throw new \RuntimeException('Required transport sharing requires the PHP cURL extension (curl_exec()/curl_multi_exec()) with a supported libcurl version and SSL support, or PHP 8.6+ with the OpenSSL TLS session API and the allow_url_fopen ini setting.');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (\ini_get('allow_url_fopen')) {
|
if (\ini_get('allow_url_fopen')) {
|
||||||
|
|
@ -131,6 +143,13 @@ final class Utils
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($sharingMode === TransportSharing::HANDLER_REQUIRE && !CurlShareHandleState::supportsHandlerRequireShare()) {
|
||||||
|
// Required handler sharing can also be satisfied by the stream
|
||||||
|
// handler's TLS session resumption, so a cURL install that cannot
|
||||||
|
// share is skipped instead of failing handler selection.
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
$connectionCapOptions = self::connectionCapOptions($handlerOptions);
|
$connectionCapOptions = self::connectionCapOptions($handlerOptions);
|
||||||
if ($connectionCapOptions !== [] && !\function_exists('curl_multi_exec')) {
|
if ($connectionCapOptions !== [] && !\function_exists('curl_multi_exec')) {
|
||||||
return null;
|
return null;
|
||||||
|
|
|
||||||
7
vendor/guzzlehttp/promises/CHANGELOG.md
vendored
7
vendor/guzzlehttp/promises/CHANGELOG.md
vendored
|
|
@ -1,6 +1,13 @@
|
||||||
# CHANGELOG
|
# CHANGELOG
|
||||||
|
|
||||||
|
|
||||||
|
## 3.0.2 - 2026-08-24
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Added support for PHP 8.6
|
||||||
|
|
||||||
|
|
||||||
## 3.0.1 - 2026-08-05
|
## 3.0.1 - 2026-08-05
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
|
||||||
12
vendor/guzzlehttp/promises/README.md
vendored
12
vendor/guzzlehttp/promises/README.md
vendored
|
|
@ -19,8 +19,8 @@ composer require guzzlehttp/promises
|
||||||
|
|
||||||
| Version | Status | PHP Version |
|
| Version | Status | PHP Version |
|
||||||
|---------|--------------|--------------|
|
|---------|--------------|--------------|
|
||||||
| 3.0 | Latest | >=7.4,<8.6 |
|
| 3.0 | Latest | >=7.4,<8.7 |
|
||||||
| 2.5 | Maintenance | >=7.2.5,<8.6 |
|
| 2.5 | Maintenance | >=7.2.5,<8.7 |
|
||||||
| 1.5 | End of Life | >=5.5,<8.3 |
|
| 1.5 | End of Life | >=5.5,<8.3 |
|
||||||
|
|
||||||
## Quick Start
|
## Quick Start
|
||||||
|
|
@ -50,6 +50,14 @@ You can wait for a promise to complete synchronously:
|
||||||
$value = $promise->wait();
|
$value = $promise->wait();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
A promise's `getState()` describes how it was settled, not the eventual
|
||||||
|
outcome: a promise that was resolved with another promise, directly or by
|
||||||
|
returning one from a `then()` handler, reports `fulfilled` while the inner
|
||||||
|
promise may still be pending, and `wait()` can still throw if the inner
|
||||||
|
promise rejects. Poll the state only on promises settled with plain values,
|
||||||
|
or call `wait()` first (see
|
||||||
|
[guzzle/promises#101](https://github.com/guzzle/promises/issues/101)).
|
||||||
|
|
||||||
When using Guzzle HTTP requests, asynchronous methods return
|
When using Guzzle HTTP requests, asynchronous methods return
|
||||||
`GuzzleHttp\Promise\PromiseInterface` instances:
|
`GuzzleHttp\Promise\PromiseInterface` instances:
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -62,7 +62,16 @@ interface PromiseInterface
|
||||||
* The three states can be checked against the constants defined on
|
* The three states can be checked against the constants defined on
|
||||||
* PromiseInterface: PENDING, FULFILLED, and REJECTED.
|
* PromiseInterface: PENDING, FULFILLED, and REJECTED.
|
||||||
*
|
*
|
||||||
|
* The state describes how this promise was settled, not the eventual
|
||||||
|
* outcome: a promise that was resolved with another promise, directly or
|
||||||
|
* by returning one from a then() handler, reports FULFILLED while the
|
||||||
|
* inner promise may still be pending, and wait() can still throw if the
|
||||||
|
* inner promise rejects. Poll the state only on promises settled with
|
||||||
|
* plain values, or call wait() first.
|
||||||
|
*
|
||||||
* @return self::PENDING|self::FULFILLED|self::REJECTED
|
* @return self::PENDING|self::FULFILLED|self::REJECTED
|
||||||
|
*
|
||||||
|
* @see https://github.com/guzzle/promises/issues/101
|
||||||
*/
|
*/
|
||||||
public function getState(): string;
|
public function getState(): string;
|
||||||
|
|
||||||
|
|
@ -71,7 +80,8 @@ interface PromiseInterface
|
||||||
*
|
*
|
||||||
* @param TValue|PromiseInterface<TValue, TReason>|null $value
|
* @param TValue|PromiseInterface<TValue, TReason>|null $value
|
||||||
*
|
*
|
||||||
* @throws \RuntimeException if the promise is already resolved.
|
* @throws \LogicException if the promise is already settled with a
|
||||||
|
* conflicting resolution.
|
||||||
*/
|
*/
|
||||||
public function resolve($value = null): void;
|
public function resolve($value = null): void;
|
||||||
|
|
||||||
|
|
@ -80,7 +90,8 @@ interface PromiseInterface
|
||||||
*
|
*
|
||||||
* @param TReason $reason
|
* @param TReason $reason
|
||||||
*
|
*
|
||||||
* @throws \RuntimeException if the promise is already resolved.
|
* @throws \LogicException if the promise is already settled with a
|
||||||
|
* conflicting resolution.
|
||||||
*/
|
*/
|
||||||
public function reject($reason): void;
|
public function reject($reason): void;
|
||||||
|
|
||||||
|
|
|
||||||
20
vendor/guzzlehttp/psr7/CHANGELOG.md
vendored
20
vendor/guzzlehttp/psr7/CHANGELOG.md
vendored
|
|
@ -5,6 +5,26 @@ All notable changes to this project will be documented in this file.
|
||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
|
||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## 3.1.0 - 2026-08-24
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add `Utils::redactUriForMessage()` and `Utils::redactUriStringForMessage()` for URI diagnostics
|
||||||
|
- Add support for PHP 8.6
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Omit rejected header values and sensitive URI components from automatic exception messages
|
||||||
|
|
||||||
|
## 3.0.1 - 2026-08-24
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Prefix relative paths that begin with a colon segment with `./` instead of throwing
|
||||||
|
- Apply the `/.` prefix for authority-less `//` paths to percent-encoding normalizations as well
|
||||||
|
- Keep colon-leading first path segments when reading the paths of scheme-less non-native URIs
|
||||||
|
- Stop throwing when removing the default `file` host strands a `//` path, prefixing it with `/.`
|
||||||
|
|
||||||
## 3.0.0 - 2026-07-20
|
## 3.0.0 - 2026-07-20
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
|
||||||
4
vendor/guzzlehttp/psr7/README.md
vendored
4
vendor/guzzlehttp/psr7/README.md
vendored
|
|
@ -19,8 +19,8 @@ composer require guzzlehttp/psr7
|
||||||
|
|
||||||
| Version | Status | PHP Version |
|
| Version | Status | PHP Version |
|
||||||
|---------|--------------|--------------|
|
|---------|--------------|--------------|
|
||||||
| 3.0 | Latest | >=7.4,<8.6 |
|
| 3.1 | Latest | >=7.4,<8.7 |
|
||||||
| 2.13 | Maintenance | >=7.2.5,<8.6 |
|
| 2.13 | Maintenance | >=7.2.5,<8.7 |
|
||||||
| 1.9 | End of Life | >=5.4,<8.2 |
|
| 1.9 | End of Life | >=5.4,<8.2 |
|
||||||
|
|
||||||
## Quick Start
|
## Quick Start
|
||||||
|
|
|
||||||
26
vendor/guzzlehttp/psr7/src/MessageTrait.php
vendored
26
vendor/guzzlehttp/psr7/src/MessageTrait.php
vendored
|
|
@ -78,7 +78,7 @@ trait MessageTrait
|
||||||
public function withHeader(string $name, $value): MessageInterface
|
public function withHeader(string $name, $value): MessageInterface
|
||||||
{
|
{
|
||||||
$this->assertHeader($name);
|
$this->assertHeader($name);
|
||||||
$value = $this->normalizeHeaderValue($value);
|
$value = $this->normalizeHeaderValue($name, $value);
|
||||||
$normalized = Utils::asciiToLower($name);
|
$normalized = Utils::asciiToLower($name);
|
||||||
|
|
||||||
$new = clone $this;
|
$new = clone $this;
|
||||||
|
|
@ -97,7 +97,7 @@ trait MessageTrait
|
||||||
public function withAddedHeader(string $name, $value): MessageInterface
|
public function withAddedHeader(string $name, $value): MessageInterface
|
||||||
{
|
{
|
||||||
$this->assertHeader($name);
|
$this->assertHeader($name);
|
||||||
$value = $this->normalizeHeaderValue($value);
|
$value = $this->normalizeHeaderValue($name, $value);
|
||||||
$normalized = Utils::asciiToLower($name);
|
$normalized = Utils::asciiToLower($name);
|
||||||
|
|
||||||
$new = clone $this;
|
$new = clone $this;
|
||||||
|
|
@ -166,7 +166,7 @@ trait MessageTrait
|
||||||
$header = (string) $header;
|
$header = (string) $header;
|
||||||
|
|
||||||
$this->assertHeader($header);
|
$this->assertHeader($header);
|
||||||
$value = $this->normalizeHeaderValue($value);
|
$value = $this->normalizeHeaderValue($header, $value);
|
||||||
$normalized = Utils::asciiToLower($header);
|
$normalized = Utils::asciiToLower($header);
|
||||||
if (isset($this->headerNames[$normalized])) {
|
if (isset($this->headerNames[$normalized])) {
|
||||||
$header = $this->headerNames[$normalized];
|
$header = $this->headerNames[$normalized];
|
||||||
|
|
@ -183,17 +183,17 @@ trait MessageTrait
|
||||||
*
|
*
|
||||||
* @return string[]
|
* @return string[]
|
||||||
*/
|
*/
|
||||||
private function normalizeHeaderValue($value): array
|
private function normalizeHeaderValue(string $header, $value): array
|
||||||
{
|
{
|
||||||
if (is_array($value) && $value === []) {
|
if (is_array($value) && $value === []) {
|
||||||
throw new \InvalidArgumentException('Header value must be a non-empty array or string.');
|
throw new \InvalidArgumentException('Header value must be a non-empty array or string.');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!is_array($value)) {
|
if (!is_array($value)) {
|
||||||
return $this->trimAndValidateHeaderValues([$value]);
|
return $this->trimAndValidateHeaderValues($header, [$value]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->trimAndValidateHeaderValues($value);
|
return $this->trimAndValidateHeaderValues($header, $value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -210,9 +210,9 @@ trait MessageTrait
|
||||||
*
|
*
|
||||||
* @see https://datatracker.ietf.org/doc/html/rfc9110#section-5.5
|
* @see https://datatracker.ietf.org/doc/html/rfc9110#section-5.5
|
||||||
*/
|
*/
|
||||||
private function trimAndValidateHeaderValues(array $values): array
|
private function trimAndValidateHeaderValues(string $header, array $values): array
|
||||||
{
|
{
|
||||||
return array_map(function ($value): string {
|
return array_map(function ($value) use ($header): string {
|
||||||
if (!is_string($value)) {
|
if (!is_string($value)) {
|
||||||
throw new \InvalidArgumentException(sprintf(
|
throw new \InvalidArgumentException(sprintf(
|
||||||
'Header value must be a string or array of strings but %s provided.',
|
'Header value must be a string or array of strings but %s provided.',
|
||||||
|
|
@ -221,7 +221,7 @@ trait MessageTrait
|
||||||
}
|
}
|
||||||
|
|
||||||
$trimmed = trim($value, " \t");
|
$trimmed = trim($value, " \t");
|
||||||
$this->assertValue($trimmed);
|
$this->assertValue($header, $trimmed);
|
||||||
|
|
||||||
return $trimmed;
|
return $trimmed;
|
||||||
}, array_values($values));
|
}, array_values($values));
|
||||||
|
|
@ -254,7 +254,7 @@ trait MessageTrait
|
||||||
* obs-text = %x80-FF
|
* obs-text = %x80-FF
|
||||||
* obs-fold = CRLF 1*( SP / HTAB )
|
* obs-fold = CRLF 1*( SP / HTAB )
|
||||||
*/
|
*/
|
||||||
private function assertValue(string $value): void
|
private function assertValue(string $header, string $value): void
|
||||||
{
|
{
|
||||||
// The regular expression intentionally does not support the obs-fold
|
// The regular expression intentionally does not support the obs-fold
|
||||||
// production, because as per RFC 9112#5.2:
|
// production, because as per RFC 9112#5.2:
|
||||||
|
|
@ -269,7 +269,11 @@ trait MessageTrait
|
||||||
// obscure feature of HTTP/1.1 and thus not accepting folding is not
|
// obscure feature of HTTP/1.1 and thus not accepting folding is not
|
||||||
// likely to break any legitimate use case.
|
// likely to break any legitimate use case.
|
||||||
if (!Rfc9110::isFieldValue($value)) {
|
if (!Rfc9110::isFieldValue($value)) {
|
||||||
throw new \InvalidArgumentException(sprintf('Invalid header value: %s', DiagnosticValue::escape($value)));
|
$reason = strpbrk($value, "\r\n") !== false
|
||||||
|
? 'must not contain CR or LF characters'
|
||||||
|
: 'contains an invalid control character';
|
||||||
|
|
||||||
|
throw new \InvalidArgumentException(sprintf('Header "%s" %s.', DiagnosticValue::escape($header), $reason));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
12
vendor/guzzlehttp/psr7/src/MultipartStream.php
vendored
12
vendor/guzzlehttp/psr7/src/MultipartStream.php
vendored
|
|
@ -72,7 +72,7 @@ final class MultipartStream implements StreamInterface
|
||||||
$key = (string) $key;
|
$key = (string) $key;
|
||||||
|
|
||||||
self::validatePartHeaderName($key);
|
self::validatePartHeaderName($key);
|
||||||
self::validatePartHeaderValue($value);
|
self::validatePartHeaderValue($key, $value);
|
||||||
|
|
||||||
$str .= "{$key}: {$value}\r\n";
|
$str .= "{$key}: {$value}\r\n";
|
||||||
}
|
}
|
||||||
|
|
@ -252,7 +252,7 @@ final class MultipartStream implements StreamInterface
|
||||||
throw new \InvalidArgumentException('Multipart part header value must be a string.');
|
throw new \InvalidArgumentException('Multipart part header value must be a string.');
|
||||||
}
|
}
|
||||||
|
|
||||||
self::validatePartHeaderValue($value);
|
self::validatePartHeaderValue($key, $value);
|
||||||
|
|
||||||
$normalized[$key] = $value;
|
$normalized[$key] = $value;
|
||||||
}
|
}
|
||||||
|
|
@ -267,10 +267,14 @@ final class MultipartStream implements StreamInterface
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static function validatePartHeaderValue(string $value): void
|
private static function validatePartHeaderValue(string $name, string $value): void
|
||||||
{
|
{
|
||||||
if (!Rfc9110::isFieldValue($value)) {
|
if (!Rfc9110::isFieldValue($value)) {
|
||||||
throw new \InvalidArgumentException(sprintf('Invalid multipart part header value: %s', DiagnosticValue::escape($value)));
|
$reason = strpbrk($value, "\r\n") !== false
|
||||||
|
? 'must not contain CR or LF characters'
|
||||||
|
: 'contains an invalid control character';
|
||||||
|
|
||||||
|
throw new \InvalidArgumentException(sprintf('Multipart part header "%s" %s.', DiagnosticValue::escape($name), $reason));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
2
vendor/guzzlehttp/psr7/src/Request.php
vendored
2
vendor/guzzlehttp/psr7/src/Request.php
vendored
|
|
@ -150,7 +150,7 @@ class Request implements RequestInterface
|
||||||
$host .= ':'.$port;
|
$host .= ':'.$port;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->assertValue($host);
|
$this->assertValue('Host', $host);
|
||||||
|
|
||||||
return $host;
|
return $host;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
12
vendor/guzzlehttp/psr7/src/Uri.php
vendored
12
vendor/guzzlehttp/psr7/src/Uri.php
vendored
|
|
@ -69,7 +69,7 @@ class Uri implements UriInterface, \JsonSerializable
|
||||||
if ($uri !== '') {
|
if ($uri !== '') {
|
||||||
$parts = UriParser::parse($uri);
|
$parts = UriParser::parse($uri);
|
||||||
if ($parts === false) {
|
if ($parts === false) {
|
||||||
throw new MalformedUriException(\sprintf('Unable to parse URI: %s', DiagnosticValue::escape($uri)));
|
throw new MalformedUriException(\sprintf('Unable to parse URI: %s', Utils::redactUriStringForMessage($uri)));
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
$this->applyParts($parts);
|
$this->applyParts($parts);
|
||||||
|
|
@ -411,7 +411,10 @@ class Uri implements UriInterface, \JsonSerializable
|
||||||
* components, including the leading slash the string form adds to a
|
* components, including the leading slash the string form adds to a
|
||||||
* rootless path when an authority is present; for subclasses and other
|
* rootless path when an authority is present; for subclasses and other
|
||||||
* implementations the path is split from the string form per RFC 3986
|
* implementations the path is split from the string form per RFC 3986
|
||||||
* Appendix B, without validating or decoding any other component.
|
* Appendix B, without validating or decoding any other component. The
|
||||||
|
* scheme is only split off when the instance reports one, as a relative
|
||||||
|
* reference can begin with a segment containing a colon that the Appendix
|
||||||
|
* B expression would otherwise read as a scheme.
|
||||||
*
|
*
|
||||||
* @throws \RuntimeException If the path cannot be split from the string form.
|
* @throws \RuntimeException If the path cannot be split from the string form.
|
||||||
*
|
*
|
||||||
|
|
@ -429,7 +432,10 @@ class Uri implements UriInterface, \JsonSerializable
|
||||||
return $uri->path;
|
return $uri->path;
|
||||||
}
|
}
|
||||||
|
|
||||||
$count = preg_match('%^(?:[^:/?#]+:)?(?://[^/?#]*)?([^?#]*)%', (string) $uri, $matches);
|
$pattern = $uri->getScheme() === ''
|
||||||
|
? '%^(?://[^/?#]*)?([^?#]*)%'
|
||||||
|
: '%^(?:[^:/?#]+:)?(?://[^/?#]*)?([^?#]*)%';
|
||||||
|
$count = preg_match($pattern, (string) $uri, $matches);
|
||||||
|
|
||||||
if ($count === false) {
|
if ($count === false) {
|
||||||
throw new \RuntimeException('Unable to read the URI path: '.preg_last_error_msg());
|
throw new \RuntimeException('Unable to read the URI path: '.preg_last_error_msg());
|
||||||
|
|
|
||||||
38
vendor/guzzlehttp/psr7/src/UriNormalizer.php
vendored
38
vendor/guzzlehttp/psr7/src/UriNormalizer.php
vendored
|
|
@ -86,7 +86,11 @@ final class UriNormalizer
|
||||||
* second format in the Uri class. See
|
* second format in the Uri class. See
|
||||||
* `GuzzleHttp\Psr7\Uri::composeComponents`.
|
* `GuzzleHttp\Psr7\Uri::composeComponents`.
|
||||||
*
|
*
|
||||||
|
* When removing the host leaves a URI without an authority whose path
|
||||||
|
* begins with `//`, the path is serialized with a `/.` prefix.
|
||||||
|
*
|
||||||
* Example: file://localhost/myfile → file:///myfile
|
* Example: file://localhost/myfile → file:///myfile
|
||||||
|
* Example: file://localhost//x → file:///.//x
|
||||||
*/
|
*/
|
||||||
public const REMOVE_DEFAULT_HOST = 8;
|
public const REMOVE_DEFAULT_HOST = 8;
|
||||||
|
|
||||||
|
|
@ -166,6 +170,13 @@ final class UriNormalizer
|
||||||
* uncommon in reality. So this potential normalization is implied in PSR-7
|
* uncommon in reality. So this potential normalization is implied in PSR-7
|
||||||
* as well.
|
* as well.
|
||||||
*
|
*
|
||||||
|
* A path the URI cannot hold, such as a `//`-leading path without an
|
||||||
|
* authority or a relative-path reference whose first segment contains a
|
||||||
|
* colon, is prefixed with `/.` or `./` respectively instead of throwing, as
|
||||||
|
* `UriResolver::resolve()` does. The percent-encoding normalizations only
|
||||||
|
* do so where they rewrote the path. For example, decoding `a%41:` yields
|
||||||
|
* `./aA:`, since `aA:` would be an absolute URI with the scheme `aa`.
|
||||||
|
*
|
||||||
* @param UriInterface $uri The URI to normalize
|
* @param UriInterface $uri The URI to normalize
|
||||||
* @param int $flags A bitmask of normalizations to apply, see constants
|
* @param int $flags A bitmask of normalizations to apply, see constants
|
||||||
*
|
*
|
||||||
|
|
@ -188,6 +199,14 @@ final class UriNormalizer
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($flags & self::REMOVE_DEFAULT_HOST && $uri->getScheme() === 'file' && $uri->getHost() === 'localhost') {
|
if ($flags & self::REMOVE_DEFAULT_HOST && $uri->getScheme() === 'file' && $uri->getHost() === 'localhost') {
|
||||||
|
if ($uri->getUserInfo() === '' && $uri->getPort() === null) {
|
||||||
|
$path = Uri::rawPath($uri);
|
||||||
|
if (str_starts_with($path, '//')) {
|
||||||
|
// "/." keeps a "//" path unambiguous once the authority is gone
|
||||||
|
$uri = $uri->withPath('/.'.$path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$uri = $uri->withHost('');
|
$uri = $uri->withHost('');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -260,8 +279,7 @@ final class UriNormalizer
|
||||||
$uri = self::withNormalizedUserInfo($uri, $regex, $callback);
|
$uri = self::withNormalizedUserInfo($uri, $regex, $callback);
|
||||||
$uri = self::withNormalizedHost($uri, $regex, $callback);
|
$uri = self::withNormalizedHost($uri, $regex, $callback);
|
||||||
|
|
||||||
return $uri
|
return self::withGuardedPath($uri, self::normalizePercentEncodingInComponent(Uri::rawPath($uri), $regex, $callback))
|
||||||
->withPath(self::normalizePercentEncodingInComponent(Uri::rawPath($uri), $regex, $callback))
|
|
||||||
->withQuery(self::normalizePercentEncodingInComponent($uri->getQuery(), $regex, $callback))
|
->withQuery(self::normalizePercentEncodingInComponent($uri->getQuery(), $regex, $callback))
|
||||||
->withFragment(self::normalizePercentEncodingInComponent($uri->getFragment(), $regex, $callback));
|
->withFragment(self::normalizePercentEncodingInComponent($uri->getFragment(), $regex, $callback));
|
||||||
}
|
}
|
||||||
|
|
@ -284,12 +302,24 @@ final class UriNormalizer
|
||||||
$uri = self::withNormalizedUserInfo($uri, $regex, $callback);
|
$uri = self::withNormalizedUserInfo($uri, $regex, $callback);
|
||||||
$uri = self::withNormalizedHost($uri, $regex, $hostCallback);
|
$uri = self::withNormalizedHost($uri, $regex, $hostCallback);
|
||||||
|
|
||||||
return $uri
|
return self::withGuardedPath($uri, self::normalizePercentEncodingInComponent(Uri::rawPath($uri), $regex, $callback))
|
||||||
->withPath(self::normalizePercentEncodingInComponent(Uri::rawPath($uri), $regex, $callback))
|
|
||||||
->withQuery(self::normalizePercentEncodingInComponent($uri->getQuery(), $regex, $callback))
|
->withQuery(self::normalizePercentEncodingInComponent($uri->getQuery(), $regex, $callback))
|
||||||
->withFragment(self::normalizePercentEncodingInComponent($uri->getFragment(), $regex, $callback));
|
->withFragment(self::normalizePercentEncodingInComponent($uri->getFragment(), $regex, $callback));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the given path only when it differs from the current one, guarded
|
||||||
|
* so the write cannot throw.
|
||||||
|
*/
|
||||||
|
private static function withGuardedPath(UriInterface $uri, string $path): UriInterface
|
||||||
|
{
|
||||||
|
if ($path === Uri::rawPath($uri)) {
|
||||||
|
return $uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $uri->withPath(UriResolver::guardedPath($uri, $path));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param callable(array): string $callback
|
* @param callable(array): string $callback
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
25
vendor/guzzlehttp/psr7/src/UriResolver.php
vendored
25
vendor/guzzlehttp/psr7/src/UriResolver.php
vendored
|
|
@ -65,8 +65,8 @@ final class UriResolver
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the path, prefixed with "/." when it would otherwise start the
|
* Returns the path, prefixed with "/." or "./" when the URI could not
|
||||||
* URI's string form with an authority-like "//".
|
* otherwise hold it.
|
||||||
*
|
*
|
||||||
* A URI without an authority cannot hold a path beginning with "//" (RFC
|
* A URI without an authority cannot hold a path beginning with "//" (RFC
|
||||||
* 3986 Section 3.3), but removeDotSegments() can produce one. The "/."
|
* 3986 Section 3.3), but removeDotSegments() can produce one. The "/."
|
||||||
|
|
@ -76,16 +76,23 @@ final class UriResolver
|
||||||
* written, so the path cannot be mistaken for an authority and the prefix
|
* written, so the path cannot be mistaken for an authority and the prefix
|
||||||
* is not added.
|
* is not added.
|
||||||
*
|
*
|
||||||
|
* A relative-path reference cannot begin with a segment containing a colon
|
||||||
|
* (RFC 3986 Section 4.2), as it would be mistaken for a scheme name, but
|
||||||
|
* reference resolution and percent-encoding normalization can produce one.
|
||||||
|
* The "./" prefix the RFC prescribes resolves back to the same path.
|
||||||
|
*
|
||||||
* @see https://url.spec.whatwg.org/#url-serializing
|
* @see https://url.spec.whatwg.org/#url-serializing
|
||||||
|
* @see https://datatracker.ietf.org/doc/html/rfc3986#section-4.2
|
||||||
*
|
*
|
||||||
* @internal
|
* @internal
|
||||||
*/
|
*/
|
||||||
public static function guardedPath(UriInterface $uri, string $path): string
|
public static function guardedPath(UriInterface $uri, string $path): string
|
||||||
{
|
{
|
||||||
if (!str_starts_with($path, '//') || $uri->getAuthority() !== '') {
|
if ($uri->getAuthority() !== '') {
|
||||||
return $path;
|
return $path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (str_starts_with($path, '//')) {
|
||||||
if ($uri instanceof Uri && ($uri->getScheme() === 'http' || $uri->getScheme() === 'https')) {
|
if ($uri instanceof Uri && ($uri->getScheme() === 'http' || $uri->getScheme() === 'https')) {
|
||||||
return $path;
|
return $path;
|
||||||
}
|
}
|
||||||
|
|
@ -93,11 +100,23 @@ final class UriResolver
|
||||||
return '/.'.$path;
|
return '/.'.$path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($uri->getScheme() === '' && str_contains(explode('/', $path, 2)[0], ':')) {
|
||||||
|
return './'.$path;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $path;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts the relative URI into a new URI that is resolved against the
|
* Converts the relative URI into a new URI that is resolved against the
|
||||||
* base URI.
|
* base URI.
|
||||||
*
|
*
|
||||||
|
* When the resolved path is a relative-path reference whose first segment
|
||||||
|
* contains a colon, which would be mistaken for a scheme name (RFC 3986
|
||||||
|
* Section 4.2), it is prefixed with `./`, e.g. `./a:b`.
|
||||||
|
*
|
||||||
* @see https://datatracker.ietf.org/doc/html/rfc3986#section-5.2
|
* @see https://datatracker.ietf.org/doc/html/rfc3986#section-5.2
|
||||||
|
* @see https://datatracker.ietf.org/doc/html/rfc3986#section-4.2
|
||||||
*/
|
*/
|
||||||
public static function resolve(UriInterface $base, UriInterface $rel): UriInterface
|
public static function resolve(UriInterface $base, UriInterface $rel): UriInterface
|
||||||
{
|
{
|
||||||
|
|
|
||||||
50
vendor/guzzlehttp/psr7/src/Utils.php
vendored
50
vendor/guzzlehttp/psr7/src/Utils.php
vendored
|
|
@ -583,6 +583,56 @@ final class Utils
|
||||||
return \str_replace(\substr($authority, 0, $atPosition).'@', '***@', $subject);
|
return \str_replace(\substr($authority, 0, $atPosition).'@', '***@', $subject);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Formats a URI for automatic diagnostics.
|
||||||
|
*
|
||||||
|
* The whole userinfo component is replaced by "***", and the query and
|
||||||
|
* fragment are removed. The scheme, host, port, and path are preserved.
|
||||||
|
* The returned string is diagnostic-escaped and the formatter never
|
||||||
|
* throws.
|
||||||
|
*/
|
||||||
|
public static function redactUriForMessage(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
UriInterface $uri
|
||||||
|
): string {
|
||||||
|
try {
|
||||||
|
$raw = (string) $uri;
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
return '[unavailable URI]';
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
if ($uri->getUserInfo() !== '') {
|
||||||
|
$uri = $uri->withUserInfo('***');
|
||||||
|
}
|
||||||
|
|
||||||
|
return DiagnosticValue::escape((string) $uri->withQuery('')->withFragment(''));
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
return self::redactUriStringForMessage($raw);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Formats a raw URI for automatic diagnostics, including malformed input.
|
||||||
|
*
|
||||||
|
* The whole userinfo component is replaced by "***", and the query and
|
||||||
|
* fragment are removed. The scheme, host, port, and path are preserved
|
||||||
|
* where their boundaries can be determined safely. The returned string is
|
||||||
|
* diagnostic-escaped and the formatter never throws.
|
||||||
|
*/
|
||||||
|
public static function redactUriStringForMessage(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $uri
|
||||||
|
): string {
|
||||||
|
try {
|
||||||
|
$uri = self::redactUserInfoInString($uri, $uri);
|
||||||
|
|
||||||
|
return DiagnosticValue::escape(\substr($uri, 0, \strcspn($uri, '?#')));
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
return '[unavailable URI]';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new stream based on the input type.
|
* Create a new stream based on the input type.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
6
vendor/symfony/filesystem/Filesystem.php
vendored
6
vendor/symfony/filesystem/Filesystem.php
vendored
|
|
@ -543,11 +543,7 @@ class Filesystem
|
||||||
|
|
||||||
// Iterate in destination folder to remove obsolete entries
|
// Iterate in destination folder to remove obsolete entries
|
||||||
if ($this->exists($targetDir) && isset($options['delete']) && $options['delete']) {
|
if ($this->exists($targetDir) && isset($options['delete']) && $options['delete']) {
|
||||||
$deleteIterator = $iterator;
|
$deleteIterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($targetDir, \FilesystemIterator::SKIP_DOTS), \RecursiveIteratorIterator::CHILD_FIRST);
|
||||||
if (null === $deleteIterator) {
|
|
||||||
$flags = \FilesystemIterator::SKIP_DOTS;
|
|
||||||
$deleteIterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($targetDir, $flags), \RecursiveIteratorIterator::CHILD_FIRST);
|
|
||||||
}
|
|
||||||
$targetDirLen = \strlen($targetDir);
|
$targetDirLen = \strlen($targetDir);
|
||||||
foreach ($deleteIterator as $file) {
|
foreach ($deleteIterator as $file) {
|
||||||
$origin = $originDir.substr($file->getPathname(), $targetDirLen);
|
$origin = $originDir.substr($file->getPathname(), $targetDirLen);
|
||||||
|
|
|
||||||
2
vendor/symfony/filesystem/Path.php
vendored
2
vendor/symfony/filesystem/Path.php
vendored
|
|
@ -746,7 +746,7 @@ final class Path
|
||||||
|
|
||||||
// Collapse ".." with the previous part, if one exists
|
// Collapse ".." with the previous part, if one exists
|
||||||
// Don't collapse ".." if the previous part is also ".."
|
// Don't collapse ".." if the previous part is also ".."
|
||||||
if ('..' === $part && \count($canonicalParts) > 0 && '..' !== $canonicalParts[\count($canonicalParts) - 1]) {
|
if ('..' === $part && $canonicalParts && '..' !== $canonicalParts[\count($canonicalParts) - 1]) {
|
||||||
array_pop($canonicalParts);
|
array_pop($canonicalParts);
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue