def test_get_session_option_override(self): http = RequestsWrapper({}, {}) options = {'auth': ('user', 'pass')} with mock.patch('datadog_checks.base.utils.http.RequestsWrapper.session'): http.get('https://www.google.com', persist=True, auth=options['auth']) http.session.get.assert_called_once_with('https://www.google.com', **options)
def test_default_no_ignore_session(self): instance = {'persist_connections': True} init_config = {} http = RequestsWrapper(instance, init_config) with pytest.warns(InsecureRequestWarning): http.get('https://www.google.com', verify=False)
def test_instance_no_ignore(self): instance = {'tls_ignore_warning': False} init_config = {'tls_ignore_warning': True} http = RequestsWrapper(instance, init_config) with pytest.warns(InsecureRequestWarning): http.get('https://www.google.com', verify=False)
def test_get(self): http = RequestsWrapper({}, {}) with mock.patch('requests.get'): http.get('https://www.google.com') requests.get.assert_called_once_with('https://www.google.com', **http.options)
def test_no_proxy_ip_fail(self, socks5_proxy): instance = { 'proxy': { 'http': 'http://1.2.3.4:567', 'no_proxy': '127.0.0.1,127.0.0.2/32,127.1.0.0/25,127.1.1.0/255.255.255.128,127.1.2.0/0.0.0.127', } } init_config = {} http = RequestsWrapper(instance, init_config) # no_proxy not match: 127.0.0.1 with pytest.raises((ConnectTimeout, ProxyError)): http.get('http://127.0.0.11', timeout=1) # no_proxy not match: 127.0.0.2/32 with pytest.raises((ConnectTimeout, ProxyError)): http.get('http://127.0.0.22', timeout=1) # no_proxy not match: IP outside 127.1.0.0/25 subnet - cidr bits format with pytest.raises((ConnectTimeout, ProxyError)): http.get('http://127.1.0.150', timeout=1) http.get('http://127.1.0.200', timeout=1) # no_proxy not match: IP outside 127.1.1.0/255.255.255.128 subnet - net mask format with pytest.raises((ConnectTimeout, ProxyError)): http.get('http://127.1.1.150', timeout=1) http.get('http://127.1.1.200', timeout=1) # no_proxy not match: IP outside 127.1.2.0/0.0.0.127 subnet - host mask format with pytest.raises((ConnectTimeout, ProxyError)): http.get('http://127.1.2.150', timeout=1) http.get('http://127.1.2.200', timeout=1)
def test_get_session(self): http = RequestsWrapper({'persist_connections': True}, {}) with mock.patch( 'datadog_checks.base.utils.http.RequestsWrapper.session'): http.get('https://www.google.com') http.session.get.assert_called_once_with('https://www.google.com')
def test_get_option_override(self): http = RequestsWrapper({}, {}) options = http.options.copy() options['auth'] = ('user', 'pass') with mock.patch('requests.get'): http.get('https://www.google.com', auth=options['auth']) requests.get.assert_called_once_with('https://www.google.com', **options)
def test_ignore_session(self): instance = {'tls_ignore_warning': True, 'persist_connections': True} init_config = {} http = RequestsWrapper(instance, init_config) with pytest.warns(None) as record: http.get('https://www.google.com', verify=False) assert all(not issubclass(warning.category, InsecureRequestWarning) for warning in record)
def test_proxy_bad(self): instance = {'proxy': {'http': 'http://1.2.3.4:567', 'https': 'https://1.2.3.4:567'}} init_config = {} http = RequestsWrapper(instance, init_config) with pytest.raises((ConnectTimeout, ProxyError)): http.get('http://www.google.com', timeout=1) with pytest.raises((ConnectTimeout, ProxyError)): http.get('https://www.google.com', timeout=1)
def test_instance_ignore(self, caplog): instance = {'tls_ignore_warning': True} init_config = {'tls_ignore_warning': False} http = RequestsWrapper(instance, init_config) with caplog.at_level(logging.DEBUG), mock.patch('requests.get'): http.get('https://www.google.com', verify=False) expected_message = 'An unverified HTTPS request is being made to https://www.google.com' for _, _, message in caplog.record_tuples: assert message != expected_message
def test_proxy_env_vars_skip(self): instance = {'skip_proxy': True} init_config = {} http = RequestsWrapper(instance, init_config) with EnvVars({'HTTP_PROXY': 'http://1.2.3.4:567'}): response = http.get('http://www.google.com') response.raise_for_status() with EnvVars({'HTTPS_PROXY': 'https://1.2.3.4:567'}): response = http.get('https://www.google.com') response.raise_for_status()
def test_proxy_env_vars_override_skip_fail(self): instance = {'skip_proxy': True} init_config = {} http = RequestsWrapper(instance, init_config) with EnvVars({'HTTP_PROXY': 'http://1.2.3.4:567'}): with pytest.raises((ConnectTimeout, ProxyError)): http.get('http://www.google.com', timeout=1, proxies=None) with EnvVars({'HTTPS_PROXY': 'https://1.2.3.4:567'}): with pytest.raises((ConnectTimeout, ProxyError)): http.get('https://www.google.com', timeout=1, proxies=None)
def test_proxy_bad_no_proxy_override_success(self): instance = { 'proxy': {'http': 'http://1.2.3.4:567', 'https': 'https://1.2.3.4:567', 'no_proxy': 'unused,google.com'} } init_config = {} http = RequestsWrapper(instance, init_config) response = http.get('http://www.google.com') response.raise_for_status() response = http.get('https://www.google.com') response.raise_for_status()
def test_no_proxy_uris_coverage(self): http = RequestsWrapper({}, {}) # Coverage is not smart enough to detect that looping an empty # iterable will never occur when gated by `if iterable:`. http.no_proxy_uris = mock.MagicMock() http.no_proxy_uris.__iter__ = lambda self, *args, **kwargs: iter([]) http.no_proxy_uris.__bool__ = lambda self, *args, **kwargs: True # TODO: Remove with Python 2 http.no_proxy_uris.__nonzero__ = lambda self, *args, **kwargs: True http.get('https://www.google.com')
def test_no_proxy_domain_fail(self, socks5_proxy): instance = { 'proxy': { 'http': 'http://1.2.3.4:567', 'no_proxy': '.google.com,example.com,example,9' } } init_config = {} http = RequestsWrapper(instance, init_config) # no_proxy not match: .google.com # ".y.com" matches "x.y.com" but not "y.com" with pytest.raises((ConnectTimeout, ProxyError)): http.get('http://google.com', timeout=1) # no_proxy not match: example or example.com with pytest.raises((ConnectTimeout, ProxyError)): http.get('http://notexample.com', timeout=1) with pytest.raises((ConnectTimeout, ProxyError)): http.get('http://example.org', timeout=1) # no_proxy not match: 9 with pytest.raises((ConnectTimeout, ProxyError)): http.get('http://127.0.0.99', timeout=1)
def test_instance_no_ignore(self, caplog): instance = {'tls_ignore_warning': False} init_config = {'tls_ignore_warning': True} http = RequestsWrapper(instance, init_config) with caplog.at_level(logging.DEBUG), mock.patch('requests.get'): http.get('https://www.google.com', verify=False) expected_message = 'An unverified HTTPS request is being made to https://www.google.com' for _, level, message in caplog.record_tuples: if level == logging.WARNING and message == expected_message: break else: raise AssertionError('Expected WARNING log with message `{}`'.format(expected_message))
def test_kerberos_auth_noconf(self, kerberos): instance = {} init_config = {} http = RequestsWrapper(instance, init_config) response = http.get(kerberos["url"]) assert response.status_code == 401
def test_config_kerberos_cache_restores_rollback(self): instance = {'auth_type': 'kerberos', 'kerberos_cache': '/test/file'} init_config = {} http = RequestsWrapper(instance, init_config) with EnvVars({'KRB5CCNAME': 'old'}): with mock.patch('requests.get', side_effect=lambda *args, **kwargs: os.environ.get('KRB5CCNAME')): assert http.get('https://www.google.com') == '/test/file' assert os.environ.get('KRB5CCNAME') == 'old'
def test_config_kerberos_keytab_file(self): instance = {'kerberos_keytab': '/test/file'} init_config = {} http = RequestsWrapper(instance, init_config) assert os.environ.get('KRB5_CLIENT_KTNAME') is None with mock.patch('requests.get', side_effect=lambda *args, **kwargs: os.environ.get('KRB5_CLIENT_KTNAME')): assert http.get('https://www.google.com') == '/test/file' assert os.environ.get('KRB5_CLIENT_KTNAME') is None
def test_no_proxy_domain(self, socks5_proxy): instance = {'proxy': {'http': 'http://1.2.3.4:567', 'no_proxy': '.google.com,example.com,9'}} init_config = {} http = RequestsWrapper(instance, init_config) # no_proxy match: .google.com http.get('http://www.google.com') # no_proxy match: example.com http.get('http://www.example.com') http.get('http://example.com') # no_proxy match: 9 http.get('http://127.0.0.9')
def test_kerberos_auth_principal_incache_nokeytab(self, kerberos): instance = { 'url': kerberos["url"], 'kerberos_auth': 'required', 'kerberos_cache': "DIR:{}".format(kerberos["cache"]), 'kerberos_hostname': kerberos["hostname"], 'kerberos_principal': "user/nokeytab@{}".format(kerberos["realm"]), 'kerberos_force_initiate': 'true', } init_config = {} http = RequestsWrapper(instance, init_config) response = http.get(instance["url"]) assert response.status_code == 200
def test_extra_headers_on_http_method_call(self): instance = {'extra_headers': {'answer': 42}} init_config = {} http = RequestsWrapper(instance, init_config) extra_headers = {"foo": "bar"} with mock.patch("requests.get") as get: http.get("http://example.com/hello", extra_headers=extra_headers) expected_options = {'foo': 'bar', 'User-Agent': 'Datadog Agent/0.0.0', 'answer': '42'} get.assert_called_with( "http://example.com/hello", headers=expected_options, auth=None, cert=None, proxies=None, timeout=(10.0, 10.0), verify=True, ) # make sure the original headers are not modified assert http.options['headers'] == {'User-Agent': 'Datadog Agent/0.0.0', 'answer': '42'} assert extra_headers == {"foo": "bar"}
def test_kerberos_auth_principal_inexistent(self, kerberos): instance = { 'url': kerberos["url"], 'auth_type': 'kerberos', 'kerberos_auth': 'required', 'kerberos_hostname': kerberos["hostname"], 'kerberos_cache': "DIR:{}".format(kerberos["cache"]), 'kerberos_keytab': kerberos["keytab"], 'kerberos_principal': "user/doesnotexist@{}".format(kerberos["realm"]), 'kerberos_force_initiate': 'false', } init_config = {} http = RequestsWrapper(instance, init_config) response = http.get(instance["url"]) assert response.status_code == 401
def test_session_timeout(self): http = RequestsWrapper({'persist_connections': True}, {'timeout': 0.08}) with pytest.raises(requests.exceptions.Timeout): http.get('https://httpbin.org/delay/0.10')
def test_no_proxy_ip(self, socks5_proxy): instance = { 'proxy': { 'http': 'http://1.2.3.4:567', 'no_proxy': '127.0.0.1,127.0.0.2/32,127.1.0.0/25,127.1.1.0/255.255.255.128,127.1.2.0/0.0.0.127', } } init_config = {} http = RequestsWrapper(instance, init_config) # no_proxy match: 127.0.0.1 http.get('http://127.0.0.1', timeout=1) # no_proxy match: 127.0.0.2/32 http.get('http://127.0.0.2', timeout=1) # no_proxy match: IP within 127.1.0.0/25 subnet - cidr bits format http.get('http://127.1.0.50', timeout=1) http.get('http://127.1.0.100', timeout=1) # no_proxy match: IP within 127.1.1.0/255.255.255.128 subnet - net mask format http.get('http://127.1.1.50', timeout=1) http.get('http://127.1.1.100', timeout=1) # no_proxy match: IP within 127.1.2.0/0.0.0.127 subnet - host mask format http.get('http://127.1.2.50', timeout=1) http.get('http://127.1.2.100', timeout=1)
def test_socks5_proxy(self, socks5_proxy): instance = {'proxy': {'http': 'socks5h://{}'.format(socks5_proxy)}} init_config = {} http = RequestsWrapper(instance, init_config) http.get('http://www.google.com') http.get('http://nginx')
def test_session_timeout(self): http = RequestsWrapper({'persist_connections': True}, {'timeout': 0.300}) with pytest.raises(requests.exceptions.Timeout): http.get('https://httpstat.us/200?sleep=500')