mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-05-31 05:19:09 -07:00
Support unix socket with urls/uri (#43560)
* First pass at allowing unix socket with urls/uri. See #42341 * Only insert handler as needed * Fix and add tests * Add HTTPS functionality for unix sockets * Additional test fixes * Create context manager for monkey patching HTTPConnection.connect, de-dupe code, raise better errors * doc * Add a few more tests * Fix __call__ * Remove unused import * Patch HTTPConnection.connect with the functionality we want, instead of duplicating code and disabling * Fix var name * Remove unused var * Add changelog fragment * Update uri docs * Fix rebase indentation issue
This commit is contained in:
parent
5b28cd65f0
commit
77bfcad33a
6 changed files with 152 additions and 18 deletions
|
@ -8,7 +8,8 @@ __metaclass__ = type
|
|||
import datetime
|
||||
import os
|
||||
|
||||
from ansible.module_utils.urls import Request, open_url, urllib_request, HAS_SSLCONTEXT, cookiejar, ConnectionError, RequestWithMethod
|
||||
from ansible.module_utils.urls import (Request, open_url, urllib_request, HAS_SSLCONTEXT, cookiejar, ConnectionError, RequestWithMethod,
|
||||
UnixHTTPHandler, UnixHTTPSConnection, httplib)
|
||||
from ansible.module_utils.urls import SSLValidationHandler, HTTPSClientAuthHandler, RedirectHandlerFactory
|
||||
|
||||
import pytest
|
||||
|
@ -45,6 +46,7 @@ def test_Request_fallback(urlopen_mock, install_opener_mock, mocker):
|
|||
client_cert='/tmp/client.pem',
|
||||
client_key='/tmp/client.key',
|
||||
cookies=cookies,
|
||||
unix_socket='/foo/bar/baz.sock',
|
||||
)
|
||||
fallback_mock = mocker.spy(request, '_fallback')
|
||||
|
||||
|
@ -63,10 +65,11 @@ def test_Request_fallback(urlopen_mock, install_opener_mock, mocker):
|
|||
call(None, '/tmp/client.pem'), # client_cert
|
||||
call(None, '/tmp/client.key'), # client_key
|
||||
call(None, cookies), # cookies
|
||||
call(None, '/foo/bar/baz.sock'), # unix_socket
|
||||
]
|
||||
fallback_mock.assert_has_calls(calls)
|
||||
|
||||
assert fallback_mock.call_count == 12 # All but headers use fallback
|
||||
assert fallback_mock.call_count == 13 # All but headers use fallback
|
||||
|
||||
args = urlopen_mock.call_args[0]
|
||||
assert args[1] is None # data, this is handled in the Request not urlopen
|
||||
|
@ -125,6 +128,39 @@ def test_Request_open_http(urlopen_mock, install_opener_mock):
|
|||
assert len(found_handlers) == 0
|
||||
|
||||
|
||||
def test_Request_open_unix_socket(urlopen_mock, install_opener_mock):
|
||||
r = Request().open('GET', 'http://ansible.com/', unix_socket='/foo/bar/baz.sock')
|
||||
args = urlopen_mock.call_args[0]
|
||||
|
||||
opener = install_opener_mock.call_args[0][0]
|
||||
handlers = opener.handlers
|
||||
|
||||
found_handlers = []
|
||||
for handler in handlers:
|
||||
if isinstance(handler, UnixHTTPHandler):
|
||||
found_handlers.append(handler)
|
||||
|
||||
assert len(found_handlers) == 1
|
||||
|
||||
|
||||
def test_Request_open_https_unix_socket(urlopen_mock, install_opener_mock):
|
||||
r = Request().open('GET', 'https://ansible.com/', unix_socket='/foo/bar/baz.sock')
|
||||
args = urlopen_mock.call_args[0]
|
||||
|
||||
opener = install_opener_mock.call_args[0][0]
|
||||
handlers = opener.handlers
|
||||
|
||||
found_handlers = []
|
||||
for handler in handlers:
|
||||
if isinstance(handler, HTTPSClientAuthHandler):
|
||||
found_handlers.append(handler)
|
||||
|
||||
assert len(found_handlers) == 1
|
||||
|
||||
inst = found_handlers[0]._build_https_connection('foo')
|
||||
assert isinstance(inst, UnixHTTPSConnection)
|
||||
|
||||
|
||||
def test_Request_open_ftp(urlopen_mock, install_opener_mock, mocker):
|
||||
mocker.patch('ansible.module_utils.urls.ParseResultDottedDict.as_list', side_effect=AssertionError)
|
||||
|
||||
|
@ -270,6 +306,10 @@ def test_Request_open_no_validate_certs(urlopen_mock, install_opener_mock):
|
|||
break
|
||||
|
||||
assert ssl_handler is not None
|
||||
|
||||
inst = ssl_handler._build_https_connection('foo')
|
||||
assert isinstance(inst, httplib.HTTPSConnection)
|
||||
|
||||
context = ssl_handler._context
|
||||
assert context.protocol == ssl.PROTOCOL_SSLv23
|
||||
if ssl.OP_NO_SSLv2:
|
||||
|
@ -399,4 +439,5 @@ def test_open_url(urlopen_mock, install_opener_mock, mocker):
|
|||
force=False, last_mod_time=None, timeout=10, validate_certs=True,
|
||||
url_username=None, url_password=None, http_agent=None,
|
||||
force_basic_auth=False, follow_redirects='urllib2',
|
||||
client_cert=None, client_key=None, cookies=None, use_gssapi=False)
|
||||
client_cert=None, client_key=None, cookies=None, use_gssapi=False,
|
||||
unix_socket=None)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue