Skip to content

Commit 393f20c

Browse files
feat(response): possibility of placeholder vars in standard responses to improve error details
1 parent 3100656 commit 393f20c

File tree

6 files changed

+37
-17
lines changed

6 files changed

+37
-17
lines changed

hexonet/apiconnector/apiclient.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -265,16 +265,18 @@ def request(self, cmd):
265265
newcmd = self.__autoIDNConvert(newcmd)
266266

267267
# request command to API
268+
cfg = {
269+
"CONNECTION_URL": self.__socketURL
270+
}
268271
data = self.getPOSTData(newcmd).encode('UTF-8')
269272
secured = self.getPOSTData(newcmd, True).encode('UTF-8')
270-
# TODO: 300s (to be sure to get an API response)
271273
try:
272274
headers = {
273275
'User-Agent': self.getUserAgent()
274276
}
275277
if "REFERER" in self.__curlopts:
276278
headers['Referer'] = self.__curlopts["REFERER"]
277-
req = Request(self.__socketURL, data, headers)
279+
req = Request(cfg["CONNECTION_URL"], data, headers)
278280
if "PROXY" in self.__curlopts:
279281
proxyurl = urlparse(self.__curlopts["PROXY"])
280282
req.set_proxy(proxyurl.netloc, proxyurl.scheme)
@@ -285,7 +287,7 @@ def request(self, cmd):
285287
body = rtm.getTemplate("httperror").getPlain()
286288
if (self.__debugMode):
287289
print((self.__socketURL, secured, "HTTP communication failed", body, '\n', '\n'))
288-
return Response(body, newcmd)
290+
return Response(body, newcmd, cfg)
289291

290292
def requestNextResponsePage(self, rr):
291293
"""

hexonet/apiconnector/response.py

+9-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from hexonet.apiconnector.record import Record
1313

1414
import math
15+
import re
1516

1617

1718
class Response(RT, object):
@@ -20,8 +21,15 @@ class Response(RT, object):
2021
Backend API response data in a useful way.
2122
"""
2223

23-
def __init__(self, raw, cmd=None):
24+
def __init__(self, raw, cmd=None, cfg={}):
2425
super(Response, self).__init__(raw)
26+
27+
if re.search(r"\{[A-Z_]+\}", self._raw):
28+
for key, value in cfg.items():
29+
self._raw = self._raw.replace("{%s}" % (key), value)
30+
self._raw = re.sub(r"\{[A-Z_]+\}", "", self._raw)
31+
super(Response, self).__init__(self._raw)
32+
2533
# The API Command used within this request
2634
self.__command = cmd
2735
if (self.__command is not None) and ('PASSWORD' in self.__command):

hexonet/apiconnector/responsetemplate.py

+11-11
Original file line numberDiff line numberDiff line change
@@ -18,30 +18,30 @@ class ResponseTemplate(object):
1818
"""
1919

2020
def __init__(self, response=""):
21-
descr = "Empty API response. Probably unreachable API end point"
2221
#: Holds the response as plain text / string
23-
self.__raw = response
22+
self._raw = response
2423
if (response is "") or (response is None):
25-
self.__raw = "[RESPONSE]\r\nCODE=423\r\nDESCRIPTION=%s\r\nEOF\r\n" % (descr)
24+
descr = "Empty API response. Probably unreachable API end point {CONNECTION_URL}"
25+
self._raw = "[RESPONSE]\r\nCODE=423\r\nDESCRIPTION=%s\r\nEOF\r\n" % (descr)
2626

2727
# try/except to support old versions of python (python2.5)
2828
try:
29-
if isinstance(self.__raw, bytes):
30-
self.__raw = self.__raw.decode("utf-8")
29+
if isinstance(self._raw, bytes):
30+
self._raw = self._raw.decode("utf-8")
3131
except UnicodeError:
32-
self.__raw = self.__raw.decode("latin1")
32+
self._raw = self._raw.decode("latin1")
3333
except BaseException:
34-
self.__raw = self.__raw.decode("utf-8")
34+
self._raw = self._raw.decode("utf-8")
3535

3636
if isinstance(response, dict):
3737
raise TypeError('Type "dict" is not allowed for parameter "response". Use type "string" instead.')
3838
else:
3939
#: Holds the response as hash
40-
self.__hash = RP.parse(self.__raw)
40+
self.__hash = RP.parse(self._raw)
4141

4242
if ('CODE' not in self.__hash) or ('DESCRIPTION' not in self.__hash):
43-
self.__raw = '[RESPONSE]\r\nCODE=423\r\nDESCRIPTION=Invalid API response. Contact Support\r\nEOF\r\n'
44-
self.__hash = RP.parse(self.__raw)
43+
self._raw = '[RESPONSE]\r\nCODE=423\r\nDESCRIPTION=Invalid API response. Contact Support\r\nEOF\r\n'
44+
self.__hash = RP.parse(self._raw)
4545

4646
def getCode(self):
4747
"""
@@ -59,7 +59,7 @@ def getPlain(self):
5959
"""
6060
Returns the plain API response
6161
"""
62-
return self.__raw
62+
return self._raw
6363

6464
def getQueuetime(self):
6565
"""

hexonet/apiconnector/responsetemplatemanager.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@ def __new__(cls):
2929
ResponseTemplateManager.__templates = {
3030
"404": rtm.generateTemplate("421", "Page not found"),
3131
"500": rtm.generateTemplate("500", "Internal server error"),
32-
"empty": rtm.generateTemplate("423", "Empty API response. Probably unreachable API end point"),
32+
"empty": rtm.generateTemplate(
33+
"423", "Empty API response. Probably unreachable API end point {CONNECTION_URL}"
34+
),
3335
"error": rtm.generateTemplate("421", "Command failed due to server error. Client should try again"),
3436
"expired": rtm.generateTemplate("530", "SESSION NOT FOUND"),
3537
"httperror": rtm.generateTemplate("421", "Command failed due to HTTP communication error"),

tests/test_response.py

+8
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from hexonet.apiconnector.response import Response as R
22
import hexonet.apiconnector.responseparser as RP
33
from hexonet.apiconnector.responsetemplatemanager import ResponseTemplateManager as RTM
4+
import re
45

56

67
def test_responsemethods():
@@ -40,6 +41,13 @@ def test_responsemethods():
4041
r = R(RP.serialize(h))
4142
assert r.getFirstRecordIndex() == 0
4243

44+
# #.constructor [place holder replacements]
45+
r = R("")
46+
assert re.search(r"\{[A-Z_]+\}", r.getDescription()) is None
47+
48+
r = R("", {"COMMAND": "StatusAccount"}, {"CONNECTION_URL": "123HXPHFOUND123"})
49+
assert re.search(r"123HXPHFOUND123", r.getDescription()) is not None
50+
4351
# #.getCommandPlain()
4452
# case 1
4553
r = R("", {

tests/test_responsetemplate.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ def test_responsetemplatemethods():
77
assert tpl.getCode() == 423
88
assert tpl.getDescription() == "Invalid API response. Contact Support"
99

10-
descr = "Empty API response. Probably unreachable API end point"
10+
descr = "Empty API response. Probably unreachable API end point {CONNECTION_URL}"
1111
# check instance [raw empty string]
1212
tpl = ResponseTemplate()
1313
assert tpl.getCode() == 423

0 commit comments

Comments
 (0)