uri.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. import json
  2. import logging
  3. import requests
  4. from core.NeuronModule import NeuronModule, InvalidParameterException
  5. logging.basicConfig()
  6. logger = logging.getLogger("kalliope")
  7. class Uri(NeuronModule):
  8. def __init__(self, **kwargs):
  9. super(Uri, self).__init__(**kwargs)
  10. # input variables
  11. self.url = kwargs.get('url', None)
  12. self.headers = kwargs.get('headers', None)
  13. self.data = kwargs.get('data', None)
  14. self.method = kwargs.get('method', "GET")
  15. self.user = kwargs.get('user', None)
  16. self.password = kwargs.get('password', None)
  17. self.timeout = kwargs.get('timeout', None)
  18. # processing parameters
  19. self.parameters = None
  20. # output variable
  21. self.status_code = None
  22. self.content = None
  23. self.response_header = None
  24. # this is a switch case option
  25. switch_case = {
  26. "GET": self.do_get,
  27. "POST": self.do_post,
  28. "DELETE": self.do_delete,
  29. "PUT": self.do_put,
  30. "HEAD": self.do_head,
  31. "PATCH": self.do_patch,
  32. "OPTIONS": self.do_options
  33. }
  34. # check parameters
  35. if self._is_parameters_ok():
  36. # we get parameters that will be passed to the requests lib
  37. self.parameters = self.get_parameters()
  38. # we call the right method depending of the method selected
  39. switch_case[self.method]()
  40. message = {
  41. "status_code": self.status_code,
  42. "content": self.content,
  43. "response_header": self.response_header
  44. }
  45. self.say(message)
  46. def do_get(self):
  47. logger.debug("do_get method called")
  48. r = requests.get(url=self.url, **self.parameters)
  49. self.post_processing_request(r)
  50. def do_post(self):
  51. logger.debug("do_post method called")
  52. r = requests.post(url=self.url, **self.parameters)
  53. self.post_processing_request(r)
  54. def do_delete(self):
  55. logger.debug("do_delete method called")
  56. r = requests.delete(url=self.url, **self.parameters)
  57. self.post_processing_request(r)
  58. def do_put(self):
  59. logger.debug("do_put method called")
  60. r = requests.put(url=self.url, **self.parameters)
  61. self.post_processing_request(r)
  62. def do_head(self):
  63. logger.debug("do_head method called")
  64. r = requests.head(url=self.url, **self.parameters)
  65. self.post_processing_request(r)
  66. def do_patch(self):
  67. logger.debug("do_patch method called")
  68. r = requests.patch(url=self.url, **self.parameters)
  69. self.post_processing_request(r)
  70. def do_options(self):
  71. logger.debug("do_options method called")
  72. r = requests.options(url=self.url, **self.parameters)
  73. self.post_processing_request(r)
  74. def get_parameters(self):
  75. """
  76. :return: Dict of parameters usable by the "requests" lib
  77. """
  78. logger.debug("get_parameters method called")
  79. returned_parameters = dict()
  80. if self.headers is not None:
  81. returned_parameters["headers"] = self.headers
  82. if self.timeout is not None:
  83. returned_parameters["timeout"] = self.timeout
  84. if self.data is not None:
  85. returned_parameters["data"] = self.data
  86. print returned_parameters
  87. return returned_parameters
  88. def post_processing_request(self, r):
  89. self.status_code = r.status_code
  90. self.content = r.content
  91. self.response_header = r.headers
  92. logger.debug("status_code: %s" % self.status_code)
  93. logger.debug("content: %s" % self.content)
  94. logger.debug("response_header: %s" % self.response_header)
  95. return
  96. def _is_parameters_ok(self):
  97. if self.url is None:
  98. raise InvalidParameterException("Uri needs an url")
  99. if self.headers is not None:
  100. if not isinstance(self.headers, dict):
  101. raise InvalidParameterException("headers must be a list of string")
  102. if self.timeout is not None:
  103. if not isinstance(self.timeout, int):
  104. raise InvalidParameterException("timeout must be an integer")
  105. if self.data is not None:
  106. try:
  107. self.data = json.loads(self.data)
  108. except ValueError, e:
  109. raise InvalidParameterException("error in \"data\" parameter: %s" % e)
  110. allowed_method = ["GET", "POST", "DELETE", "PUT", "HEAD", "PATCH", "OPTIONS"]
  111. if self.method not in allowed_method:
  112. raise InvalidParameterException("method %s not in: %s" % (self.method, allowed_method))
  113. return True