community/aws-cli: enable, upgrade to 2.15.57

This commit is contained in:
fossdd 2024-05-25 10:35:40 +00:00
parent 0d3e842205
commit 87cdbf05e6
9 changed files with 778 additions and 5 deletions

View File

@ -1,15 +1,14 @@
# Contributor: Valery Kartel <valery.kartel@gmail.com>
# Maintainer:
pkgname=aws-cli
pkgver=2.15.30
pkgver=2.15.57
pkgrel=0
pkgdesc="Universal Command Line Interface for Amazon Web Services (v2)"
url="https://github.com/aws/aws-cli"
# s390x: py3-awscrt doesn't support big-endian
# arm*, ppc64le: py3-awscrt
# x86: fails check, so most likely not supported on 32-bit anymore
# no python 3.12 support: https://github.com/aws/aws-cli/issues/8342
#arch="all !x86 !armhf !armv7 !ppc64le !s390x"
arch="all !x86 !armhf !armv7 !ppc64le !s390x"
license="Apache-2.0"
depends="
py3-awscrt
@ -45,6 +44,14 @@ subpackages="
$pkgname-bash-completion:bashcomp
"
source="$pkgname-$pkgver.tar.gz::https://github.com/aws/aws-cli/archive/$pkgver.tar.gz
allow-egg-info.patch
aws-cli-v2-ruamel-yaml-v4.patch
aws-cli-v2-tz-fix.patch
botocore-2551.patch
botocore-2922.patch
botocore-2924.patch
botocore-2967.patch
botocore-2990-rebased.patch
fix-env.patch
tmpfile-index.patch
"
@ -74,7 +81,7 @@ check() {
# each core takes like 2gb, so be a little conservative
local cores
cores="$(nproc)"
cores="$((cores / 2))"
cores="$((cores / 3))"
python3 -m venv --clear --without-pip --system-site-packages .testenv
.testenv/bin/python3 -m installer .dist/*.whl
@ -130,7 +137,15 @@ doc() {
}
sha512sums="
eedf2027a36122bad94e6090a4511fc9438f509a19d97b57fc79ec9b4f7df88003f04584fc9ecbf499b7d37430bf00d2eba333f1354dea8c69805b7bdffa8406 aws-cli-2.15.30.tar.gz
cd35ed602d9a06a58fb16ded5f1f559c9d1841fc96fdad8402e625aa56b2ca246a5b631f0915ec091591ac63cce296842f0a87b26c77c9b83a81bcbb2e1d0e15 aws-cli-2.15.57.tar.gz
ed05961344a0acb8c7b8aaf913f8e782c90ece23aa89006112e9b1c2ea6d0cfa21efc6b38ac1f6b604182b09824675fe6ef68f6394c3b10dfa9e75f82c7cd387 aws-cli-v2-ruamel-yaml-v4.patch
66c813b52d1fa402d89cd4381237175b3c8f52546e60f4a9703c27281f4a27d579751b90468a84208f94743b3c58e041cf9e9c9f28387ea06897575db8e46946 aws-cli-v2-tz-fix.patch
e0647b8690c139617da696318124b74a19b938c56d836f6531a86e031ec9fd9e43798807a3519d78c9abba59aa8b6679623dc75b579ce57ebb4dff55569fa18d botocore-2551.patch
0b47b8329863dd71e4aeac18eb1175b47a68e45df0becae738ec3bf72f908cf96f99dffd7714c3835e014b1c100701a6652e1db3d2e415162fcc9c8a098cf201 botocore-2922.patch
99d8e7755149033fa86ae246de07f6c320991d111affd9a98618182fa1fdebf466e3be693671bb1dda4d5ac514f001446ff68cf156b98f33dc48c9a541d89c53 botocore-2924.patch
506733c13d1034684baf771c872aadbc4bad8037e05f588acde68071b73bd2d8fcf41a21562324210316cbdd1929c44ceca3273f174caf7af6470d8b27518fb1 botocore-2967.patch
79ff2138a7b9dbddedd059f0e1e3ef8f92708a93e2c65293de33298de65e5a3360e6e8af05c18b4763f1a7221198f4aa1ca2afd901fd748ad545ffea5fe8471a botocore-2990-rebased.patch
850b4ca6e09f96cba8968d2d7a3b60bd5206d7c4c257ba927b576336a992796b51263506cdd100314604ec7ad493a26326bf059ccd7f96772ad9326aa68ee41e fix-env.patch
ecfad03dafbdc8cdc73f41a432f0acb53ce3636f58a8b3d0cfcef06617f24ee8588e0648ee7290148bcfc8a3007d00b865899d473a6653d970a55be63760551f tmpfile-index.patch
3780a1b8af4d0098315beacd9a6a7cb4ebac08d4c1194dc55b5db6f0a28c46e45da85f0b94da2e005c5327686f8c4a2b99ee45b3cf847b3bbf5d82c80b433f50 allow-egg-info.patch
"

View File

@ -0,0 +1,13 @@
diff --git a/tests/dependencies/test_closure.py b/tests/dependencies/test_closure.py
index 6231438cd..b5f2b0515 100644
--- a/tests/dependencies/test_closure.py
+++ b/tests/dependencies/test_closure.py
@@ -83,7 +83,7 @@ class Package:
snake_case_name = name.replace("-", "_")
for sitepackages in site.getsitepackages():
for filename in os.listdir(sitepackages):
- if fnmatch.fnmatch(filename, f"{snake_case_name}-*.dist-info"):
+ if fnmatch.fnmatch(filename, f"{snake_case_name}-*.dist-info") or fnmatch.fnmatch(filename, f"{snake_case_name}-*.egg-info"):
return importlib.metadata.Distribution.at(
os.path.join(sitepackages, filename)
)

View File

@ -0,0 +1,111 @@
From 0331e399231b6cdb54b7b3bdd01a793647053cdd Mon Sep 17 00:00:00 2001
From: Chih-Hsuan Yen <645432-yan12125@users.noreply.gitlab.com>
Date: Sat, 29 Jul 2023 17:32:06 +0800
Subject: [PATCH] Support newer ruamel-yaml
* ruamel-yaml 0.17.22 comes with a style change that affects test results.
From https://sourceforge.net/p/ruamel-yaml/code/ci/0.17.22/tree/CHANGES
> plain scalars: put single words longer than width on a line of their own, instead of after the previous line
* ruamel-yaml 0.17.29 introduces an issue with add_constructor and
DEFAULT_MAPPING_TAG, and the issue is fixed with 0.17.36 [1], hence the
new lower bound.
[1] https://sourceforge.net/p/ruamel-yaml/tickets/482/
---
pyproject.toml | 4 ++--
tests/functional/eks/testdata/output_combined | 6 ++++--
.../eks/testdata/output_combined_changed_ordering | 6 ++++--
tests/functional/eks/testdata/output_single | 3 ++-
tests/functional/eks/testdata/valid_old_api_version_updated | 3 ++-
5 files changed, 14 insertions(+), 8 deletions(-)
diff --git a/pyproject.toml b/pyproject.toml
index fef9a3068d5..1e436a88149 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -31,7 +31,7 @@ dependencies = [
"colorama>=0.2.5,<0.4.7",
"docutils>=0.10,<0.20",
"cryptography>=3.3.2,<40.0.2",
- "ruamel.yaml>=0.15.0,<=0.17.21",
+ "ruamel.yaml>=0.17.36,<=0.17.39",
# ruamel.yaml only requires ruamel.yaml.clib for Python versions
# less than or equal to Python 3.10. In order to ensure we have
# a consistent dependency closure across all Python versions,
@@ -98,4 +98,4 @@ filterwarnings = [
]
[tool.black]
-line-length = 80
\ No newline at end of file
+line-length = 80
diff --git a/tests/functional/eks/testdata/output_combined b/tests/functional/eks/testdata/output_combined
index 8e9ce098f72..8e30727da6e 100644
--- a/tests/functional/eks/testdata/output_combined
+++ b/tests/functional/eks/testdata/output_combined
@@ -1,11 +1,13 @@
apiVersion: v1
clusters:
- cluster:
- certificate-authority-data: DATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATA=
+ certificate-authority-data:
+ DATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATA=
server: https://existingEndpoint.eks.amazonaws.com
name: arn:aws:eks:us-west-2:111222333444:cluster/Existing
- cluster:
- certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tDQpWR1Z6ZEdsdVp5QkVZWFJoRFFwVVpYTjBhVzVuSUVSaGRHRU5DbFJsYzNScGJtY2dSR0YwWVEwS2EzVmlaWEp1WlhSbGN6QWVGdzBLVkdWemRHbHVaeUJFWVhSaERRcFVaWE4wYVc1bklFUmhkR0ZWQkFNVERRcHJkV0psY201bGRHVnpNQUVpTUEwS1ZHVnpkR2x1WnlCRVlYUmhEUXBVWlhOMGFXNW5JRVJoZEdFTkNsUmxjM1JwYm1jZ1JHRjBZY3UvR1FnbmFTcDNZaHBDTWhGVVpYTjBhVzVuSUVSaGRHRXl3clZqeEpWNjNwNFVHRmpZdHdGR1drUldJVkV1VkdWemRHbHVaeUJFWVhSaGJzT0MxSVJiTDhPd0lpMVhiWGg2VkdWemRHbHVaeUJFWVhSaFpXVndTTk9VVUZKNmN5QWJaaFpnWVNkTUV3MEtGMVJsYzNScGJtY2dSR0YwWVFZRFZSMFBBUUVFQkFNQ0FsUmxjM1JwYm1jZ1JHRjBZUUV3RFFvR0NTcElEUXBVWlhOMGFXNW5JRVJoZEdGcEgxc1pPRTNMa3lrMU9DWUNHUloyTEZjM3paOCtHell3WEZSbGMzUnBibWNnUkdGMFlYMUR5NjFNMVlGV1AxWVRIMVJsYzNScGJtY2dSR0YwWVd0aE5oMVphM2dWUDBGaGNSWjdKaW9oZVc4N1JsUmxjM1JwYm1jZ1JHRjBZUVpIVHd4NE9IdzZmZz09DQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t
+ certificate-authority-data:
+ LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tDQpWR1Z6ZEdsdVp5QkVZWFJoRFFwVVpYTjBhVzVuSUVSaGRHRU5DbFJsYzNScGJtY2dSR0YwWVEwS2EzVmlaWEp1WlhSbGN6QWVGdzBLVkdWemRHbHVaeUJFWVhSaERRcFVaWE4wYVc1bklFUmhkR0ZWQkFNVERRcHJkV0psY201bGRHVnpNQUVpTUEwS1ZHVnpkR2x1WnlCRVlYUmhEUXBVWlhOMGFXNW5JRVJoZEdFTkNsUmxjM1JwYm1jZ1JHRjBZY3UvR1FnbmFTcDNZaHBDTWhGVVpYTjBhVzVuSUVSaGRHRXl3clZqeEpWNjNwNFVHRmpZdHdGR1drUldJVkV1VkdWemRHbHVaeUJFWVhSaGJzT0MxSVJiTDhPd0lpMVhiWGg2VkdWemRHbHVaeUJFWVhSaFpXVndTTk9VVUZKNmN5QWJaaFpnWVNkTUV3MEtGMVJsYzNScGJtY2dSR0YwWVFZRFZSMFBBUUVFQkFNQ0FsUmxjM1JwYm1jZ1JHRjBZUUV3RFFvR0NTcElEUXBVWlhOMGFXNW5JRVJoZEdGcEgxc1pPRTNMa3lrMU9DWUNHUloyTEZjM3paOCtHell3WEZSbGMzUnBibWNnUkdGMFlYMUR5NjFNMVlGV1AxWVRIMVJsYzNScGJtY2dSR0YwWVd0aE5oMVphM2dWUDBGaGNSWjdKaW9oZVc4N1JsUmxjM1JwYm1jZ1JHRjBZUVpIVHd4NE9IdzZmZz09DQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t
server: https://endpoint.amazonaws.com
name: arn:aws:eks:region:111222333444:cluster/ExampleCluster
contexts:
diff --git a/tests/functional/eks/testdata/output_combined_changed_ordering b/tests/functional/eks/testdata/output_combined_changed_ordering
index 79da5622cb0..d016d87d72b 100644
--- a/tests/functional/eks/testdata/output_combined_changed_ordering
+++ b/tests/functional/eks/testdata/output_combined_changed_ordering
@@ -29,11 +29,13 @@ users:
command: aws
clusters:
- cluster:
- certificate-authority-data: DATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATA=
+ certificate-authority-data:
+ DATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATA=
server: https://existingEndpoint.eks.amazonaws.com
name: arn:aws:eks:us-west-2:111222333444:cluster/Existing
- cluster:
- certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tDQpWR1Z6ZEdsdVp5QkVZWFJoRFFwVVpYTjBhVzVuSUVSaGRHRU5DbFJsYzNScGJtY2dSR0YwWVEwS2EzVmlaWEp1WlhSbGN6QWVGdzBLVkdWemRHbHVaeUJFWVhSaERRcFVaWE4wYVc1bklFUmhkR0ZWQkFNVERRcHJkV0psY201bGRHVnpNQUVpTUEwS1ZHVnpkR2x1WnlCRVlYUmhEUXBVWlhOMGFXNW5JRVJoZEdFTkNsUmxjM1JwYm1jZ1JHRjBZY3UvR1FnbmFTcDNZaHBDTWhGVVpYTjBhVzVuSUVSaGRHRXl3clZqeEpWNjNwNFVHRmpZdHdGR1drUldJVkV1VkdWemRHbHVaeUJFWVhSaGJzT0MxSVJiTDhPd0lpMVhiWGg2VkdWemRHbHVaeUJFWVhSaFpXVndTTk9VVUZKNmN5QWJaaFpnWVNkTUV3MEtGMVJsYzNScGJtY2dSR0YwWVFZRFZSMFBBUUVFQkFNQ0FsUmxjM1JwYm1jZ1JHRjBZUUV3RFFvR0NTcElEUXBVWlhOMGFXNW5JRVJoZEdGcEgxc1pPRTNMa3lrMU9DWUNHUloyTEZjM3paOCtHell3WEZSbGMzUnBibWNnUkdGMFlYMUR5NjFNMVlGV1AxWVRIMVJsYzNScGJtY2dSR0YwWVd0aE5oMVphM2dWUDBGaGNSWjdKaW9oZVc4N1JsUmxjM1JwYm1jZ1JHRjBZUVpIVHd4NE9IdzZmZz09DQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t
+ certificate-authority-data:
+ LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tDQpWR1Z6ZEdsdVp5QkVZWFJoRFFwVVpYTjBhVzVuSUVSaGRHRU5DbFJsYzNScGJtY2dSR0YwWVEwS2EzVmlaWEp1WlhSbGN6QWVGdzBLVkdWemRHbHVaeUJFWVhSaERRcFVaWE4wYVc1bklFUmhkR0ZWQkFNVERRcHJkV0psY201bGRHVnpNQUVpTUEwS1ZHVnpkR2x1WnlCRVlYUmhEUXBVWlhOMGFXNW5JRVJoZEdFTkNsUmxjM1JwYm1jZ1JHRjBZY3UvR1FnbmFTcDNZaHBDTWhGVVpYTjBhVzVuSUVSaGRHRXl3clZqeEpWNjNwNFVHRmpZdHdGR1drUldJVkV1VkdWemRHbHVaeUJFWVhSaGJzT0MxSVJiTDhPd0lpMVhiWGg2VkdWemRHbHVaeUJFWVhSaFpXVndTTk9VVUZKNmN5QWJaaFpnWVNkTUV3MEtGMVJsYzNScGJtY2dSR0YwWVFZRFZSMFBBUUVFQkFNQ0FsUmxjM1JwYm1jZ1JHRjBZUUV3RFFvR0NTcElEUXBVWlhOMGFXNW5JRVJoZEdGcEgxc1pPRTNMa3lrMU9DWUNHUloyTEZjM3paOCtHell3WEZSbGMzUnBibWNnUkdGMFlYMUR5NjFNMVlGV1AxWVRIMVJsYzNScGJtY2dSR0YwWVd0aE5oMVphM2dWUDBGaGNSWjdKaW9oZVc4N1JsUmxjM1JwYm1jZ1JHRjBZUVpIVHd4NE9IdzZmZz09DQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t
server: https://endpoint.amazonaws.com
name: arn:aws:eks:region:111222333444:cluster/ExampleCluster
kind: Config
diff --git a/tests/functional/eks/testdata/output_single b/tests/functional/eks/testdata/output_single
index fb1e0b9b1ef..cdf5fb6523e 100644
--- a/tests/functional/eks/testdata/output_single
+++ b/tests/functional/eks/testdata/output_single
@@ -1,7 +1,8 @@
apiVersion: v1
clusters:
- cluster:
- certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tDQpWR1Z6ZEdsdVp5QkVZWFJoRFFwVVpYTjBhVzVuSUVSaGRHRU5DbFJsYzNScGJtY2dSR0YwWVEwS2EzVmlaWEp1WlhSbGN6QWVGdzBLVkdWemRHbHVaeUJFWVhSaERRcFVaWE4wYVc1bklFUmhkR0ZWQkFNVERRcHJkV0psY201bGRHVnpNQUVpTUEwS1ZHVnpkR2x1WnlCRVlYUmhEUXBVWlhOMGFXNW5JRVJoZEdFTkNsUmxjM1JwYm1jZ1JHRjBZY3UvR1FnbmFTcDNZaHBDTWhGVVpYTjBhVzVuSUVSaGRHRXl3clZqeEpWNjNwNFVHRmpZdHdGR1drUldJVkV1VkdWemRHbHVaeUJFWVhSaGJzT0MxSVJiTDhPd0lpMVhiWGg2VkdWemRHbHVaeUJFWVhSaFpXVndTTk9VVUZKNmN5QWJaaFpnWVNkTUV3MEtGMVJsYzNScGJtY2dSR0YwWVFZRFZSMFBBUUVFQkFNQ0FsUmxjM1JwYm1jZ1JHRjBZUUV3RFFvR0NTcElEUXBVWlhOMGFXNW5JRVJoZEdGcEgxc1pPRTNMa3lrMU9DWUNHUloyTEZjM3paOCtHell3WEZSbGMzUnBibWNnUkdGMFlYMUR5NjFNMVlGV1AxWVRIMVJsYzNScGJtY2dSR0YwWVd0aE5oMVphM2dWUDBGaGNSWjdKaW9oZVc4N1JsUmxjM1JwYm1jZ1JHRjBZUVpIVHd4NE9IdzZmZz09DQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t
+ certificate-authority-data:
+ LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tDQpWR1Z6ZEdsdVp5QkVZWFJoRFFwVVpYTjBhVzVuSUVSaGRHRU5DbFJsYzNScGJtY2dSR0YwWVEwS2EzVmlaWEp1WlhSbGN6QWVGdzBLVkdWemRHbHVaeUJFWVhSaERRcFVaWE4wYVc1bklFUmhkR0ZWQkFNVERRcHJkV0psY201bGRHVnpNQUVpTUEwS1ZHVnpkR2x1WnlCRVlYUmhEUXBVWlhOMGFXNW5JRVJoZEdFTkNsUmxjM1JwYm1jZ1JHRjBZY3UvR1FnbmFTcDNZaHBDTWhGVVpYTjBhVzVuSUVSaGRHRXl3clZqeEpWNjNwNFVHRmpZdHdGR1drUldJVkV1VkdWemRHbHVaeUJFWVhSaGJzT0MxSVJiTDhPd0lpMVhiWGg2VkdWemRHbHVaeUJFWVhSaFpXVndTTk9VVUZKNmN5QWJaaFpnWVNkTUV3MEtGMVJsYzNScGJtY2dSR0YwWVFZRFZSMFBBUUVFQkFNQ0FsUmxjM1JwYm1jZ1JHRjBZUUV3RFFvR0NTcElEUXBVWlhOMGFXNW5JRVJoZEdGcEgxc1pPRTNMa3lrMU9DWUNHUloyTEZjM3paOCtHell3WEZSbGMzUnBibWNnUkdGMFlYMUR5NjFNMVlGV1AxWVRIMVJsYzNScGJtY2dSR0YwWVd0aE5oMVphM2dWUDBGaGNSWjdKaW9oZVc4N1JsUmxjM1JwYm1jZ1JHRjBZUVpIVHd4NE9IdzZmZz09DQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t
server: https://endpoint.amazonaws.com
name: arn:aws:eks:region:111222333444:cluster/ExampleCluster
contexts:
diff --git a/tests/functional/eks/testdata/valid_old_api_version_updated b/tests/functional/eks/testdata/valid_old_api_version_updated
index fb1e0b9b1ef..cdf5fb6523e 100644
--- a/tests/functional/eks/testdata/valid_old_api_version_updated
+++ b/tests/functional/eks/testdata/valid_old_api_version_updated
@@ -1,7 +1,8 @@
apiVersion: v1
clusters:
- cluster:
- certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tDQpWR1Z6ZEdsdVp5QkVZWFJoRFFwVVpYTjBhVzVuSUVSaGRHRU5DbFJsYzNScGJtY2dSR0YwWVEwS2EzVmlaWEp1WlhSbGN6QWVGdzBLVkdWemRHbHVaeUJFWVhSaERRcFVaWE4wYVc1bklFUmhkR0ZWQkFNVERRcHJkV0psY201bGRHVnpNQUVpTUEwS1ZHVnpkR2x1WnlCRVlYUmhEUXBVWlhOMGFXNW5JRVJoZEdFTkNsUmxjM1JwYm1jZ1JHRjBZY3UvR1FnbmFTcDNZaHBDTWhGVVpYTjBhVzVuSUVSaGRHRXl3clZqeEpWNjNwNFVHRmpZdHdGR1drUldJVkV1VkdWemRHbHVaeUJFWVhSaGJzT0MxSVJiTDhPd0lpMVhiWGg2VkdWemRHbHVaeUJFWVhSaFpXVndTTk9VVUZKNmN5QWJaaFpnWVNkTUV3MEtGMVJsYzNScGJtY2dSR0YwWVFZRFZSMFBBUUVFQkFNQ0FsUmxjM1JwYm1jZ1JHRjBZUUV3RFFvR0NTcElEUXBVWlhOMGFXNW5JRVJoZEdGcEgxc1pPRTNMa3lrMU9DWUNHUloyTEZjM3paOCtHell3WEZSbGMzUnBibWNnUkdGMFlYMUR5NjFNMVlGV1AxWVRIMVJsYzNScGJtY2dSR0YwWVd0aE5oMVphM2dWUDBGaGNSWjdKaW9oZVc4N1JsUmxjM1JwYm1jZ1JHRjBZUVpIVHd4NE9IdzZmZz09DQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t
+ certificate-authority-data:
+ LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tDQpWR1Z6ZEdsdVp5QkVZWFJoRFFwVVpYTjBhVzVuSUVSaGRHRU5DbFJsYzNScGJtY2dSR0YwWVEwS2EzVmlaWEp1WlhSbGN6QWVGdzBLVkdWemRHbHVaeUJFWVhSaERRcFVaWE4wYVc1bklFUmhkR0ZWQkFNVERRcHJkV0psY201bGRHVnpNQUVpTUEwS1ZHVnpkR2x1WnlCRVlYUmhEUXBVWlhOMGFXNW5JRVJoZEdFTkNsUmxjM1JwYm1jZ1JHRjBZY3UvR1FnbmFTcDNZaHBDTWhGVVpYTjBhVzVuSUVSaGRHRXl3clZqeEpWNjNwNFVHRmpZdHdGR1drUldJVkV1VkdWemRHbHVaeUJFWVhSaGJzT0MxSVJiTDhPd0lpMVhiWGg2VkdWemRHbHVaeUJFWVhSaFpXVndTTk9VVUZKNmN5QWJaaFpnWVNkTUV3MEtGMVJsYzNScGJtY2dSR0YwWVFZRFZSMFBBUUVFQkFNQ0FsUmxjM1JwYm1jZ1JHRjBZUUV3RFFvR0NTcElEUXBVWlhOMGFXNW5JRVJoZEdGcEgxc1pPRTNMa3lrMU9DWUNHUloyTEZjM3paOCtHell3WEZSbGMzUnBibWNnUkdGMFlYMUR5NjFNMVlGV1AxWVRIMVJsYzNScGJtY2dSR0YwWVd0aE5oMVphM2dWUDBGaGNSWjdKaW9oZVc4N1JsUmxjM1JwYm1jZ1JHRjBZUVpIVHd4NE9IdzZmZz09DQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t
server: https://endpoint.amazonaws.com
name: arn:aws:eks:region:111222333444:cluster/ExampleCluster
contexts:

View File

@ -0,0 +1,42 @@
From 95aa5ccc7bfaeafc0373e8472c8459030ac18920 Mon Sep 17 00:00:00 2001
From: Avimitin <dev@avimit.in>
Date: Tue, 21 Mar 2023 12:36:48 +0800
Subject: [PATCH] Force timezone info to fix possible test failure
This commit will affects the test
`test_credentials.py::SSOSessionTest::test_token_chosen_from_provider`.
This test will throw a `RuntimeError: Credentials were refreshed, but
the refreshed credentials are still expired` because the timestamp call
uses system local time, which is different from UTC time. And this will
cause an unexpected failure if the test is not run in a system configured
with `TZ=UTC`.
Signed-off-by: Avimitin <dev@avimit.in>
---
tests/functional/botocore/test_credentials.py | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/tests/functional/botocore/test_credentials.py b/tests/functional/botocore/test_credentials.py
index 843be90e484..9da9bf2b443 100644
--- a/tests/functional/botocore/test_credentials.py
+++ b/tests/functional/botocore/test_credentials.py
@@ -19,7 +19,7 @@
import mock
import tempfile
import shutil
-from datetime import datetime, timedelta
+from datetime import datetime, timedelta, timezone
import sys
import pytest
@@ -47,8 +47,8 @@
from botocore.tokens import SSOTokenProvider
from botocore.utils import datetime2timestamp
-TIME_IN_ONE_HOUR = datetime.utcnow() + timedelta(hours=1)
-TIME_IN_SIX_MONTHS = datetime.utcnow() + timedelta(hours=4320)
+TIME_IN_ONE_HOUR = datetime.now(tz=timezone.utc) + timedelta(hours=1)
+TIME_IN_SIX_MONTHS = datetime.now(tz=timezone.utc) + timedelta(hours=4320)
class TestCredentialRefreshRaces(unittest.TestCase):

View File

@ -0,0 +1,367 @@
From c6c63e7b7e248966503d8ff4ac2dfe9e43f1862d Mon Sep 17 00:00:00 2001
From: Nate Prewitt <nate.prewitt@gmail.com>
Date: Mon, 1 Nov 2021 11:32:35 -0700
Subject: [PATCH] Update six from 1.10.0 to 1.16.0
---
.changes/next-release/feature-six-62143.json | 5 +
awscli/botocore/vendored/six.py | 186 ++++++++++++++++---
2 files changed, 163 insertions(+), 28 deletions(-)
create mode 100644 .changes/next-release/feature-six-62143.json
diff --git a/.changes/next-release/feature-six-62143.json b/.changes/next-release/feature-six-62143.json
new file mode 100644
index 0000000000..c4393201ee
--- /dev/null
+++ b/.changes/next-release/feature-six-62143.json
@@ -0,0 +1,5 @@
+{
+ "type": "feature",
+ "category": "``six``",
+ "description": "Updated vendored version of ``six`` from 1.10.0 to 1.16.0"
+}
diff --git a/awscli/botocore/vendored/six.py b/awscli/botocore/vendored/six.py
index 190c0239cd..4e15675d8b 100644
--- a/awscli/botocore/vendored/six.py
+++ b/awscli/botocore/vendored/six.py
@@ -1,6 +1,4 @@
-"""Utilities for writing code that runs on Python 2 and 3"""
-
-# Copyright (c) 2010-2015 Benjamin Peterson
+# Copyright (c) 2010-2020 Benjamin Peterson
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
@@ -20,6 +18,8 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
+"""Utilities for writing code that runs on Python 2 and 3"""
+
from __future__ import absolute_import
import functools
@@ -29,7 +29,7 @@
import types
__author__ = "Benjamin Peterson <benjamin@python.org>"
-__version__ = "1.10.0"
+__version__ = "1.16.0"
# Useful for very coarse version differentiation.
@@ -71,6 +71,11 @@ def __len__(self):
MAXSIZE = int((1 << 63) - 1)
del X
+if PY34:
+ from importlib.util import spec_from_loader
+else:
+ spec_from_loader = None
+
def _add_doc(func, doc):
"""Add documentation to a function."""
@@ -186,6 +191,11 @@ def find_module(self, fullname, path=None):
return self
return None
+ def find_spec(self, fullname, path, target=None):
+ if fullname in self.known_modules:
+ return spec_from_loader(fullname, self)
+ return None
+
def __get_module(self, fullname):
try:
return self.known_modules[fullname]
@@ -223,6 +233,12 @@ def get_code(self, fullname):
return None
get_source = get_code # same as get_code
+ def create_module(self, spec):
+ return self.load_module(spec.name)
+
+ def exec_module(self, module):
+ pass
+
_importer = _SixMetaPathImporter(__name__)
@@ -241,6 +257,7 @@ class _MovedItems(_LazyModule):
MovedAttribute("map", "itertools", "builtins", "imap", "map"),
MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"),
MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"),
+ MovedAttribute("getoutput", "commands", "subprocess"),
MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"),
MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"),
MovedAttribute("reduce", "__builtin__", "functools"),
@@ -254,18 +271,21 @@ class _MovedItems(_LazyModule):
MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"),
MovedModule("builtins", "__builtin__"),
MovedModule("configparser", "ConfigParser"),
+ MovedModule("collections_abc", "collections", "collections.abc" if sys.version_info >= (3, 3) else "collections"),
MovedModule("copyreg", "copy_reg"),
MovedModule("dbm_gnu", "gdbm", "dbm.gnu"),
- MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"),
+ MovedModule("dbm_ndbm", "dbm", "dbm.ndbm"),
+ MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread" if sys.version_info < (3, 9) else "_thread"),
MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
MovedModule("http_cookies", "Cookie", "http.cookies"),
MovedModule("html_entities", "htmlentitydefs", "html.entities"),
MovedModule("html_parser", "HTMLParser", "html.parser"),
MovedModule("http_client", "httplib", "http.client"),
+ MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"),
+ MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"),
MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"),
MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"),
MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"),
- MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"),
MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"),
MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"),
MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"),
@@ -337,10 +357,12 @@ class Module_six_moves_urllib_parse(_LazyModule):
MovedAttribute("quote_plus", "urllib", "urllib.parse"),
MovedAttribute("unquote", "urllib", "urllib.parse"),
MovedAttribute("unquote_plus", "urllib", "urllib.parse"),
+ MovedAttribute("unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes"),
MovedAttribute("urlencode", "urllib", "urllib.parse"),
MovedAttribute("splitquery", "urllib", "urllib.parse"),
MovedAttribute("splittag", "urllib", "urllib.parse"),
MovedAttribute("splituser", "urllib", "urllib.parse"),
+ MovedAttribute("splitvalue", "urllib", "urllib.parse"),
MovedAttribute("uses_fragment", "urlparse", "urllib.parse"),
MovedAttribute("uses_netloc", "urlparse", "urllib.parse"),
MovedAttribute("uses_params", "urlparse", "urllib.parse"),
@@ -416,6 +438,8 @@ class Module_six_moves_urllib_request(_LazyModule):
MovedAttribute("URLopener", "urllib", "urllib.request"),
MovedAttribute("FancyURLopener", "urllib", "urllib.request"),
MovedAttribute("proxy_bypass", "urllib", "urllib.request"),
+ MovedAttribute("parse_http_list", "urllib2", "urllib.request"),
+ MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"),
]
for attr in _urllib_request_moved_attributes:
setattr(Module_six_moves_urllib_request, attr.name, attr)
@@ -631,13 +655,16 @@ def u(s):
import io
StringIO = io.StringIO
BytesIO = io.BytesIO
+ del io
_assertCountEqual = "assertCountEqual"
if sys.version_info[1] <= 1:
_assertRaisesRegex = "assertRaisesRegexp"
_assertRegex = "assertRegexpMatches"
+ _assertNotRegex = "assertNotRegexpMatches"
else:
_assertRaisesRegex = "assertRaisesRegex"
_assertRegex = "assertRegex"
+ _assertNotRegex = "assertNotRegex"
else:
def b(s):
return s
@@ -659,6 +686,7 @@ def indexbytes(buf, i):
_assertCountEqual = "assertItemsEqual"
_assertRaisesRegex = "assertRaisesRegexp"
_assertRegex = "assertRegexpMatches"
+ _assertNotRegex = "assertNotRegexpMatches"
_add_doc(b, """Byte literal""")
_add_doc(u, """Text literal""")
@@ -675,15 +703,23 @@ def assertRegex(self, *args, **kwargs):
return getattr(self, _assertRegex)(*args, **kwargs)
+def assertNotRegex(self, *args, **kwargs):
+ return getattr(self, _assertNotRegex)(*args, **kwargs)
+
+
if PY3:
exec_ = getattr(moves.builtins, "exec")
def reraise(tp, value, tb=None):
- if value is None:
- value = tp()
- if value.__traceback__ is not tb:
- raise value.with_traceback(tb)
- raise value
+ try:
+ if value is None:
+ value = tp()
+ if value.__traceback__ is not tb:
+ raise value.with_traceback(tb)
+ raise value
+ finally:
+ value = None
+ tb = None
else:
def exec_(_code_, _globs_=None, _locs_=None):
@@ -699,19 +735,19 @@ def exec_(_code_, _globs_=None, _locs_=None):
exec("""exec _code_ in _globs_, _locs_""")
exec_("""def reraise(tp, value, tb=None):
- raise tp, value, tb
+ try:
+ raise tp, value, tb
+ finally:
+ tb = None
""")
-if sys.version_info[:2] == (3, 2):
+if sys.version_info[:2] > (3,):
exec_("""def raise_from(value, from_value):
- if from_value is None:
- raise value
- raise value from from_value
-""")
-elif sys.version_info[:2] > (3, 2):
- exec_("""def raise_from(value, from_value):
- raise value from from_value
+ try:
+ raise value from from_value
+ finally:
+ value = None
""")
else:
def raise_from(value, from_value):
@@ -786,13 +822,33 @@ def print_(*args, **kwargs):
_add_doc(reraise, """Reraise an exception.""")
if sys.version_info[0:2] < (3, 4):
+ # This does exactly the same what the :func:`py3:functools.update_wrapper`
+ # function does on Python versions after 3.2. It sets the ``__wrapped__``
+ # attribute on ``wrapper`` object and it doesn't raise an error if any of
+ # the attributes mentioned in ``assigned`` and ``updated`` are missing on
+ # ``wrapped`` object.
+ def _update_wrapper(wrapper, wrapped,
+ assigned=functools.WRAPPER_ASSIGNMENTS,
+ updated=functools.WRAPPER_UPDATES):
+ for attr in assigned:
+ try:
+ value = getattr(wrapped, attr)
+ except AttributeError:
+ continue
+ else:
+ setattr(wrapper, attr, value)
+ for attr in updated:
+ getattr(wrapper, attr).update(getattr(wrapped, attr, {}))
+ wrapper.__wrapped__ = wrapped
+ return wrapper
+ _update_wrapper.__doc__ = functools.update_wrapper.__doc__
+
def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS,
updated=functools.WRAPPER_UPDATES):
- def wrapper(f):
- f = functools.wraps(wrapped, assigned, updated)(f)
- f.__wrapped__ = wrapped
- return f
- return wrapper
+ return functools.partial(_update_wrapper, wrapped=wrapped,
+ assigned=assigned, updated=updated)
+ wraps.__doc__ = functools.wraps.__doc__
+
else:
wraps = functools.wraps
@@ -802,10 +858,22 @@ def with_metaclass(meta, *bases):
# This requires a bit of explanation: the basic idea is to make a dummy
# metaclass for one level of class instantiation that replaces itself with
# the actual metaclass.
- class metaclass(meta):
+ class metaclass(type):
def __new__(cls, name, this_bases, d):
- return meta(name, bases, d)
+ if sys.version_info[:2] >= (3, 7):
+ # This version introduced PEP 560 that requires a bit
+ # of extra care (we mimic what is done by __build_class__).
+ resolved_bases = types.resolve_bases(bases)
+ if resolved_bases is not bases:
+ d['__orig_bases__'] = bases
+ else:
+ resolved_bases = bases
+ return meta(name, resolved_bases, d)
+
+ @classmethod
+ def __prepare__(cls, name, this_bases):
+ return meta.__prepare__(name, bases)
return type.__new__(metaclass, 'temporary_class', (), {})
@@ -821,13 +889,75 @@ def wrapper(cls):
orig_vars.pop(slots_var)
orig_vars.pop('__dict__', None)
orig_vars.pop('__weakref__', None)
+ if hasattr(cls, '__qualname__'):
+ orig_vars['__qualname__'] = cls.__qualname__
return metaclass(cls.__name__, cls.__bases__, orig_vars)
return wrapper
+def ensure_binary(s, encoding='utf-8', errors='strict'):
+ """Coerce **s** to six.binary_type.
+
+ For Python 2:
+ - `unicode` -> encoded to `str`
+ - `str` -> `str`
+
+ For Python 3:
+ - `str` -> encoded to `bytes`
+ - `bytes` -> `bytes`
+ """
+ if isinstance(s, binary_type):
+ return s
+ if isinstance(s, text_type):
+ return s.encode(encoding, errors)
+ raise TypeError("not expecting type '%s'" % type(s))
+
+
+def ensure_str(s, encoding='utf-8', errors='strict'):
+ """Coerce *s* to `str`.
+
+ For Python 2:
+ - `unicode` -> encoded to `str`
+ - `str` -> `str`
+
+ For Python 3:
+ - `str` -> `str`
+ - `bytes` -> decoded to `str`
+ """
+ # Optimization: Fast return for the common case.
+ if type(s) is str:
+ return s
+ if PY2 and isinstance(s, text_type):
+ return s.encode(encoding, errors)
+ elif PY3 and isinstance(s, binary_type):
+ return s.decode(encoding, errors)
+ elif not isinstance(s, (text_type, binary_type)):
+ raise TypeError("not expecting type '%s'" % type(s))
+ return s
+
+
+def ensure_text(s, encoding='utf-8', errors='strict'):
+ """Coerce *s* to six.text_type.
+
+ For Python 2:
+ - `unicode` -> `unicode`
+ - `str` -> `unicode`
+
+ For Python 3:
+ - `str` -> `str`
+ - `bytes` -> decoded to `str`
+ """
+ if isinstance(s, binary_type):
+ return s.decode(encoding, errors)
+ elif isinstance(s, text_type):
+ return s
+ else:
+ raise TypeError("not expecting type '%s'" % type(s))
+
+
def python_2_unicode_compatible(klass):
"""
- A decorator that defines __unicode__ and __str__ methods under Python 2.
+ A class decorator that defines __unicode__ and __str__ methods under Python 2.
Under Python 3 it does nothing.
To support Python 2 and 3 with a single code base, define a __str__ method

View File

@ -0,0 +1,36 @@
From 59489584f929b2893a5909c9009d3bdd556552a9 Mon Sep 17 00:00:00 2001
From: Nate Prewitt <nate.prewitt@gmail.com>
Date: Mon, 20 Feb 2023 11:17:51 -0700
Subject: [PATCH] Defer to system defaults for cipher suites with urllib3 2.0+
---
awscli/botocore/httpsession.py | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/awscli/botocore/httpsession.py b/awscli/botocore/httpsession.py
index 97a03644d6..48e2e5d269 100644
--- a/awscli/botocore/httpsession.py
+++ b/awscli/botocore/httpsession.py
@@ -20,7 +20,6 @@
from urllib3.exceptions import SSLError as URLLib3SSLError
from urllib3.util.retry import Retry
from urllib3.util.ssl_ import (
- DEFAULT_CIPHERS,
OP_NO_COMPRESSION,
PROTOCOL_TLS,
OP_NO_SSLv2,
@@ -49,6 +48,14 @@
except ImportError:
from urllib3.util.ssl_ import SSLContext
+try:
+ from urllib3.util.ssl_ import DEFAULT_CIPHERS
+except ImportError:
+ # Defer to system configuration starting with
+ # urllib3 2.0. This will choose the ciphers provided by
+ # Openssl 1.1.1+ or secure system defaults.
+ DEFAULT_CIPHERS = None
+
import botocore.awsrequest
from botocore.compat import (
IPV6_ADDRZ_RE,

View File

@ -0,0 +1,27 @@
From 5ec04be95d1531bf551056f80d3f7d84d48e5138 Mon Sep 17 00:00:00 2001
From: Thomas Grainger <tagrain@gmail.com>
Date: Fri, 28 Apr 2023 12:06:22 +0100
Subject: [PATCH] Do not set_ciphers(DEFAULT_CIPHERS) if DEFAULT_CIPHERS is
None
Fixes #2921
---
awscli/botocore/httpsession.py | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/awscli/botocore/httpsession.py b/awscli/botocore/httpsession.py
index 48e2e5d269..b3fe6e6c0c 100644
--- a/awscli/botocore/httpsession.py
+++ b/awscli/botocore/httpsession.py
@@ -113,7 +113,10 @@ def create_urllib3_context(
context = SSLContext(ssl_version)
- context.set_ciphers(ciphers or DEFAULT_CIPHERS)
+ if ciphers:
+ context.set_ciphers(ciphers)
+ elif DEFAULT_CIPHERS:
+ context.set_ciphers(DEFAULT_CIPHERS)
# Setting the default here, as we may have no ssl module on import
cert_reqs = ssl.CERT_REQUIRED if cert_reqs is None else cert_reqs

View File

@ -0,0 +1,85 @@
diff -Naur tests/unit/botocore/test_client.py awscli-2.15.40_/tests/unit/botocore/test_client.py
--- tests/unit/botocore/test_client.py 2024-04-20 15:00:39.465686191 +0800
+++ awscli-2.15.40_/tests/unit/botocore/test_client.py 2024-04-20 15:07:29.335115713 +0800
@@ -960,7 +960,7 @@
lines = [
(' Creates an iterator that will paginate through responses '
'from :py:meth:`MyService.Client.test_operation`.'),
- ' **Request Syntax** ',
+ ' **Request Syntax**',
' ::',
' response_iterator = paginator.paginate(',
" Foo='string',",
@@ -976,17 +976,17 @@
' :type Bar: string',
' :param Bar: Documents Bar',
' :type PaginationConfig: dict',
- ' :param PaginationConfig: ',
+ ' :param PaginationConfig:',
(' A dictionary that provides parameters to control '
'pagination.'),
- ' - **MaxItems** *(integer) --* ',
+ ' - **MaxItems** *(integer) --*',
(' The total number of items to return. If the total '
'number of items available is more than the value specified '
'in max-items then a ``NextToken`` will be provided in the '
'output that you can use to resume pagination.'),
- ' - **PageSize** *(integer) --* ',
+ ' - **PageSize** *(integer) --*',
' The size of each page.',
- ' - **StartingToken** *(string) --* ',
+ ' - **StartingToken** *(string) --*',
(' A token to specify where to start paginating. This is '
'the ``NextToken`` from a previous response.'),
' :returns: None',
diff -Naur tests/unit/botocore/test_waiters.py awscli-2.15.40_/tests/unit/botocore/test_waiters.py
--- tests/unit/botocore/test_waiters.py 2024-04-20 15:00:39.469019486 +0800
+++ awscli-2.15.40_/tests/unit/botocore/test_waiters.py 2024-04-20 15:04:08.810188250 +0800
@@ -648,7 +648,7 @@
(' Polls :py:meth:`MyService.Client.foo` every 1 '
'seconds until a successful state is reached. An error '
'is returned after 1 failed checks.'),
- ' **Request Syntax** ',
+ ' **Request Syntax**',
' ::',
' waiter.wait(',
" bar='string'",
diff -Naur tests/unit/botocore/test_utils.py awscli-2.15.40_/tests/unit/botocore/test_utils.py
--- tests/unit/botocore/test_utils.py 2024-04-20 12:09:38.883650919 +0800
+++ awscli-2.15.40_/tests/unit/botocore/test_utils.py 2024-04-20 12:11:56.434812142 +0800
@@ -1000,17 +1000,24 @@
'https://bucket.s3.amazonaws.com/key.txt')
-class TestSwitchToChunkedEncodingForNonSeekableObjects(unittest.TestCase):
- def test_switch_to_chunked_encodeing_for_stream_like_object(self):
- request = AWSRequest(
- method='POST', headers={},
- data=io.BufferedIOBase(b"some initial binary data"),
- url='https://foo.amazonaws.com/bucket/key.txt'
- )
- prepared_request = request.prepare()
- self.assertEqual(
- prepared_request.headers, {'Transfer-Encoding': 'chunked'}
- )
+def test_chunked_encoding_used_for_stream_like_object():
+ class BufferedStream(io.BufferedIOBase):
+ """Class to ensure seek/tell don't work, but read is implemented."""
+
+ def __init__(self, value):
+ self.value = io.BytesIO(value)
+
+ def read(self, size=-1):
+ return self.value.read(size)
+
+ request = AWSRequest(
+ method='POST',
+ headers={},
+ data=BufferedStream(b"some initial binary data"),
+ url='https://foo.amazonaws.com/bucket/key.txt',
+ )
+ prepared_request = request.prepare()
+ assert prepared_request.headers == {'Transfer-Encoding': 'chunked'}
class TestInstanceCache(unittest.TestCase):

View File

@ -0,0 +1,77 @@
From 86564e713ba922feafe3feb7883d5305cb6a0ec2 Mon Sep 17 00:00:00 2001
From: Nate Prewitt <nate.prewitt@gmail.com>
Date: Wed, 26 Jul 2023 17:36:30 -0600
Subject: [PATCH 1/3] Move 100-continue behavior to use request API
---
awscli/botocore/awsrequest.py | 37 +++++++++++++++++++++----------------
1 file changed, 21 insertions(+), 16 deletions(-)
diff --git a/awscli/botocore/awsrequest.py b/awscli/botocore/awsrequest.py
index f00a0dde57..9123e65c9d 100644
--- a/awscli/botocore/awsrequest.py
+++ b/awscli/botocore/awsrequest.py
@@ -66,33 +66,34 @@ class AWSConnection:
def __init__(self, *args, **kwargs):
super(AWSConnection, self).__init__(*args, **kwargs)
self._original_response_cls = self.response_class
- # We'd ideally hook into httplib's states, but they're all
- # __mangled_vars so we use our own state var. This variable is set
- # when we receive an early response from the server. If this value is
- # set to True, any calls to send() are noops. This value is reset to
- # false every time _send_request is called. This is to workaround the
- # fact that py2.6 (and only py2.6) has a separate send() call for the
- # body in _send_request, as opposed to endheaders(), which is where the
- # body is sent in all versions > 2.6.
+ # This variable is set when we receive an early response from the
+ # server. If this value is set to True, any calls to send() are noops.
+ # This value is reset to false every time _send_request is called.
+ # This is to workaround changes in urllib3 2.0 which uses separate
+ # send() calls in request() instead of delegating to endheaders(),
+ # which is where the body is sent in CPython's HTTPConnection.
self._response_received = False
self._expect_header_set = False
+ self._send_called = False
def close(self):
super(AWSConnection, self).close()
# Reset all of our instance state we were tracking.
self._response_received = False
self._expect_header_set = False
+ self._send_called = False
self.response_class = self._original_response_cls
- def _send_request(self, method, url, body, headers, *args, **kwargs):
+ def request(self, method, url, body=None, headers=None, *args, **kwargs):
+ if headers is None:
+ headers = {}
self._response_received = False
if headers.get('Expect', b'') == b'100-continue':
self._expect_header_set = True
else:
self._expect_header_set = False
self.response_class = self._original_response_cls
- rval = super(AWSConnection, self)._send_request(
- method, url, body, headers, *args, **kwargs)
+ rval = super().request(method, url, body, headers, *args, **kwargs)
self._expect_header_set = False
return rval
@@ -210,8 +210,15 @@ def _send_message_body(self, message_body):
def send(self, str):
if self._response_received:
- logger.debug("send() called, but reseponse already received. "
- "Not sending data.")
+ if not self._send_called:
+ # urllib3 2.0 chunks and calls send potentially
+ # thousands of times inside `request` unlike the
+ # standard library. Only log this once for sanity.
+ logger.debug(
+ "send() called, but response already received. "
+ "Not sending data."
+ )
+ self._send_called = True
return
return super(AWSConnection, self).send(str)