Skip to content

Commit 856d647

Browse files
Omit null values from requests by default
1 parent 23d47eb commit 856d647

File tree

1 file changed

+28
-7
lines changed

1 file changed

+28
-7
lines changed

authsignal/client.py

+28-7
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import json
88
import requests
99
import urllib.parse
10+
from requests.adapters import HTTPAdapter
1011

1112
_UNICODE_STRING = str
1213

@@ -24,6 +25,31 @@ def default(self, o):
2425
return (str(o),)
2526
return super(DecimalEncoder, self).default(o)
2627

28+
class CustomSession(requests.Session):
29+
def __init__(self):
30+
super().__init__()
31+
self.mount('http://', HTTPAdapter())
32+
self.mount('https://', HTTPAdapter())
33+
34+
def prepare_request(self, request):
35+
# Prepare the request to access the body
36+
prepared_request = super().prepare_request(request)
37+
38+
# Remove None values from JSON payload
39+
if prepared_request.headers.get('Content-Type') == 'application/json' and prepared_request.body:
40+
try:
41+
data = json.loads(prepared_request.body)
42+
cleaned_data = self._remove_none_values(data)
43+
prepared_request.body = json.dumps(cleaned_data)
44+
except json.JSONDecodeError:
45+
pass
46+
return prepared_request
47+
48+
@staticmethod
49+
def _remove_none_values(d: Dict[str, Any]) -> Dict[str, Any]:
50+
"""Remove keys with None values from a dictionary."""
51+
return {k: v for k, v in d.items() if v is not None}
52+
2753
class Client(object):
2854

2955
def __init__(
@@ -47,7 +73,7 @@ def __init__(
4773
if api_key is None:
4874
api_key = authsignal.api_key
4975

50-
self.session = session or requests.Session()
76+
self.session = session or CustomSession()
5177
self.api_key = api_key
5278
self.url = api_url
5379
self.timeout = timeout
@@ -241,17 +267,12 @@ def validate_challenge(self, token: str, user_id: Optional[str] = None, action:
241267
'Accept': 'application/json'
242268
}
243269

244-
payload = {'token': token}
245-
if user_id is not None:
246-
payload['userId'] = user_id
247-
if action is not None:
248-
payload['action'] = action
249270

250271
try:
251272
response = self.session.post(
252273
path,
253274
auth=requests.auth.HTTPBasicAuth(self.api_key, ''),
254-
data=json.dumps(payload),
275+
data=json.dumps({'token': token, 'userId': user_id, 'action': action}),
255276
headers=headers,
256277
timeout=self.timeout
257278
)

0 commit comments

Comments
 (0)