From 8dad3d13981f82416191cb3a33c1096e71d732f4 Mon Sep 17 00:00:00 2001 From: Christie Grinham Date: Thu, 29 Jul 2021 10:32:19 +0100 Subject: [PATCH 1/3] Add Proxy Support --- opensrs/opensrsapi.py | 5 +++-- opensrs/xcp.py | 23 +++++++++++++---------- requirements.txt | 1 + 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/opensrs/opensrsapi.py b/opensrs/opensrsapi.py index 8b01202..c093d93 100644 --- a/opensrs/opensrsapi.py +++ b/opensrs/opensrsapi.py @@ -119,16 +119,17 @@ class OpenSRS(object): MSG_ALREADY_RENEWED_SANDBOX = 'Domain Already Renewed' - def __init__(self, host, port, username, private_key, default_timeout): + def __init__(self, host, port, username, private_key, default_timeout, proxy=None): self.host = host self.port = port self.username = username self.private_key = private_key self.default_timeout = default_timeout + self.proxy = proxy def _get_channel(self): return XCPChannel(self.host, self.port, self.username, - self.private_key, self.default_timeout) + self.private_key, self.default_timeout, proxy=self.proxy) def _req(self, action, object, attributes, **kw): msg = XCPMessage(action, object, attributes, **kw) diff --git a/opensrs/xcp.py b/opensrs/xcp.py index a50caaa..a2e9eae 100644 --- a/opensrs/xcp.py +++ b/opensrs/xcp.py @@ -1,9 +1,6 @@ import hashlib import logging -try: - from urllib.request import urlopen, Request -except ImportError: - from urllib2 import urlopen, Request +import requests from xml.etree import ElementTree as ET from opensrs.errors import XCPError @@ -128,27 +125,33 @@ def sign(self, private_key): class XCPChannel(object): - def __init__(self, host, port, username, private_key, default_timeout): + def __init__(self, host, port, username, private_key, default_timeout, proxy=None): self.host = host self.port = port self.username = username self.private_key = private_key.encode('UTF-8') self.default_timeout = default_timeout + self.proxy = proxy def _make_call(self, message): """All network interaction is isolated here for stubbing out.""" - request = Request('https://%s:%s/' % (self.host, self.port)) headers = { 'Content-Type': 'text/xml', 'X-Username': self.username, 'X-Signature': message.sign(self.private_key), } - [request.add_header(k, v) for k, v in headers.items()] - timeout = message.timeout or self.default_timeout log.debug('Making XCP call with timeout = %s', timeout) - xml = urlopen(request, message.get_content(), timeout).read() - return OPSMessage(xml=xml) + request_args = { + "url": 'https://%s:%s/' % (self.host, self.port), + "headers": headers, + "params": message.get_content(), + "timeout": timeout, + } + if self.proxy: + request_args["proxies"] = {"http": self.proxy} + response = requests.get(**request_args) + return OPSMessage(xml=response.content) def make_request(self, message): log.debug('OpenSRS Request: %s' % repr(message.get_content())) diff --git a/requirements.txt b/requirements.txt index 449b60c..aae2d57 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,3 +4,4 @@ funcsigs < 0.5 mock < 1.2.0 nose < 2.0.0 python-dateutil == 2.5.3 +requests From 2ec9d70db39d199344ac5be0de6492041d8509cc Mon Sep 17 00:00:00 2001 From: Christie Grinham Date: Thu, 29 Jul 2021 12:43:21 +0100 Subject: [PATCH 2/3] Use urlopen --- opensrs/xcp.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/opensrs/xcp.py b/opensrs/xcp.py index a2e9eae..441bfef 100644 --- a/opensrs/xcp.py +++ b/opensrs/xcp.py @@ -1,6 +1,9 @@ import hashlib import logging -import requests +try: + from urllib.request import urlopen, Request, ProxyHandler, build_opener, install_opener +except ImportError: + from urllib2 import urlopen, Request, ProxyHandler, build_opener, install_opener from xml.etree import ElementTree as ET from opensrs.errors import XCPError @@ -135,23 +138,21 @@ def __init__(self, host, port, username, private_key, default_timeout, proxy=Non def _make_call(self, message): """All network interaction is isolated here for stubbing out.""" + if self.proxy: + proxy = ProxyHandler(proxies={"https": self.proxy}) + opener = build_opener(proxy) + install_opener(opener) + request = Request('https://%s:%s/' % (self.host, self.port)) headers = { 'Content-Type': 'text/xml', 'X-Username': self.username, 'X-Signature': message.sign(self.private_key), } + [request.add_header(k, v) for k, v in headers.items()] timeout = message.timeout or self.default_timeout log.debug('Making XCP call with timeout = %s', timeout) - request_args = { - "url": 'https://%s:%s/' % (self.host, self.port), - "headers": headers, - "params": message.get_content(), - "timeout": timeout, - } - if self.proxy: - request_args["proxies"] = {"http": self.proxy} - response = requests.get(**request_args) - return OPSMessage(xml=response.content) + xml = urlopen(request, message.get_content(), timeout).read() + return OPSMessage(xml=xml) def make_request(self, message): log.debug('OpenSRS Request: %s' % repr(message.get_content())) From 47601c7051bb60504c9ad191614b7a980e1dc730 Mon Sep 17 00:00:00 2001 From: user Date: Sun, 22 Dec 2024 15:02:03 +0330 Subject: [PATCH 3/3] Python 3.12 support --- opensrs/xcp.py | 6 +++--- requirements.txt | 13 ++++++------- tests/test_opensrsapi.py | 15 ++++++++------- tox.ini | 6 ++++-- 4 files changed, 21 insertions(+), 19 deletions(-) diff --git a/opensrs/xcp.py b/opensrs/xcp.py index 441bfef..6e192c7 100644 --- a/opensrs/xcp.py +++ b/opensrs/xcp.py @@ -87,17 +87,17 @@ def get_data(self, base_node=None): if not ET.iselement(base_node): return base_node if base_node.tag == 'item': - if base_node.getchildren() == []: + if list(base_node) == []: return base_node.text return self.get_data(base_node[0]) if base_node.tag == 'dt_array': indexed_children = [(e.get('key'), e) for e in - base_node.getchildren()] + list(base_node)] indexed_children.sort() return [self.get_data(e) for i, e in indexed_children] if base_node.tag == 'dt_assoc': data = {} - for e in base_node.getchildren(): + for e in list(base_node): data[e.get('key')] = self.get_data(e) return data if base_node.tag == 'dt_scalar': diff --git a/requirements.txt b/requirements.txt index aae2d57..aaeac37 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,6 @@ -demands == 4.0.0 -flake8 == 2.4.1 -funcsigs < 0.5 -mock < 1.2.0 -nose < 2.0.0 -python-dateutil == 2.5.3 -requests +demands == 5.1.0 +flake8 >= 6.0.0 +mock >= 5.0.0 +pytest >= 7.0.0 +python-dateutil >= 2.8.2 +requests >= 2.31.0 diff --git a/tests/test_opensrsapi.py b/tests/test_opensrsapi.py index d6d6a25..9e2614b 100644 --- a/tests/test_opensrsapi.py +++ b/tests/test_opensrsapi.py @@ -102,8 +102,9 @@ def add_req(self, req, resp): self.requests.append(req) self.responses.append(resp) - def __call__(self, host, port, username, private_key, timeout): + def __call__(self, host, port, username, private_key, timeout, proxy=None): self.private_key = private_key + self.proxy = proxy return self def make_request(self, message): @@ -331,7 +332,7 @@ def test_suggest_domains(self): } opensrs = self.safe_opensrs(self._data_suggest_domains('foo', 4), response_data) - self.assertEquals(expected, + self.assertEqual(expected, opensrs.suggest_domains( 'foo', ['.COM', '.ORG', '.NET', '.INFO'], 4)) @@ -399,7 +400,7 @@ def test_register_succeed(self): 'ref_number': '1065034' } } - self.assertEquals(expected, opensrs.register_domain( + self.assertEqual(expected, opensrs.register_domain( 'foo.com', 1, self._objdata_user_contact(), 'foo', 'bar')) def test_register_succeed_nameservers(self): @@ -430,7 +431,7 @@ def test_register_succeed_nameservers(self): 'ref_number': '1065034' } } - self.assertEquals(expected, opensrs.register_domain( + self.assertEqual(expected, opensrs.register_domain( 'foo.com', 1, self._objdata_user_contact(), 'foo', 'bar', nameservers=nameservers)) @@ -455,7 +456,7 @@ def test_create_pending_domain_registration_succeeds(self): 'ref_number': '1065034' } } - self.assertEquals(expected, opensrs.create_pending_domain_registration( + self.assertEqual(expected, opensrs.create_pending_domain_registration( 'foo.com', 1, self._objdata_user_contact(), 'foo', 'bar')) def test_renew_domain_fails_when_already_renewed(self): @@ -511,7 +512,7 @@ def test_create_pending_domain_renewal_succeeds(self): attributes={'order_id': '1065034'}) ) expected = '1065034' - self.assertEquals(expected, opensrs.create_pending_domain_renewal( + self.assertEqual(expected, opensrs.create_pending_domain_renewal( 'foo.com', '2017', '1')) def test_renew_domain_renewal_succeeds(self): @@ -528,7 +529,7 @@ def test_renew_domain_renewal_succeeds(self): attributes={'order_id': '1065034'}) ) expected = '1065034' - self.assertEquals(expected, opensrs.renew_domain( + self.assertEqual(expected, opensrs.renew_domain( 'foo.com', '2017', '1')) def test_domain_transfer_fails_when_domain_is_not_transferable(self): diff --git a/tox.ini b/tox.ini index d8b2ea7..7cdec91 100644 --- a/tox.ini +++ b/tox.ini @@ -1,11 +1,13 @@ [tox] -envlist = py27,py35 +envlist = py312 +isolated_build = true [testenv] deps = -rrequirements.txt + pytest setenv = PYTHONPATH = {toxinidir} commands = /bin/cp test_settings.py.sample test_settings.py - nosetests + pytest