|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- # utilities.py
- # ~~~~~~~~~
- # This module implements the utility methods.
- # :authors: Justin Karneges, Konstantin Bokarius.
- # :copyright: (c) 2015 by Fanout, Inc.
- # :license: MIT, see LICENSE for more details.
-
- import sys
- import collections
- import jwt
- import calendar
- import copy
- from datetime import datetime
-
- try:
- import zmq
- except ImportError:
- zmq = None
-
- try:
- import tnetstring
- except ImportError:
- tnetstring = None
-
- is_python3 = sys.version_info >= (3,)
-
- # An internal method to verify that the zmq and tnetstring packages are
- # available. If not an exception is raised.
- def _verify_zmq():
- if zmq is None:
- raise ValueError('zmq package must be installed')
- if tnetstring is None:
- raise ValueError('tnetstring package must be installed')
-
- # An internal method for encoding the specified value as UTF8 only
- # if it is unicode. This method acts recursively and will process nested
- # lists and dicts.
- def _ensure_utf8(value):
- if is_python3:
- if isinstance(value, str):
- return value.encode('utf-8')
- else:
- if isinstance(value, unicode):
- return value.encode('utf-8')
- elif isinstance(value, str):
- return value
- if isinstance(value, collections.Mapping):
- return dict(map(_ensure_utf8, value.items()))
- elif isinstance(value, collections.Iterable):
- return type(value)(map(_ensure_utf8, value))
- return value
-
- # An internal method for decoding the specified value as UTF8 only
- # if it is binary. This method acts recursively and will process nested
- # lists and dicts.
- def _ensure_unicode(value):
- if is_python3:
- if isinstance(value, bytes):
- return value.decode('utf-8')
- if isinstance(value, str):
- return value
- else:
- if isinstance(value, str):
- return value.decode('utf-8')
- elif isinstance(value, unicode):
- return value
- if isinstance(value, collections.Mapping):
- return dict(map(_ensure_unicode, value.items()))
- elif isinstance(value, collections.Iterable):
- return type(value)(map(_ensure_unicode, value))
- return value
-
- # An internal method for generating a JWT authorization header based on
- # the specified claim and key.
- def _gen_auth_jwt_header(claim, key):
- if 'exp' not in claim:
- claim = copy.copy(claim)
- claim['exp'] = calendar.timegm(datetime.utcnow().utctimetuple()) + 3600
- else:
- claim = claim
- return 'Bearer ' + jwt.encode(claim, key).decode('utf-8')
|