Skip to content

Commit 81a8160

Browse files
authored
Fix: use_ssl parameter ignored when custom HTTPS endpoint_url provided (aws#9704)
1 parent b9b0cf1 commit 81a8160

File tree

2 files changed

+83
-2
lines changed

2 files changed

+83
-2
lines changed

awscli/botocore/regions.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,11 @@ def construct_endpoint(
514514
LOG.debug(f'Endpoint provider result: {provider_result.url}')
515515

516516
# The endpoint provider does not support non-secure transport.
517-
if not self._use_ssl and provider_result.url.startswith('https://'):
517+
if (
518+
not self._use_ssl
519+
and provider_result.url.startswith('https://')
520+
and 'Endpoint' not in provider_params
521+
):
518522
provider_result = provider_result._replace(
519523
url=f'http://{provider_result.url[8:]}'
520524
)

tests/unit/botocore/test_endpoint_provider.py

Lines changed: 78 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,15 @@
1616
import os
1717

1818
import pytest
19+
1920
from botocore.endpoint_provider import (
2021
EndpointProvider,
2122
EndpointRule,
2223
ErrorRule,
2324
RuleCreator,
2425
RuleSet,
2526
RuleSetStandardLibary,
26-
TreeRule,
27+
TreeRule, RuleSetEndpoint,
2728
)
2829
from botocore.exceptions import (
2930
EndpointResolutionError,
@@ -32,6 +33,8 @@
3233
from botocore.loaders import Loader
3334
from botocore.regions import EndpointRulesetResolver
3435

36+
from unittest.mock import Mock, patch
37+
3538
REGION_TEMPLATE = "{Region}"
3639
REGION_REF = {"ref": "Region"}
3740
BUCKET_ARN_REF = {"ref": "bucketArn"}
@@ -486,3 +489,77 @@ def test_auth_schemes_conversion_first_authtype_unknown(
486489
def test_get_attr(rule_lib, value, path, expected_value):
487490
result = rule_lib.get_attr(value, path)
488491
assert result == expected_value
492+
@pytest.mark.parametrize(
493+
"use_ssl, endpoint_url, provider_params, expected_url",
494+
[
495+
# use_ssl=True, endpoint_url="http://..." → HTTP
496+
(
497+
True,
498+
'http://custom.com',
499+
{'Endpoint': 'http://custom.com'},
500+
'http://custom.com',
501+
),
502+
# use_ssl=True, endpoint_url="https://..." → HTTPS
503+
(
504+
True,
505+
'https://custom.com',
506+
{'Endpoint': 'https://custom.com'},
507+
'https://custom.com',
508+
),
509+
# use_ssl=False, endpoint_url="http://..." → HTTP
510+
(
511+
False,
512+
'http://custom.com',
513+
{'Endpoint': 'http://custom.com'},
514+
'http://custom.com',
515+
),
516+
# use_ssl=False, endpoint_url="https://..." → HTTPS
517+
(
518+
False,
519+
'https://custom.com',
520+
{'Endpoint': 'https://custom.com'},
521+
'https://custom.com',
522+
),
523+
# use_ssl=True, no endpoint → HTTPS
524+
(
525+
True,
526+
'https://s3-test-only-domain.amazonaws.com',
527+
{},
528+
'https://s3-test-only-domain.amazonaws.com',
529+
),
530+
# use_ssl=False, no endpoint → HTTP (downgrade)
531+
(
532+
False,
533+
'https://s3-test-only-domain.amazonaws.com',
534+
{},
535+
'http://s3-test-only-domain.amazonaws.com',
536+
),
537+
],
538+
)
539+
def test_construct_endpoint_parametrized(
540+
use_ssl, endpoint_url, provider_params, expected_url
541+
):
542+
resolver = EndpointRulesetResolver(
543+
endpoint_ruleset_data={
544+
'version': '1.0',
545+
'parameters': {},
546+
'rules': [],
547+
},
548+
partition_data={},
549+
service_model=None,
550+
builtins={},
551+
client_context=None,
552+
event_emitter=None,
553+
use_ssl=use_ssl,
554+
requested_auth_scheme=None,
555+
)
556+
557+
with patch.object(resolver._provider, 'resolve_endpoint') as mock_resolve:
558+
mock_resolve.return_value = RuleSetEndpoint(
559+
url=endpoint_url, properties={}, headers={}
560+
)
561+
with patch.object(
562+
resolver, '_get_provider_params', return_value=provider_params
563+
):
564+
result = resolver.construct_endpoint(None, None, None)
565+
assert result.url == expected_url

0 commit comments

Comments
 (0)