Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

S3 Endpoint Resolver #300

Merged
merged 41 commits into from
Jun 11, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
346038d
wip
waahm7 Jun 2, 2023
a58567a
initial wip
waahm7 Jun 2, 2023
f5d2ce0
first working test
waahm7 Jun 2, 2023
bb2b3c4
update names
waahm7 Jun 2, 2023
794e0a3
add cmake flag
waahm7 Jun 2, 2023
68ef762
update cmake config
waahm7 Jun 2, 2023
01007bf
add the include folder
waahm7 Jun 2, 2023
cccf470
remove unused length
waahm7 Jun 2, 2023
929d4a7
Shuffle code around and have a compile time flag
waahm7 Jun 2, 2023
d041c20
Add docs and error handling
waahm7 Jun 2, 2023
b12ba58
Update CI
waahm7 Jun 2, 2023
cfaace0
clean up
waahm7 Jun 2, 2023
385e09f
cleanup structs
waahm7 Jun 2, 2023
c8dcecf
remove from header cheacker for now
waahm7 Jun 2, 2023
fe8332e
Add generated comment
waahm7 Jun 2, 2023
950c7bb
clean up
waahm7 Jun 2, 2023
1741966
remove define from c files
waahm7 Jun 2, 2023
70a42aa
PR feedback
waahm7 Jun 4, 2023
b770a1b
Merge branch 'main' into s3-endpoint-generate
waahm7 Jun 4, 2023
0c959b1
update generated files with latest script
waahm7 Jun 4, 2023
e4fd685
fix clang
waahm7 Jun 4, 2023
f0048ac
add script
waahm7 Jun 4, 2023
a6b4dbe
add test modify lines
waahm7 Jun 5, 2023
846337e
cleanup and remove resolve endpoint function as well
waahm7 Jun 5, 2023
3b62109
update names and script
waahm7 Jun 5, 2023
45f196c
update script name
waahm7 Jun 5, 2023
69a6337
update script
waahm7 Jun 5, 2023
82cb6f1
lint fix
waahm7 Jun 5, 2023
cd06f6a
fix script
waahm7 Jun 5, 2023
a616a20
update bucket name
waahm7 Jun 5, 2023
054758b
Update to join
waahm7 Jun 5, 2023
fe78015
Fix O(n) complexity
waahm7 Jun 5, 2023
afe543e
move static to beginning
waahm7 Jun 5, 2023
fcfe1ec
Update tests/s3_endpoint_resolver_tests.c
waahm7 Jun 5, 2023
705f87c
Remove simple test
waahm7 Jun 5, 2023
7d7f7b2
Use dict to escape
waahm7 Jun 5, 2023
8a236ff
Update cmake flag
waahm7 Jun 5, 2023
c7afe7c
Add the flag in test
waahm7 Jun 5, 2023
bb5edb4
Add 2 more tests
waahm7 Jun 6, 2023
e92aff5
Update endpoint artifacts script (#306)
waahm7 Jun 7, 2023
49a3912
Merge branch 'main' into s3-endpoint-generate
waahm7 Jun 11, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ jobs:
./linux-container-ci.sh ${{ env.BUILDER_VERSION }} aws-crt-${{ matrix.image }} build -p ${{ env.PACKAGE_NAME }}

linux-compiler-compat:
runs-on: ubuntu-20.04 # latest
runs-on: ubuntu-22.04 # latest
strategy:
matrix:
compiler:
Expand All @@ -59,10 +59,10 @@ jobs:
- name: Build ${{ env.PACKAGE_NAME }}
run: |
aws s3 cp s3://aws-crt-test-stuff/ci/${{ env.BUILDER_VERSION }}/linux-container-ci.sh ./linux-container-ci.sh && chmod a+x ./linux-container-ci.sh
./linux-container-ci.sh ${{ env.BUILDER_VERSION }} aws-crt-${{ env.LINUX_BASE_IMAGE }} build -p ${{ env.PACKAGE_NAME }} --compiler=${{ matrix.compiler }} --cmake-extra=-DASSERT_LOCK_HELD=ON
./linux-container-ci.sh ${{ env.BUILDER_VERSION }} aws-crt-${{ env.LINUX_BASE_IMAGE }} build -p ${{ env.PACKAGE_NAME }} --compiler=${{ matrix.compiler }} --cmake-extra=-DASSERT_LOCK_HELD=ON --cmake-extra=-DAWS_ENABLE_S3_ENDPOINT_RESOLVER=ON

clang-sanitizers:
runs-on: ubuntu-20.04 # latest
runs-on: ubuntu-22.04 # latest
strategy:
matrix:
sanitizers: [",thread", ",address,undefined"]
Expand All @@ -74,7 +74,7 @@ jobs:
./linux-container-ci.sh ${{ env.BUILDER_VERSION }} aws-crt-${{ env.LINUX_BASE_IMAGE }} build -p ${{ env.PACKAGE_NAME }} --compiler=clang-11 --cmake-extra=-DENABLE_SANITIZERS=ON --cmake-extra=-DSANITIZERS="${{ matrix.sanitizers }}" --cmake-extra=-DASSERT_LOCK_HELD=ON

linux-shared-libs:
runs-on: ubuntu-20.04 # latest
runs-on: ubuntu-22.04 # latest
steps:
# We can't use the `uses: docker://image` version yet, GitHub lacks authentication for actions -> packages
- name: Build ${{ env.PACKAGE_NAME }}
Expand All @@ -83,7 +83,7 @@ jobs:
./linux-container-ci.sh ${{ env.BUILDER_VERSION }} aws-crt-${{ env.LINUX_BASE_IMAGE }} build -p ${{ env.PACKAGE_NAME }} --cmake-extra=-DBUILD_SHARED_LIBS=ON --cmake-extra=-DASSERT_LOCK_HELD=ON

byo-crypto:
runs-on: ubuntu-20.04 # latest
runs-on: ubuntu-22.04 # latest
steps:
# We can't use the `uses: docker://image` version yet, GitHub lacks authentication for actions -> packages
- name: Build ${{ env.PACKAGE_NAME }}
Expand Down Expand Up @@ -130,7 +130,7 @@ jobs:
python .\aws-c-s3\build\deps\aws-c-common\scripts\appverifier_ctest.py --build_directory .\aws-c-s3\build\aws-c-s3

osx:
runs-on: macos-12 # latest
runs-on: macos-13 # latest
steps:
- name: Checkout Sources
uses: actions/checkout@v3
Expand All @@ -143,7 +143,7 @@ jobs:
# Test downstream repos.
# This should not be required because we can run into a chicken and egg problem if there is a change that needs some fix in a downstream repo.
downstream:
runs-on: ubuntu-20.04 # latest
runs-on: ubuntu-22.04 # latest
steps:
# We can't use the `uses: docker://image` version yet, GitHub lacks authentication for actions -> packages
- name: Build ${{ env.PACKAGE_NAME }}
Expand Down
12 changes: 10 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ endif()
option(ASSERT_LOCK_HELD "Enable ASSERT_SYNCED_DATA_LOCK_HELD for checking thread issue" OFF)
option(ENABLE_MOCK_SERVER_TESTS "Whether to run the integration tests that rely on pre-configured mock server" OFF)
option(ENABLE_MRAP_TESTS "Whether to run the integration tests that rely on pre-configured multi-region access point" OFF)
option(AWS_ENABLE_S3_ENDPOINT_RESOLVER "Whether to include the s3 endpoint resolver and related config files" OFF)

if (ASSERT_LOCK_HELD)
add_definitions(-DASSERT_LOCK_HELD)
Expand Down Expand Up @@ -52,6 +53,9 @@ file(GLOB AWS_S3_PRIVATE_HEADERS
file(GLOB AWS_S3_ROOT_SRC
"source/*.c"
)
file(GLOB AWS_S3_ENDPOINT_RESOLVER_SRC
"source/s3_endpoint_resolver/*.c"
)

if (WIN32)
if (MSVC)
Expand All @@ -75,9 +79,10 @@ file(GLOB S3_HEADERS

file(GLOB S3_SRC
${AWS_S3_ROOT_SRC}
${AWS_S3_MODEL_SRC}
${AWS_S3_EXTERNAL_SRC}
)
if (AWS_ENABLE_S3_ENDPOINT_RESOLVER)
list(APPEND S3_SRC ${AWS_S3_ENDPOINT_RESOLVER_SRC})
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't understand how this works, just throw out my question:
So, this will only compile the source/s3_endpoint_resolver/*.c when the cmake config is set. What about the header file? Will Cmake not compile the header files as well?

Copy link
Contributor Author

@waahm7 waahm7 Jun 5, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it will only include the source when the CMake configuration is set. The header file is always included to simplify things and we warn users not to use it unless it's enabled.

endif()

add_library(${PROJECT_NAME} ${S3_HEADERS} ${S3_SRC})
aws_set_common_properties(${PROJECT_NAME})
Expand All @@ -91,6 +96,9 @@ set_target_properties(${PROJECT_NAME} PROPERTIES VERSION 1.0.0)
set_target_properties(${PROJECT_NAME} PROPERTIES SOVERSION 0unstable)

target_compile_definitions(${PROJECT_NAME} PRIVATE -DCJSON_HIDE_SYMBOLS)
if (AWS_ENABLE_S3_ENDPOINT_RESOLVER)
target_compile_definitions(${PROJECT_NAME} PRIVATE "-DAWS_ENABLE_S3_ENDPOINT_RESOLVER")
endif()

target_include_directories(${PROJECT_NAME} PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
Expand Down
12 changes: 12 additions & 0 deletions include/aws/s3/private/s3_endpoint_resolver.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#ifndef AWS_S3_ENDPOINT_RESOLVER_PRIVATE_H
#define AWS_S3_ENDPOINT_RESOLVER_PRIVATE_H

/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/

extern const struct aws_byte_cursor aws_s3_endpoint_resolver_partitions;
extern const struct aws_byte_cursor aws_s3_endpoint_rule_set;

#endif /* AWS_S3_ENDPOINT_RESOLVER_PRIVATE_H */
27 changes: 27 additions & 0 deletions include/aws/s3/s3_endpoint_resolver.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#ifndef AWS_S3_ENDPOINT_RESOLVER_H
#define AWS_S3_ENDPOINT_RESOLVER_H

/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/

#include <aws/s3/private/s3_endpoint_resolver.h>
#include <aws/s3/s3.h>
AWS_PUSH_SANE_WARNING_LEVEL

struct aws_endpoints_request_context;
struct aws_endpoints_rule_engine;
AWS_EXTERN_C_BEGIN

/**
* Creates a new S3 endpoint resolver.
* Warning: Before using this header, you have to enable it by
* setting cmake config AWS_ENABLE_S3_ENDPOINT_RESOLVER=ON
*/
AWS_S3_API
struct aws_endpoints_rule_engine *aws_s3_endpoint_resolver_new(struct aws_allocator *allocator);

AWS_EXTERN_C_END
AWS_POP_SANE_WARNING_LEVEL
#endif /* AWS_S3_ENDPOINT_RESOLVER_H */
116 changes: 116 additions & 0 deletions scripts/update_s3_endpoint_resolver_artifacts.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
# This script pulls latest 'partitions.json' and 's3-endpoint-rule-set.json' from Git.
# You will need a secret in secrets manager which has the 'ruleset-url' and 'ruleset-token'.
# It uses the latest files to generate 'source/s3_endpoint_resolver/aws_s3_endpoint_rule_set.c' and
# 'source/s3_endpoint_resolver/aws_s3_endpoint_resolver_partition.c'

import json
import boto3
import requests


def escape_char(c):
escape_dict = {
'\\': '\\\\',
'\'': '\\\'',
'\0': '\\0',
'\a': '\\a',
'\b': '\\b',
'\f': '\\f',
'\n': '\\n',
'\r': '\\r',
'\t': '\\t',
'\v': '\\v'
}

return escape_dict.get(c, c)


def get_header():
return """\
/**
* Copyright Amazon.com, Inc. or its affiliates.
* All Rights Reserved. SPDX-License-Identifier: Apache-2.0.
*/

#include <aws/s3/s3_endpoint_resolver.h>

/**
* This file is generated using scripts/update_s3_endpoint_resolver_artifacts.py.
* Do not modify directly. */
/* clang-format off */

"""


def generate_c_file_from_json(json_content, c_file_name, c_struct_name):
num_chars_per_line = 20

try:
# Compact the json
compact_json_str = json.dumps(json_content, separators=(',', ':'))
compact_c = []
for i in range(0, len(compact_json_str), num_chars_per_line):
compact_c.append(
', '.join("'{}'".format(escape_char(char)) for char in compact_json_str[i:i + num_chars_per_line]))

# Write json to a C file
with open(c_file_name, 'w') as f:
f.write(get_header())
f.write(f"static const char s_generated_array[] = {{\n\t")
f.write(",\n\t".join(compact_c))
f.write("};\n\n")

f.write(f"const struct aws_byte_cursor {c_struct_name} = {{\n\t")
f.write(f".len = {len(compact_json_str)},\n\t")
f.write(f".ptr = (uint8_t *) s_generated_array\n}};\n")

print(f"{c_file_name} has been created successfully.")

except Exception as e:
print(f"An error occurred: {e}")


def get_secret_from_secrets_manager(secret_name, region_name):
session = boto3.session.Session()
client = session.client(
service_name='secretsmanager',
region_name=region_name
)

try:
get_secret_value_response = client.get_secret_value(
SecretId=secret_name
)
except Exception as e:
raise e

return json.loads(get_secret_value_response['SecretString'])


def download_from_git(url, token=None):
headers = {'Accept': 'application/vnd.github+json'}
if token is not None:
headers['Authorization'] = f"Bearer {token}"
http_response = requests.get(url, headers=headers)
if http_response.status_code != 200:
raise Exception(f"HTTP Status code is {http_response.status_code}")

return json.loads(http_response.content.decode())


if __name__ == '__main__':
git_secret = get_secret_from_secrets_manager("s3/endpoint/resolver/artifacts/git", "us-east-1")

rule_set = download_from_git(git_secret['ruleset-url'], git_secret['ruleset-token'])
partition = download_from_git('https://raw.githubusercontent.com/awslabs/smithy/main/smithy-rules-engine/src/main'
'/resources/software/amazon/smithy/rulesengine/language/partitions.json')

generate_c_file_from_json(
rule_set,
'source/s3_endpoint_resolver/aws_s3_endpoint_rule_set.c',
'aws_s3_endpoint_rule_set')

generate_c_file_from_json(
partition,
'source/s3_endpoint_resolver/aws_s3_endpoint_resolver_partition.c',
'aws_s3_endpoint_resolver_partitions')
104 changes: 104 additions & 0 deletions source/s3_endpoint_resolver/aws_s3_endpoint_resolver_partition.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
/**
* Copyright Amazon.com, Inc. or its affiliates.
* All Rights Reserved. SPDX-License-Identifier: Apache-2.0.
*/

#include <aws/s3/s3_endpoint_resolver.h>

/**
* This file is generated using scripts/update_s3_endpoint_resolver_artifacts.py.
* Do not modify directly. */
/* clang-format off */

static const char s_generated_array[] = {
'{', '"', 'v', 'e', 'r', 's', 'i', 'o', 'n', '"', ':', '"', '1', '.', '1', '"', ',', '"', 'p', 'a',
'r', 't', 'i', 't', 'i', 'o', 'n', 's', '"', ':', '[', '{', '"', 'i', 'd', '"', ':', '"', 'a', 'w',
's', '"', ',', '"', 'r', 'e', 'g', 'i', 'o', 'n', 'R', 'e', 'g', 'e', 'x', '"', ':', '"', '^', '(',
'u', 's', '|', 'e', 'u', '|', 'a', 'p', '|', 's', 'a', '|', 'c', 'a', '|', 'm', 'e', '|', 'a', 'f',
')', '-', '\\', '\\', 'w', '+', '-', '\\', '\\', 'd', '+', '$', '"', ',', '"', 'r', 'e', 'g', 'i', 'o',
'n', 's', '"', ':', '{', '"', 'a', 'f', '-', 's', 'o', 'u', 't', 'h', '-', '1', '"', ':', '{', '}',
',', '"', 'a', 'p', '-', 'e', 'a', 's', 't', '-', '1', '"', ':', '{', '}', ',', '"', 'a', 'p', '-',
'n', 'o', 'r', 't', 'h', 'e', 'a', 's', 't', '-', '1', '"', ':', '{', '}', ',', '"', 'a', 'p', '-',
'n', 'o', 'r', 't', 'h', 'e', 'a', 's', 't', '-', '2', '"', ':', '{', '}', ',', '"', 'a', 'p', '-',
'n', 'o', 'r', 't', 'h', 'e', 'a', 's', 't', '-', '3', '"', ':', '{', '}', ',', '"', 'a', 'p', '-',
's', 'o', 'u', 't', 'h', '-', '1', '"', ':', '{', '}', ',', '"', 'a', 'p', '-', 's', 'o', 'u', 't',
'h', 'e', 'a', 's', 't', '-', '1', '"', ':', '{', '}', ',', '"', 'a', 'p', '-', 's', 'o', 'u', 't',
'h', 'e', 'a', 's', 't', '-', '2', '"', ':', '{', '}', ',', '"', 'a', 'p', '-', 's', 'o', 'u', 't',
'h', 'e', 'a', 's', 't', '-', '3', '"', ':', '{', '}', ',', '"', 'c', 'a', '-', 'c', 'e', 'n', 't',
'r', 'a', 'l', '-', '1', '"', ':', '{', '}', ',', '"', 'e', 'u', '-', 'c', 'e', 'n', 't', 'r', 'a',
'l', '-', '1', '"', ':', '{', '}', ',', '"', 'e', 'u', '-', 'n', 'o', 'r', 't', 'h', '-', '1', '"',
':', '{', '}', ',', '"', 'e', 'u', '-', 's', 'o', 'u', 't', 'h', '-', '1', '"', ':', '{', '}', ',',
'"', 'e', 'u', '-', 'w', 'e', 's', 't', '-', '1', '"', ':', '{', '}', ',', '"', 'e', 'u', '-', 'w',
'e', 's', 't', '-', '2', '"', ':', '{', '}', ',', '"', 'e', 'u', '-', 'w', 'e', 's', 't', '-', '3',
'"', ':', '{', '}', ',', '"', 'm', 'e', '-', 'c', 'e', 'n', 't', 'r', 'a', 'l', '-', '1', '"', ':',
'{', '}', ',', '"', 'm', 'e', '-', 's', 'o', 'u', 't', 'h', '-', '1', '"', ':', '{', '}', ',', '"',
's', 'a', '-', 'e', 'a', 's', 't', '-', '1', '"', ':', '{', '}', ',', '"', 'u', 's', '-', 'e', 'a',
's', 't', '-', '1', '"', ':', '{', '}', ',', '"', 'u', 's', '-', 'e', 'a', 's', 't', '-', '2', '"',
':', '{', '}', ',', '"', 'u', 's', '-', 'w', 'e', 's', 't', '-', '1', '"', ':', '{', '}', ',', '"',
'u', 's', '-', 'w', 'e', 's', 't', '-', '2', '"', ':', '{', '}', ',', '"', 'a', 'w', 's', '-', 'g',
'l', 'o', 'b', 'a', 'l', '"', ':', '{', '}', '}', ',', '"', 'o', 'u', 't', 'p', 'u', 't', 's', '"',
':', '{', '"', 'n', 'a', 'm', 'e', '"', ':', '"', 'a', 'w', 's', '"', ',', '"', 'd', 'n', 's', 'S',
'u', 'f', 'f', 'i', 'x', '"', ':', '"', 'a', 'm', 'a', 'z', 'o', 'n', 'a', 'w', 's', '.', 'c', 'o',
'm', '"', ',', '"', 'd', 'u', 'a', 'l', 'S', 't', 'a', 'c', 'k', 'D', 'n', 's', 'S', 'u', 'f', 'f',
'i', 'x', '"', ':', '"', 'a', 'p', 'i', '.', 'a', 'w', 's', '"', ',', '"', 's', 'u', 'p', 'p', 'o',
'r', 't', 's', 'F', 'I', 'P', 'S', '"', ':', 't', 'r', 'u', 'e', ',', '"', 's', 'u', 'p', 'p', 'o',
'r', 't', 's', 'D', 'u', 'a', 'l', 'S', 't', 'a', 'c', 'k', '"', ':', 't', 'r', 'u', 'e', '}', '}',
',', '{', '"', 'i', 'd', '"', ':', '"', 'a', 'w', 's', '-', 'u', 's', '-', 'g', 'o', 'v', '"', ',',
'"', 'r', 'e', 'g', 'i', 'o', 'n', 'R', 'e', 'g', 'e', 'x', '"', ':', '"', '^', 'u', 's', '\\', '\\',
'-', 'g', 'o', 'v', '\\', '\\', '-', '\\', '\\', 'w', '+', '\\', '\\', '-', '\\', '\\', 'd', '+', '$', '"',
',', '"', 'r', 'e', 'g', 'i', 'o', 'n', 's', '"', ':', '{', '"', 'u', 's', '-', 'g', 'o', 'v', '-',
'w', 'e', 's', 't', '-', '1', '"', ':', '{', '}', ',', '"', 'u', 's', '-', 'g', 'o', 'v', '-', 'e',
'a', 's', 't', '-', '1', '"', ':', '{', '}', ',', '"', 'a', 'w', 's', '-', 'u', 's', '-', 'g', 'o',
'v', '-', 'g', 'l', 'o', 'b', 'a', 'l', '"', ':', '{', '}', '}', ',', '"', 'o', 'u', 't', 'p', 'u',
't', 's', '"', ':', '{', '"', 'n', 'a', 'm', 'e', '"', ':', '"', 'a', 'w', 's', '-', 'u', 's', '-',
'g', 'o', 'v', '"', ',', '"', 'd', 'n', 's', 'S', 'u', 'f', 'f', 'i', 'x', '"', ':', '"', 'a', 'm',
'a', 'z', 'o', 'n', 'a', 'w', 's', '.', 'c', 'o', 'm', '"', ',', '"', 'd', 'u', 'a', 'l', 'S', 't',
'a', 'c', 'k', 'D', 'n', 's', 'S', 'u', 'f', 'f', 'i', 'x', '"', ':', '"', 'a', 'p', 'i', '.', 'a',
'w', 's', '"', ',', '"', 's', 'u', 'p', 'p', 'o', 'r', 't', 's', 'F', 'I', 'P', 'S', '"', ':', 't',
'r', 'u', 'e', ',', '"', 's', 'u', 'p', 'p', 'o', 'r', 't', 's', 'D', 'u', 'a', 'l', 'S', 't', 'a',
'c', 'k', '"', ':', 't', 'r', 'u', 'e', '}', '}', ',', '{', '"', 'i', 'd', '"', ':', '"', 'a', 'w',
's', '-', 'c', 'n', '"', ',', '"', 'r', 'e', 'g', 'i', 'o', 'n', 'R', 'e', 'g', 'e', 'x', '"', ':',
'"', '^', 'c', 'n', '\\', '\\', '-', '\\', '\\', 'w', '+', '\\', '\\', '-', '\\', '\\', 'd', '+', '$', '"',
',', '"', 'r', 'e', 'g', 'i', 'o', 'n', 's', '"', ':', '{', '"', 'c', 'n', '-', 'n', 'o', 'r', 't',
'h', '-', '1', '"', ':', '{', '}', ',', '"', 'c', 'n', '-', 'n', 'o', 'r', 't', 'h', 'w', 'e', 's',
't', '-', '1', '"', ':', '{', '}', ',', '"', 'a', 'w', 's', '-', 'c', 'n', '-', 'g', 'l', 'o', 'b',
'a', 'l', '"', ':', '{', '}', '}', ',', '"', 'o', 'u', 't', 'p', 'u', 't', 's', '"', ':', '{', '"',
'n', 'a', 'm', 'e', '"', ':', '"', 'a', 'w', 's', '-', 'c', 'n', '"', ',', '"', 'd', 'n', 's', 'S',
'u', 'f', 'f', 'i', 'x', '"', ':', '"', 'a', 'm', 'a', 'z', 'o', 'n', 'a', 'w', 's', '.', 'c', 'o',
'm', '.', 'c', 'n', '"', ',', '"', 'd', 'u', 'a', 'l', 'S', 't', 'a', 'c', 'k', 'D', 'n', 's', 'S',
'u', 'f', 'f', 'i', 'x', '"', ':', '"', 'a', 'p', 'i', '.', 'a', 'm', 'a', 'z', 'o', 'n', 'w', 'e',
'b', 's', 'e', 'r', 'v', 'i', 'c', 'e', 's', '.', 'c', 'o', 'm', '.', 'c', 'n', '"', ',', '"', 's',
'u', 'p', 'p', 'o', 'r', 't', 's', 'F', 'I', 'P', 'S', '"', ':', 't', 'r', 'u', 'e', ',', '"', 's',
'u', 'p', 'p', 'o', 'r', 't', 's', 'D', 'u', 'a', 'l', 'S', 't', 'a', 'c', 'k', '"', ':', 't', 'r',
'u', 'e', '}', '}', ',', '{', '"', 'i', 'd', '"', ':', '"', 'a', 'w', 's', '-', 'i', 's', 'o', '"',
',', '"', 'r', 'e', 'g', 'i', 'o', 'n', 'R', 'e', 'g', 'e', 'x', '"', ':', '"', '^', 'u', 's', '\\',
'\\', '-', 'i', 's', 'o', '\\', '\\', '-', '\\', '\\', 'w', '+', '\\', '\\', '-', '\\', '\\', 'd', '+', '$',
'"', ',', '"', 'o', 'u', 't', 'p', 'u', 't', 's', '"', ':', '{', '"', 'n', 'a', 'm', 'e', '"', ':',
'"', 'a', 'w', 's', '-', 'i', 's', 'o', '"', ',', '"', 'd', 'n', 's', 'S', 'u', 'f', 'f', 'i', 'x',
'"', ':', '"', 'c', '2', 's', '.', 'i', 'c', '.', 'g', 'o', 'v', '"', ',', '"', 's', 'u', 'p', 'p',
'o', 'r', 't', 's', 'F', 'I', 'P', 'S', '"', ':', 't', 'r', 'u', 'e', ',', '"', 's', 'u', 'p', 'p',
'o', 'r', 't', 's', 'D', 'u', 'a', 'l', 'S', 't', 'a', 'c', 'k', '"', ':', 'f', 'a', 'l', 's', 'e',
',', '"', 'd', 'u', 'a', 'l', 'S', 't', 'a', 'c', 'k', 'D', 'n', 's', 'S', 'u', 'f', 'f', 'i', 'x',
'"', ':', '"', 'c', '2', 's', '.', 'i', 'c', '.', 'g', 'o', 'v', '"', '}', ',', '"', 'r', 'e', 'g',
'i', 'o', 'n', 's', '"', ':', '{', '"', 'u', 's', '-', 'i', 's', 'o', '-', 'e', 'a', 's', 't', '-',
'1', '"', ':', '{', '}', ',', '"', 'u', 's', '-', 'i', 's', 'o', '-', 'w', 'e', 's', 't', '-', '1',
'"', ':', '{', '}', ',', '"', 'a', 'w', 's', '-', 'i', 's', 'o', '-', 'g', 'l', 'o', 'b', 'a', 'l',
'"', ':', '{', '}', '}', '}', ',', '{', '"', 'i', 'd', '"', ':', '"', 'a', 'w', 's', '-', 'i', 's',
'o', '-', 'b', '"', ',', '"', 'r', 'e', 'g', 'i', 'o', 'n', 'R', 'e', 'g', 'e', 'x', '"', ':', '"',
'^', 'u', 's', '\\', '\\', '-', 'i', 's', 'o', 'b', '\\', '\\', '-', '\\', '\\', 'w', '+', '\\', '\\', '-',
'\\', '\\', 'd', '+', '$', '"', ',', '"', 'o', 'u', 't', 'p', 'u', 't', 's', '"', ':', '{', '"', 'n',
'a', 'm', 'e', '"', ':', '"', 'a', 'w', 's', '-', 'i', 's', 'o', '-', 'b', '"', ',', '"', 'd', 'n',
's', 'S', 'u', 'f', 'f', 'i', 'x', '"', ':', '"', 's', 'c', '2', 's', '.', 's', 'g', 'o', 'v', '.',
'g', 'o', 'v', '"', ',', '"', 's', 'u', 'p', 'p', 'o', 'r', 't', 's', 'F', 'I', 'P', 'S', '"', ':',
't', 'r', 'u', 'e', ',', '"', 's', 'u', 'p', 'p', 'o', 'r', 't', 's', 'D', 'u', 'a', 'l', 'S', 't',
'a', 'c', 'k', '"', ':', 'f', 'a', 'l', 's', 'e', ',', '"', 'd', 'u', 'a', 'l', 'S', 't', 'a', 'c',
'k', 'D', 'n', 's', 'S', 'u', 'f', 'f', 'i', 'x', '"', ':', '"', 's', 'c', '2', 's', '.', 's', 'g',
'o', 'v', '.', 'g', 'o', 'v', '"', '}', ',', '"', 'r', 'e', 'g', 'i', 'o', 'n', 's', '"', ':', '{',
'"', 'u', 's', '-', 'i', 's', 'o', 'b', '-', 'e', 'a', 's', 't', '-', '1', '"', ':', '{', '}', ',',
'"', 'a', 'w', 's', '-', 'i', 's', 'o', '-', 'b', '-', 'g', 'l', 'o', 'b', 'a', 'l', '"', ':', '{',
'}', '}', '}', ']', '}'};

const struct aws_byte_cursor aws_s3_endpoint_resolver_partitions = {
.len = 1705,
.ptr = (uint8_t *) s_generated_array
};
Loading