Skip to content

Commit 8907ae3

Browse files
committed
Updating to use async for keycloak calls
1 parent 503df44 commit 8907ae3

11 files changed

+2229
-1897
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
## Unreleased
2+
13
## v2.9.0 (2023-01-11)
24

35
### Feat

poetry.lock

+966-774
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

+2-2
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ Documentation = "https://python-keycloak.readthedocs.io/en/latest/"
3030

3131
[tool.poetry.dependencies]
3232
python = "^3.7"
33-
requests = "^2.20.0"
33+
httpx = "^0.23.0"
3434
python-jose = "^3.3.0"
3535
urllib3 = "^1.26.0"
3636
mock = {version = "^4.0.3", optional = true}
@@ -42,7 +42,6 @@ sphinx-rtd-theme = {version = "^1.0.0", optional = true}
4242
readthedocs-sphinx-ext = {version = "^2.1.9", optional = true}
4343
m2r2 = {version = "^0.3.2", optional = true}
4444
sphinx-autoapi = {version = "^2.0.0", optional = true}
45-
requests-toolbelt = "^0.9.1"
4645

4746
[tool.poetry.extras]
4847
docs = [
@@ -61,6 +60,7 @@ docs = [
6160
tox = "^3.25.0"
6261
pytest = "^7.1.2"
6362
pytest-cov = "^3.0.0"
63+
pytest-asyncio = "0.20.3"
6464
wheel = "^0.37.1"
6565
pre-commit = "^2.19.0"
6666
isort = "^5.10.1"

src/keycloak/connection.py

+15-25
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,7 @@
2828
except ImportError: # pragma: no cover
2929
from urlparse import urljoin
3030

31-
import requests
32-
from requests.adapters import HTTPAdapter
31+
import httpx
3332

3433
from .exceptions import KeycloakConnectionError
3534

@@ -67,26 +66,19 @@ def __init__(self, base_url, headers={}, timeout=60, verify=True, proxies=None):
6766
self.headers = headers
6867
self.timeout = timeout
6968
self.verify = verify
70-
self._s = requests.Session()
69+
self._s = httpx.AsyncClient(verify=verify)
7170
self._s.auth = lambda x: x # don't let requests add auth headers
7271

7372
# retry once to reset connection with Keycloak after tomcat's ConnectionTimeout
7473
# see https://github.com/marcospereirampj/python-keycloak/issues/36
75-
for protocol in ("https://", "http://"):
76-
adapter = HTTPAdapter(max_retries=1)
77-
# adds POST to retry whitelist
78-
allowed_methods = set(adapter.max_retries.allowed_methods)
79-
allowed_methods.add("POST")
80-
adapter.max_retries.allowed_methods = frozenset(allowed_methods)
81-
82-
self._s.mount(protocol, adapter)
74+
self._s.transport = httpx.AsyncHTTPTransport(retries=1)
8375

8476
if proxies:
8577
self._s.proxies.update(proxies)
8678

87-
def __del__(self):
79+
async def close(self):
8880
"""Del method."""
89-
self._s.close()
81+
await self._s.aclose()
9082

9183
@property
9284
def base_url(self):
@@ -182,7 +174,7 @@ def del_param_headers(self, key):
182174
"""
183175
self.headers.pop(key, None)
184176

185-
def raw_get(self, path, **kwargs):
177+
async def raw_get(self, path, **kwargs):
186178
"""Submit get request to the path.
187179
188180
:param path: Path for request.
@@ -194,17 +186,17 @@ def raw_get(self, path, **kwargs):
194186
:raises KeycloakConnectionError: HttpError Can't connect to server.
195187
"""
196188
try:
197-
return self._s.get(
189+
return await self._s.request(
190+
"GET",
198191
urljoin(self.base_url, path),
199192
params=kwargs,
200193
headers=self.headers,
201194
timeout=self.timeout,
202-
verify=self.verify,
203195
)
204196
except Exception as e:
205197
raise KeycloakConnectionError("Can't connect to server (%s)" % e)
206198

207-
def raw_post(self, path, data, **kwargs):
199+
async def raw_post(self, path, data, **kwargs):
208200
"""Submit post request to the path.
209201
210202
:param path: Path for request.
@@ -218,18 +210,17 @@ def raw_post(self, path, data, **kwargs):
218210
:raises KeycloakConnectionError: HttpError Can't connect to server.
219211
"""
220212
try:
221-
return self._s.post(
213+
return await self._s.post(
222214
urljoin(self.base_url, path),
223215
params=kwargs,
224216
data=data,
225217
headers=self.headers,
226218
timeout=self.timeout,
227-
verify=self.verify,
228219
)
229220
except Exception as e:
230221
raise KeycloakConnectionError("Can't connect to server (%s)" % e)
231222

232-
def raw_put(self, path, data, **kwargs):
223+
async def raw_put(self, path, data, **kwargs):
233224
"""Submit put request to the path.
234225
235226
:param path: Path for request.
@@ -243,18 +234,17 @@ def raw_put(self, path, data, **kwargs):
243234
:raises KeycloakConnectionError: HttpError Can't connect to server.
244235
"""
245236
try:
246-
return self._s.put(
237+
return await self._s.put(
247238
urljoin(self.base_url, path),
248239
params=kwargs,
249240
data=data,
250241
headers=self.headers,
251242
timeout=self.timeout,
252-
verify=self.verify,
253243
)
254244
except Exception as e:
255245
raise KeycloakConnectionError("Can't connect to server (%s)" % e)
256246

257-
def raw_delete(self, path, data=None, **kwargs):
247+
async def raw_delete(self, path, data=None, **kwargs):
258248
"""Submit delete request to the path.
259249
260250
:param path: Path for request.
@@ -268,13 +258,13 @@ def raw_delete(self, path, data=None, **kwargs):
268258
:raises KeycloakConnectionError: HttpError Can't connect to server.
269259
"""
270260
try:
271-
return self._s.delete(
261+
return await self._s.request(
262+
"DELETE",
272263
urljoin(self.base_url, path),
273264
params=kwargs,
274265
data=data or dict(),
275266
headers=self.headers,
276267
timeout=self.timeout,
277-
verify=self.verify,
278268
)
279269
except Exception as e:
280270
raise KeycloakConnectionError("Can't connect to server (%s)" % e)

src/keycloak/exceptions.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@
2323

2424
"""Keycloak custom exceptions module."""
2525

26-
import requests
27-
2826

2927
class KeycloakError(Exception):
3028
"""Base class for custom Keycloak errors.
@@ -167,7 +165,7 @@ def raise_error_from_response(response, error, expected_codes=None, skip_exists=
167165
expected_codes = [200, 201, 204]
168166

169167
if response.status_code in expected_codes:
170-
if response.status_code == requests.codes.no_content:
168+
if response.status_code == 204:
171169
return {}
172170

173171
try:

0 commit comments

Comments
 (0)