compat.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. # -*- coding: utf-8 -*-
  2. # flake8: noqa
  3. """
  4. hyper/compat
  5. ~~~~~~~~~~~~
  6. Normalizes the Python 2/3 API for internal use.
  7. """
  8. from contextlib import contextmanager
  9. import sys
  10. import zlib
  11. try:
  12. from . import ssl_compat
  13. except ImportError:
  14. # TODO log?
  15. ssl_compat = None
  16. _ver = sys.version_info
  17. is_py2 = _ver[0] == 2
  18. is_py2_7_9_or_later = _ver[0] >= 2 and _ver[1] >= 7 and _ver[2] >= 9
  19. is_py3 = _ver[0] == 3
  20. is_py3_3 = is_py3 and _ver[1] == 3
  21. @contextmanager
  22. def ignore_missing():
  23. try:
  24. yield
  25. except (AttributeError, NotImplementedError): # pragma: no cover
  26. pass
  27. if is_py2:
  28. if is_py2_7_9_or_later:
  29. import ssl
  30. else:
  31. ssl = ssl_compat
  32. from urllib import urlencode
  33. from urlparse import urlparse, urlsplit
  34. from itertools import imap
  35. def to_byte(char):
  36. return ord(char)
  37. def decode_hex(b):
  38. return b.decode('hex')
  39. def write_to_stdout(data):
  40. sys.stdout.write(data + '\n')
  41. sys.stdout.flush()
  42. # The standard zlib.compressobj() accepts only positional arguments.
  43. def zlib_compressobj(level=6, method=zlib.DEFLATED, wbits=15, memlevel=8,
  44. strategy=zlib.Z_DEFAULT_STRATEGY):
  45. return zlib.compressobj(level, method, wbits, memlevel, strategy)
  46. unicode = unicode
  47. bytes = str
  48. elif is_py3:
  49. from urllib.parse import urlencode, urlparse, urlsplit
  50. imap = map
  51. def to_byte(char):
  52. return char
  53. def decode_hex(b):
  54. return bytes.fromhex(b)
  55. def write_to_stdout(data):
  56. sys.stdout.buffer.write(data + b'\n')
  57. sys.stdout.buffer.flush()
  58. zlib_compressobj = zlib.compressobj
  59. if is_py3_3:
  60. ssl = ssl_compat
  61. else:
  62. import ssl
  63. unicode = str
  64. bytes = bytes