-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathrequest_response_util.py
More file actions
57 lines (39 loc) · 1.56 KB
/
request_response_util.py
File metadata and controls
57 lines (39 loc) · 1.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import base64
import importlib.metadata
import os
import threading
from typing import Optional
import requests
import uid2_client
from uid2_client.encryption import _decrypt_gcm, _encrypt_gcm
def _make_url(base_url, path):
return base_url + path
def auth_headers(auth_key):
try:
client_version = importlib.metadata.version("uid2_client")
except Exception:
client_version = "non-packaged-mode"
return {'Authorization': 'Bearer ' + auth_key,
"X-UID2-Client-Version": "uid2-client-python-" + client_version}
def make_v2_request(secret_key, now, data=None):
payload = int.to_bytes(int(now.timestamp() * 1000), 8, 'big')
nonce = os.urandom(8)
payload += nonce
if data:
payload += data
envelope = int.to_bytes(1, 1, 'big')
envelope += _encrypt_gcm(payload, None, secret_key)
return base64.b64encode(envelope), nonce
def parse_v2_response(secret_key, encrypted, nonce):
payload = _decrypt_gcm(base64.b64decode(encrypted), secret_key)
if nonce != payload[8:16]:
raise ValueError("nonce mismatch")
return payload[16:]
def __default_new_session(threadlocal=threading.local()):
if getattr(threadlocal, 'session', None) is None:
threadlocal.session = requests.Session()
return threadlocal.session
def post(base_url, path, headers, data, session: Optional[requests.Session] = None):
session = (session or uid2_client.default_new_session()
) or __default_new_session()
return session.post(_make_url(base_url, path), data=data, headers=headers, timeout=5)