boumenot: I opened #1161 to address the telemetry issue.  There is some sort of circular dependency issue that manifest on CI, but not locally.  I will debug it later, and add the necessary event.
diff --git a/azurelinuxagent/common/protocol/wire.py b/azurelinuxagent/common/protocol/wire.py
index 841f9b72..265b1f6f 100644
--- a/azurelinuxagent/common/protocol/wire.py
+++ b/azurelinuxagent/common/protocol/wire.py
@@ -600,6 +600,12 @@ class WireClient(object):
         random.shuffle(version_uris_shuffled)
 
         for version in version_uris_shuffled:
+            # GA expects a location and failoverLocation in ExtensionsConfig, but
+            # this is not always the case. See #1147.
+            if version.uri is None:
+                logger.verbose('The specified manifest URL is empty, ignored.')
+                continue
+
             response = None
             if not HostPluginProtocol.is_default_channel():
                 response = self.fetch(version.uri)
diff --git a/azurelinuxagent/common/utils/restutil.py b/azurelinuxagent/common/utils/restutil.py
index 5ceb4c94..fc9aac93 100644
--- a/azurelinuxagent/common/utils/restutil.py
+++ b/azurelinuxagent/common/utils/restutil.py
@@ -170,8 +170,6 @@ def _http_request(method, host, rel_uri, port=None, data=None, secure=False,
                   headers=None, proxy_host=None, proxy_port=None):
 
     headers = {} if headers is None else headers
-    headers['Connection'] = 'close'
-
     use_proxy = proxy_host is not None and proxy_port is not None
 
     if port is None:

ExtensionsConfig May Not Contain a failoverLocation Attribute
The agent expects ExtensionsConfig to have a location and failoverLocation for each plugin.  This has been proven to not be true for all regions.  I consider this to be a bug upstream, but the agent should be robust enough to handle this case.

diff --git a/tests/utils/test_rest_util.py b/tests/utils/test_rest_util.py
index adeb8141..a864884a 100644
--- a/tests/utils/test_rest_util.py
+++ b/tests/utils/test_rest_util.py
@@ -195,7 +195,7 @@ class TestHttpOperations(AgentTestCase):
         ])
         HTTPSConnection.assert_not_called()
         mock_conn.request.assert_has_calls([
-            call(method="GET", url="/bar", body=None, headers={'User-Agent': HTTP_USER_AGENT, 'Connection': 'close'})
+            call(method="GET", url="/bar", body=None, headers={'User-Agent': HTTP_USER_AGENT})
         ])
         self.assertEqual(1, mock_conn.getresponse.call_count)
         self.assertNotEquals(None, resp)
@@ -218,7 +218,7 @@ class TestHttpOperations(AgentTestCase):
             call("foo", 443, timeout=10)
         ])
         mock_conn.request.assert_has_calls([
-            call(method="GET", url="/bar", body=None, headers={'User-Agent': HTTP_USER_AGENT, 'Connection': 'close'})
+            call(method="GET", url="/bar", body=None, headers={'User-Agent': HTTP_USER_AGENT})
         ])
         self.assertEqual(1, mock_conn.getresponse.call_count)
         self.assertNotEquals(None, resp)
@@ -242,7 +242,7 @@ class TestHttpOperations(AgentTestCase):
         ])
         HTTPSConnection.assert_not_called()
         mock_conn.request.assert_has_calls([
-            call(method="GET", url="http://foo:80/bar", body=None, headers={'User-Agent': HTTP_USER_AGENT, 'Connection': 'close'})
+            call(method="GET", url="http://foo:80/bar", body=None, headers={'User-Agent': HTTP_USER_AGENT})
         ])
         self.assertEqual(1, mock_conn.getresponse.call_count)
         self.assertNotEquals(None, resp)
@@ -267,7 +267,7 @@ class TestHttpOperations(AgentTestCase):
             call("foo.bar", 23333, timeout=10)
         ])
         mock_conn.request.assert_has_calls([
-            call(method="GET", url="https://foo:443/bar", body=None, headers={'User-Agent': HTTP_USER_AGENT, 'Connection': 'close'})
+            call(method="GET", url="https://foo:443/bar", body=None, headers={'User-Agent': HTTP_USER_AGENT})
         ])
         self.assertEqual(1, mock_conn.getresponse.call_count)
         self.assertNotEquals(None, resp)

pip install -e .
parse_log_pytest
pytest
pytest pytest-cov pytest-xdist pytest-mock pytest-asyncio distro
apt-get update apt-get install -y gcc
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
coverage==7.8.0
distro==1.9.0
exceptiongroup @ file:///croot/exceptiongroup_1706031385326/work
execnet==2.1.1
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
packaging @ file:///croot/packaging_1734472117206/work
pluggy @ file:///croot/pluggy_1733169602837/work
pytest @ file:///croot/pytest_1738938843180/work
pytest-asyncio==0.26.0
pytest-cov==6.0.0
pytest-mock==3.14.0
pytest-xdist==3.6.1
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
typing_extensions==4.13.0
-e git+https://github.com/Azure/WALinuxAgent.git@423dc18485e4c8d506bd07f77f7612b17bda27eb#egg=WALinuxAgent

name: WALinuxAgent
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - exceptiongroup=1.2.0=py39h06a4308_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - packaging=24.2=py39h06a4308_0
  - pip=25.0=py39h06a4308_0
  - pluggy=1.5.0=py39h06a4308_0
  - pytest=8.3.4=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py39h06a4308_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - coverage==7.8.0
      - distro==1.9.0
      - execnet==2.1.1
      - pytest-asyncio==0.26.0
      - pytest-cov==6.0.0
      - pytest-mock==3.14.0
      - pytest-xdist==3.6.1
      - typing-extensions==4.13.0
prefix: /opt/conda/envs/WALinuxAgent

tests/utils/test_rest_util.py::TestHttpOperations::test_http_request_direct tests/utils/test_rest_util.py::TestHttpOperations::test_http_request_direct_secure tests/utils/test_rest_util.py::TestHttpOperations::test_http_request_proxy tests/utils/test_rest_util.py::TestHttpOperations::test_http_request_proxy_secure
tests/utils/test_rest_util.py::TestIOErrorCounter::test_get_and_reset tests/utils/test_rest_util.py::TestIOErrorCounter::test_increment_hostplugin tests/utils/test_rest_util.py::TestIOErrorCounter::test_increment_other tests/utils/test_rest_util.py::TestIOErrorCounter::test_increment_protocol tests/utils/test_rest_util.py::TestHttpOperations::test_get_http_proxy_configuration_overrides_env tests/utils/test_rest_util.py::TestHttpOperations::test_get_http_proxy_configuration_requires_host tests/utils/test_rest_util.py::TestHttpOperations::test_get_http_proxy_http_uses_httpproxy tests/utils/test_rest_util.py::TestHttpOperations::test_get_http_proxy_https_uses_httpsproxy tests/utils/test_rest_util.py::TestHttpOperations::test_get_http_proxy_ignores_user_in_httpproxy tests/utils/test_rest_util.py::TestHttpOperations::test_get_http_proxy_none_is_default tests/utils/test_rest_util.py::TestHttpOperations::test_http_request_raises_for_bad_request tests/utils/test_rest_util.py::TestHttpOperations::test_http_request_raises_for_resource_gone tests/utils/test_rest_util.py::TestHttpOperations::test_http_request_retries_exceptions tests/utils/test_rest_util.py::TestHttpOperations::test_http_request_retries_for_safe_minimum_number_when_throttled tests/utils/test_rest_util.py::TestHttpOperations::test_http_request_retries_ioerrors tests/utils/test_rest_util.py::TestHttpOperations::test_http_request_retries_passed_status_codes tests/utils/test_rest_util.py::TestHttpOperations::test_http_request_retries_status_codes tests/utils/test_rest_util.py::TestHttpOperations::test_http_request_retries_with_constant_delay_when_throttled tests/utils/test_rest_util.py::TestHttpOperations::test_http_request_retries_with_fibonacci_delay tests/utils/test_rest_util.py::TestHttpOperations::test_http_request_with_retry tests/utils/test_rest_util.py::TestHttpOperations::test_parse_url tests/utils/test_rest_util.py::TestHttpOperations::test_read_response_bytes tests/utils/test_rest_util.py::TestHttpOperations::test_read_response_error tests/utils/test_rest_util.py::TestHttpOperations::test_request_failed tests/utils/test_rest_util.py::TestHttpOperations::test_request_succeeded
azurelinuxagent/common/protocol/wire.py azurelinuxagent/common/utils/restutil.py
azurelinuxagent/common/protocol/wire.py azurelinuxagent/common/utils/restutil.py