context.py 2.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. # -*- coding: utf-8 -*-
  2. import json
  3. import typing
  4. from http import HTTPStatus
  5. import bottle
  6. from hapic.context import ContextInterface
  7. from hapic.exception import OutputValidationException
  8. from hapic.processor import RequestParameters, ProcessValidationError
  9. class BottleContext(ContextInterface):
  10. def get_request_parameters(self, *args, **kwargs) -> RequestParameters:
  11. path_parameters = dict(bottle.request.url_args)
  12. query_parameters = bottle.MultiDict(bottle.request.query)
  13. body_parameters = dict(bottle.request.json or {})
  14. form_parameters = bottle.MultiDict(bottle.request.forms)
  15. header_parameters = dict(bottle.request.headers)
  16. files_parameters = dict(bottle.request.files)
  17. return RequestParameters(
  18. path_parameters=path_parameters,
  19. query_parameters=query_parameters,
  20. body_parameters=body_parameters,
  21. form_parameters=form_parameters,
  22. header_parameters=header_parameters,
  23. files_parameters=files_parameters,
  24. )
  25. def get_response(
  26. self,
  27. response: dict,
  28. http_code: int,
  29. ) -> bottle.HTTPResponse:
  30. return bottle.HTTPResponse(
  31. body=json.dumps(response),
  32. headers=[
  33. ('Content-Type', 'application/json'),
  34. ],
  35. status=http_code,
  36. )
  37. def get_validation_error_response(
  38. self,
  39. error: ProcessValidationError,
  40. http_code: HTTPStatus=HTTPStatus.BAD_REQUEST,
  41. ) -> typing.Any:
  42. # TODO BS 20171010: Manage error schemas, see #4
  43. from hapic.hapic import _default_global_error_schema
  44. unmarshall = _default_global_error_schema.dump(error)
  45. if unmarshall.errors:
  46. raise OutputValidationException(
  47. 'Validation error during dump of error response: {}'.format(
  48. str(unmarshall.errors)
  49. )
  50. )
  51. return bottle.HTTPResponse(
  52. body=json.dumps(unmarshall.data),
  53. headers=[
  54. ('Content-Type', 'application/json'),
  55. ],
  56. status=int(http_code),
  57. )