From 6529553df2e752c6826c126aa301ec934bf80c4a Mon Sep 17 00:00:00 2001 From: Matt Collins Date: Fri, 5 Jul 2024 11:03:37 +1000 Subject: [PATCH 1/2] Reuse session by default This will reuse the underlying TCP connection, which can result in a significant performance increase. Sessions are not threadsafe, so we create thread local sessions. --- uid2_client/request_response_util.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/uid2_client/request_response_util.py b/uid2_client/request_response_util.py index c4741b7..65e2594 100644 --- a/uid2_client/request_response_util.py +++ b/uid2_client/request_response_util.py @@ -1,9 +1,12 @@ import base64 -from importlib.metadata import version import os +import threading +from importlib.metadata import version +from typing import Optional + import requests -from uid2_client.encryption import _encrypt_gcm, _decrypt_gcm +from uid2_client.encryption import _decrypt_gcm, _encrypt_gcm def _make_url(base_url, path): @@ -40,5 +43,14 @@ def parse_v2_response(secret_key, encrypted, nonce): return payload[16:] -def post(base_url, path, headers, data): - return requests.post(_make_url(base_url, path), data=data, headers=headers) +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 __default_new_session() + + return session.post(_make_url(base_url, path), data=data, headers=headers, timeout=5) From 5a16d10615164477cd8fed4c2bfba388464d9bd9 Mon Sep 17 00:00:00 2001 From: Matt Collins Date: Fri, 5 Jul 2024 16:32:48 +1000 Subject: [PATCH 2/2] Allow globally overriding default session Example: ``` my_session = requests.Session() my_session.verify = 'rootCA.pem' uid2_client.default_new_session = lambda: my_session ``` --- uid2_client/__init__.py | 1 + uid2_client/request_response_util.py | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/uid2_client/__init__.py b/uid2_client/__init__.py index 608a265..06cc20e 100644 --- a/uid2_client/__init__.py +++ b/uid2_client/__init__.py @@ -7,6 +7,7 @@ decrypt_token: decrypt and advertising token to extract advertising ID from it """ +default_new_session = lambda: None from .auto_refresh import * from .client import * diff --git a/uid2_client/request_response_util.py b/uid2_client/request_response_util.py index 65e2594..553e370 100644 --- a/uid2_client/request_response_util.py +++ b/uid2_client/request_response_util.py @@ -6,6 +6,7 @@ import requests +import uid2_client from uid2_client.encryption import _decrypt_gcm, _encrypt_gcm @@ -51,6 +52,7 @@ def __default_new_session(threadlocal=threading.local()): def post(base_url, path, headers, data, session: Optional[requests.Session] = None): - session = session or __default_new_session() + 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)