Skip to content

Commit 78ae246

Browse files
committed
SSL fix Botocore for CLIV2
1 parent b8a7a43 commit 78ae246

File tree

2 files changed

+82
-1
lines changed

2 files changed

+82
-1
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: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import json
1515
import logging
1616
import os
17+
from unittest.mock import Mock, patch
1718

1819
import pytest
1920
from botocore.endpoint_provider import (
@@ -22,6 +23,7 @@
2223
ErrorRule,
2324
RuleCreator,
2425
RuleSet,
26+
RuleSetEndpoint,
2527
RuleSetStandardLibary,
2628
TreeRule,
2729
)
@@ -486,3 +488,78 @@ def test_auth_schemes_conversion_first_authtype_unknown(
486488
def test_get_attr(rule_lib, value, path, expected_value):
487489
result = rule_lib.get_attr(value, path)
488490
assert result == expected_value
491+
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)