You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

87 lines
2.0 KiB

4 years ago
  1. """Low-level http related exceptions."""
  2. __all__ = ('HttpProcessingError',)
  3. class HttpProcessingError(Exception):
  4. """HTTP error.
  5. Shortcut for raising HTTP errors with custom code, message and headers.
  6. code: HTTP Error code.
  7. message: (optional) Error message.
  8. headers: (optional) Headers to be sent in response, a list of pairs
  9. """
  10. code = 0
  11. message = ''
  12. headers = None
  13. def __init__(self, *, code=None, message='', headers=None):
  14. if code is not None:
  15. self.code = code
  16. self.headers = headers
  17. self.message = message
  18. super().__init__("%s, message='%s'" % (self.code, message))
  19. class BadHttpMessage(HttpProcessingError):
  20. code = 400
  21. message = 'Bad Request'
  22. def __init__(self, message, *, headers=None):
  23. super().__init__(message=message, headers=headers)
  24. class HttpBadRequest(BadHttpMessage):
  25. code = 400
  26. message = 'Bad Request'
  27. class PayloadEncodingError(BadHttpMessage):
  28. """Base class for payload errors"""
  29. class ContentEncodingError(PayloadEncodingError):
  30. """Content encoding error."""
  31. class TransferEncodingError(PayloadEncodingError):
  32. """transfer encoding error."""
  33. class ContentLengthError(PayloadEncodingError):
  34. """Not enough data for satisfy content length header."""
  35. class LineTooLong(BadHttpMessage):
  36. def __init__(self, line, limit='Unknown', actual_size='Unknown'):
  37. super().__init__(
  38. "Got more than %s bytes (%s) when reading %s." % (
  39. limit, actual_size, line))
  40. class InvalidHeader(BadHttpMessage):
  41. def __init__(self, hdr):
  42. if isinstance(hdr, bytes):
  43. hdr = hdr.decode('utf-8', 'surrogateescape')
  44. super().__init__('Invalid HTTP Header: {}'.format(hdr))
  45. self.hdr = hdr
  46. class BadStatusLine(BadHttpMessage):
  47. def __init__(self, line=''):
  48. if not line:
  49. line = repr(line)
  50. self.args = line,
  51. self.line = line
  52. class InvalidURLError(BadHttpMessage):
  53. pass