diff --git a/hexonet/apiconnector/apiclient.py b/hexonet/apiconnector/apiclient.py index b5dc8f9..46510a7 100644 --- a/hexonet/apiconnector/apiclient.py +++ b/hexonet/apiconnector/apiclient.py @@ -17,6 +17,7 @@ from six.moves.urllib.request import urlopen, Request from six.moves.urllib.parse import urlparse, urlencode import copy +import platform rtm = RTM() @@ -33,6 +34,8 @@ def __init__(self): # API connection timeout setting self.__socketTimeout = 300000 self.useLIVESystem() + # user agent setting + self.__ua = "" def enableDebugMode(self): """ @@ -72,6 +75,27 @@ def getURL(self): """ return self.__socketURL + def getUserAgent(self): + """ + Get the User Agent + """ + if (len(self.__ua) == 0): + pid = "PYTHON-SDK" + pyv = platform.python_version() + pf = platform.system() + arch = platform.architecture()[0] + self.__ua = "%s (%s %s rv:%s) python/%s" % (pid, pf, arch, self.getVersion(), pyv) + return self.__ua + + def setUserAgent(self, pid, rv): + """ + Possibility to customize default user agent to fit your needs by given string and revision + """ + pyv = platform.python_version() + pf = platform.system() + arch = platform.architecture()[0] + self.__ua = "%s (%s %s rv:%s) python-sdk/%s python/%s" % (pid, pf, arch, rv, self.getVersion(), pyv) + def getVersion(self): """ Get the current module version diff --git a/requirements.txt b/requirements.txt index 6f2375b..1942c88 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,4 +10,4 @@ Sphinx==1.8.5 sphinxcontrib-log-cabinet==1.0.0 sphinxcontrib-websupport==1.1.0 pip==19.0.3 -twine==1.13.0 +twine==1.13.0 \ No newline at end of file diff --git a/tests/test_apiclient.py b/tests/test_apiclient.py index b9e5a17..caac9ab 100644 --- a/tests/test_apiclient.py +++ b/tests/test_apiclient.py @@ -2,6 +2,7 @@ from hexonet.apiconnector.response import Response as R from hexonet.apiconnector.responsetemplatemanager import ResponseTemplateManager as RTM import pytest +import platform def test_apiclientmethods(): @@ -9,10 +10,10 @@ def test_apiclientmethods(): rtm = RTM.getInstance() rtm.addTemplate( 'login200', - '[RESPONSE]\r\nPROPERTY[SESSION][0]=h8JLZZHdF2WgWWXlwbKWzEG3XrzoW4y' + - 'shhvtqyg0LCYiX55QnhgYX9cB0W4mlpbx\r\nDESCRIPTION=Command completed' + - ' successfully\r\nCODE=200\r\nQUEUETIME=0\r\nRUNTIME=0.169\r\nEOF\r' + - '\n' + '[RESPONSE]\r\nPROPERTY[SESSION][0]=h8JLZZHdF2WgWWXlwbKWzEG3XrzoW4y' + + 'shhvtqyg0LCYiX55QnhgYX9cB0W4mlpbx\r\nDESCRIPTION=Command completed' + + ' successfully\r\nCODE=200\r\nQUEUETIME=0\r\nRUNTIME=0.169\r\nEOF\r' + + '\n' ) rtm.addTemplate( 'login500', @@ -24,50 +25,50 @@ def test_apiclientmethods(): ) rtm.addTemplate( 'listP0', - '[RESPONSE]\r\nPROPERTY[TOTAL][0]=2701\r\nPROPERTY[FIRST][0]=0\r\nP' + - 'ROPERTY[DOMAIN][0]=0-60motorcycletimes.com\r\nPROPERTY[DOMAIN][1]=' + - '0-be-s01-0.com\r\nPROPERTY[COUNT][0]=2\r\nPROPERTY[LAST][0]=1\r\nP' + - 'ROPERTY[LIMIT][0]=2\r\nDESCRIPTION=Command completed successfully' + - '\r\nCODE=200\r\nQUEUETIME=0\r\nRUNTIME=0.023\r\nEOF\r\n' + '[RESPONSE]\r\nPROPERTY[TOTAL][0]=2701\r\nPROPERTY[FIRST][0]=0\r\nP' + + 'ROPERTY[DOMAIN][0]=0-60motorcycletimes.com\r\nPROPERTY[DOMAIN][1]=' + + '0-be-s01-0.com\r\nPROPERTY[COUNT][0]=2\r\nPROPERTY[LAST][0]=1\r\nP' + + 'ROPERTY[LIMIT][0]=2\r\nDESCRIPTION=Command completed successfully' + + '\r\nCODE=200\r\nQUEUETIME=0\r\nRUNTIME=0.023\r\nEOF\r\n' ) rtm.addTemplate( 'listP1', - '[RESPONSE]\r\nPROPERTY[TOTAL][0]=2701\r\nPROPERTY[FIRST][0]=2\r\nP' + - 'ROPERTY[DOMAIN][0]=0-qas-ao17-0.org\r\nPROPERTY[DOMAIN][1]=0-sunny' + - 'da222y.com\r\nPROPERTY[COUNT][0]=2\r\nPROPERTY[LAST][0]=3\r\nPROPE' + - 'RTY[LIMIT][0]=2\r\nDESCRIPTION=Command completed successfully\r\nC' + - 'ODE=200\r\nQUEUETIME=0\r\nRUNTIME=0.032\r\nEOF\r\n' + '[RESPONSE]\r\nPROPERTY[TOTAL][0]=2701\r\nPROPERTY[FIRST][0]=2\r\nP' + + 'ROPERTY[DOMAIN][0]=0-qas-ao17-0.org\r\nPROPERTY[DOMAIN][1]=0-sunny' + + 'da222y.com\r\nPROPERTY[COUNT][0]=2\r\nPROPERTY[LAST][0]=3\r\nPROPE' + + 'RTY[LIMIT][0]=2\r\nDESCRIPTION=Command completed successfully\r\nC' + + 'ODE=200\r\nQUEUETIME=0\r\nRUNTIME=0.032\r\nEOF\r\n' ) rtm.addTemplate( 'listFP0', - '[RESPONSE]\r\nPROPERTY[TOTAL][0]=3\r\nPROPERTY[FIRST][0]=0\r\nPROP' + - 'ERTY[DOMAIN][0]=0-60motorcycletimes.com\r\nPROPERTY[COUNT][0]=1\r' + - '\nPROPERTY[LAST][0]=1\r\nPROPERTY[LIMIT][0]=1\r\nDESCRIPTION=Comma' + - 'nd completed successfully\r\nCODE=200\r\nQUEUETIME=0\r\nRUNTIME=0.' + - '023\r\nEOF\r\n' + '[RESPONSE]\r\nPROPERTY[TOTAL][0]=3\r\nPROPERTY[FIRST][0]=0\r\nPROP' + + 'ERTY[DOMAIN][0]=0-60motorcycletimes.com\r\nPROPERTY[COUNT][0]=1\r' + + '\nPROPERTY[LAST][0]=1\r\nPROPERTY[LIMIT][0]=1\r\nDESCRIPTION=Comma' + + 'nd completed successfully\r\nCODE=200\r\nQUEUETIME=0\r\nRUNTIME=0.' + + '023\r\nEOF\r\n' ) rtm.addTemplate( 'listFP1', - '[RESPONSE]\r\nPROPERTY[TOTAL][0]=3\r\nPROPERTY[FIRST][0]=1\r\nPROP' + - 'ERTY[DOMAIN][0]=0-be-s01-0.com\r\nPROPERTY[COUNT][0]=1\r\nPROPERTY' + - '[LAST][0]=2\r\nPROPERTY[LIMIT][0]=1\r\nDESCRIPTION=Command complet' + - 'ed successfully\r\nCODE=200\r\nQUEUETIME=0\r\nRUNTIME=0.032\r\nEOF' + - '\r\n' + '[RESPONSE]\r\nPROPERTY[TOTAL][0]=3\r\nPROPERTY[FIRST][0]=1\r\nPROP' + + 'ERTY[DOMAIN][0]=0-be-s01-0.com\r\nPROPERTY[COUNT][0]=1\r\nPROPERTY' + + '[LAST][0]=2\r\nPROPERTY[LIMIT][0]=1\r\nDESCRIPTION=Command complet' + + 'ed successfully\r\nCODE=200\r\nQUEUETIME=0\r\nRUNTIME=0.032\r\nEOF' + + '\r\n' ) rtm.addTemplate( 'listFP2', - '[RESPONSE]\r\nPROPERTY[TOTAL][0]=3\r\nPROPERTY[FIRST][0]=2\r\nPROP' + - 'ERTY[DOMAIN][0]=0-qas-ao17-0.org\r\nPROPERTY[COUNT][0]=2\r\nPROPER' + - 'TY[LAST][0]=3\r\nPROPERTY[LIMIT][0]=1\r\nDESCRIPTION=Command compl' + - 'eted successfully\r\nCODE=200\r\nQUEUETIME=0\r\nRUNTIME=0.032\r\nE' + - 'OF\r\n' + '[RESPONSE]\r\nPROPERTY[TOTAL][0]=3\r\nPROPERTY[FIRST][0]=2\r\nPROP' + + 'ERTY[DOMAIN][0]=0-qas-ao17-0.org\r\nPROPERTY[COUNT][0]=2\r\nPROPER' + + 'TY[LAST][0]=3\r\nPROPERTY[LIMIT][0]=1\r\nDESCRIPTION=Command compl' + + 'eted successfully\r\nCODE=200\r\nQUEUETIME=0\r\nRUNTIME=0.032\r\nE' + + 'OF\r\n' ) # #.getPOSTData() # test object input with special chars validate = ( - 's_entity=54cd&s_command=COMMAND%3DModifyDomain%0AAUTH%3Dgwrgwqg%25' + - '%26%5C44t3%2A' + 's_entity=54cd&s_command=COMMAND%3DModifyDomain%0AAUTH%3Dgwrgwqg%25' + + '%26%5C44t3%2A' ) enc = cl.getPOSTData({ 'COMMAND': 'ModifyDomain', @@ -105,6 +106,25 @@ def test_apiclientmethods(): # #.getURL() assert cl.getURL() == 'https://coreapi.1api.net/api/call.cgi' + # #.getUserAgent() + pid = "PYTHON-SDK" + pyv = platform.python_version() + pf = platform.system() + arch = platform.architecture()[0] + ua = "%s (%s %s rv:%s) python/%s" % (pid, pf, arch, cl.getVersion(), pyv) + assert cl.getUserAgent() == ua + + # #.setUserAgent() + pid = "WHMCS" + rv = "7.7.0" + pid2 = "python-sdk" + pyv = platform.python_version() + pf = platform.system() + arch = platform.architecture()[0] + ua = "%s (%s %s rv:%s) %s/%s python/%s" % (pid, pf, arch, rv, pid2, cl.getVersion(), pyv) + cl.setUserAgent(pid, rv) + assert cl.getUserAgent() == ua + # #.setURL() tmp = 'http://coreapi.1api.net/api/call.cgi' url = cl.setURL(tmp).getURL() @@ -173,8 +193,8 @@ def test_apiclientmethods(): 'COMMAND': 'StatusAccount' }) exp = ( - 's_entity=54cd&s_remoteaddr=10.10.10.10&s_command=COMMAND%3DStatusA' + - 'ccount' + 's_entity=54cd&s_remoteaddr=10.10.10.10&s_command=COMMAND%3DStatusA' + + 'ccount' ) assert tmp == exp @@ -192,8 +212,8 @@ def test_apiclientmethods(): 'COMMAND': 'StatusAccount' }) exp = ( - 's_entity=54cd&s_login=myaccountid&s_pw=mypassword&s_command=COMMAN' + - 'D%3DStatusAccount' + 's_entity=54cd&s_login=myaccountid&s_pw=mypassword&s_command=COMMAN' + + 'D%3DStatusAccount' ) assert tmp == exp @@ -211,8 +231,8 @@ def test_apiclientmethods(): 'COMMAND': 'StatusAccount' }) exp = ( - 's_entity=54cd&s_login=myaccountid%21myroleid&s_pw=mypassword&s_com' + - 'mand=COMMAND%3DStatusAccount' + 's_entity=54cd&s_login=myaccountid%21myroleid&s_pw=mypassword&s_com' + + 'mand=COMMAND%3DStatusAccount' ) assert tmp == exp