Skip to content

Commit ce70994

Browse files
authored
Merge pull request #1 from PilotDataPlatform/async
Updating to use async
2 parents 503df44 + 4ceea76 commit ce70994

12 files changed

+2462
-2116
lines changed

Diff for: 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

Diff for: README.md

+89-83
Large diffs are not rendered by default.

Diff for: poetry.lock

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

Diff for: 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"

Diff for: src/keycloak/connection.py

+17-26
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:
85-
self._s.proxies.update(proxies)
77+
self._s.proxies = 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,18 @@ 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,
217+
files=kwargs.get('files'),
225218
headers=self.headers,
226219
timeout=self.timeout,
227-
verify=self.verify,
228220
)
229221
except Exception as e:
230222
raise KeycloakConnectionError("Can't connect to server (%s)" % e)
231223

232-
def raw_put(self, path, data, **kwargs):
224+
async def raw_put(self, path, data, **kwargs):
233225
"""Submit put request to the path.
234226
235227
:param path: Path for request.
@@ -243,18 +235,17 @@ def raw_put(self, path, data, **kwargs):
243235
:raises KeycloakConnectionError: HttpError Can't connect to server.
244236
"""
245237
try:
246-
return self._s.put(
238+
return await self._s.put(
247239
urljoin(self.base_url, path),
248240
params=kwargs,
249241
data=data,
250242
headers=self.headers,
251243
timeout=self.timeout,
252-
verify=self.verify,
253244
)
254245
except Exception as e:
255246
raise KeycloakConnectionError("Can't connect to server (%s)" % e)
256247

257-
def raw_delete(self, path, data=None, **kwargs):
248+
async def raw_delete(self, path, data=None, **kwargs):
258249
"""Submit delete request to the path.
259250
260251
:param path: Path for request.
@@ -268,13 +259,13 @@ def raw_delete(self, path, data=None, **kwargs):
268259
:raises KeycloakConnectionError: HttpError Can't connect to server.
269260
"""
270261
try:
271-
return self._s.delete(
262+
return await self._s.request(
263+
"DELETE",
272264
urljoin(self.base_url, path),
273265
params=kwargs,
274266
data=data or dict(),
275267
headers=self.headers,
276268
timeout=self.timeout,
277-
verify=self.verify,
278269
)
279270
except Exception as e:
280271
raise KeycloakConnectionError("Can't connect to server (%s)" % e)

Diff for: 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)