mm-std 0.3.24__py3-none-any.whl → 0.3.25__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
mm_std/http_.py
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
import json
|
2
2
|
from dataclasses import asdict, dataclass, field
|
3
|
-
from typing import Any
|
4
|
-
from urllib.parse import urlencode
|
3
|
+
from typing import Any, cast
|
4
|
+
from urllib.parse import urlencode, urlparse
|
5
5
|
|
6
6
|
import aiohttp
|
7
7
|
import pydash
|
8
8
|
import requests
|
9
9
|
from aiohttp_socks import ProxyConnector
|
10
|
+
from multidict import CIMultiDictProxy
|
10
11
|
from requests.auth import AuthBase
|
11
12
|
|
12
13
|
from mm_std.result import Err, Ok, Result
|
@@ -77,6 +78,9 @@ class HResponse:
|
|
77
78
|
def is_connection_error(self) -> bool:
|
78
79
|
return self.error is not None and self.error.startswith("connection:")
|
79
80
|
|
81
|
+
def is_dns_error(self) -> bool:
|
82
|
+
return self.error is not None and self.error.startswith("dns:")
|
83
|
+
|
80
84
|
def to_dict(self) -> dict[str, Any]:
|
81
85
|
return pydash.omit(asdict(self), "_json_data")
|
82
86
|
|
@@ -185,52 +189,50 @@ async def hrequest_async(
|
|
185
189
|
request_kwargs["auth"] = aiohttp.BasicAuth(auth[0], auth[1])
|
186
190
|
|
187
191
|
if proxy and proxy.startswith("socks"):
|
188
|
-
|
189
|
-
|
190
|
-
res = await _aiohttp(url, method, request_kwargs, timeout=timeout, proxy=proxy)
|
192
|
+
return await _aiohttp_socks5(url, method, proxy, request_kwargs, timeout)
|
193
|
+
return await _aiohttp(url, method, request_kwargs, timeout=timeout, proxy=proxy)
|
191
194
|
|
192
|
-
return HResponse(code=res.status, body=res.body, headers=res.headers)
|
193
195
|
except TimeoutError:
|
194
196
|
return HResponse(error="timeout")
|
195
|
-
except (aiohttp.ClientProxyConnectionError, aiohttp.ClientHttpProxyError):
|
196
|
-
|
197
|
-
|
197
|
+
except (aiohttp.ClientProxyConnectionError, aiohttp.ClientHttpProxyError, aiohttp.ClientConnectorError) as err:
|
198
|
+
if is_proxy_error(str(err), proxy):
|
199
|
+
return HResponse(error="proxy")
|
198
200
|
return HResponse(error=f"connection: {err}")
|
199
201
|
except aiohttp.ClientError as err:
|
200
202
|
return HResponse(error=f"error: {err}")
|
201
203
|
except Exception as err:
|
202
|
-
if "couldn't connect to proxy" in str(err).lower():
|
203
|
-
return HResponse(error="proxy")
|
204
204
|
return HResponse(error=f"exception: {err}")
|
205
205
|
|
206
206
|
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
207
|
+
def is_proxy_error(error_message: str, proxy: str | None) -> bool:
|
208
|
+
if not proxy:
|
209
|
+
return False
|
210
|
+
error_message = error_message.lower()
|
211
|
+
if "proxy" in error_message:
|
212
|
+
return True
|
213
|
+
return bool("cannot connect to" in error_message and cast(str, urlparse(proxy).hostname) in error_message)
|
212
214
|
|
213
215
|
|
214
216
|
async def _aiohttp(
|
215
217
|
url: str, method: str, request_kwargs: dict[str, object], timeout: float | None = None, proxy: str | None = None
|
216
|
-
) ->
|
218
|
+
) -> HResponse:
|
217
219
|
if proxy:
|
218
220
|
request_kwargs["proxy"] = proxy
|
219
221
|
client_timeout = aiohttp.ClientTimeout(total=timeout) if timeout else None
|
220
222
|
async with aiohttp.ClientSession(timeout=client_timeout) as session, session.request(method, url, **request_kwargs) as res: # type: ignore[arg-type]
|
221
|
-
return
|
223
|
+
return HResponse(code=res.status, body=await res.text(), headers=headers_dict(res.headers))
|
222
224
|
|
223
225
|
|
224
226
|
async def _aiohttp_socks5(
|
225
227
|
url: str, method: str, proxy: str, request_kwargs: dict[str, object], timeout: float | None = None
|
226
|
-
) ->
|
228
|
+
) -> HResponse:
|
227
229
|
connector = ProxyConnector.from_url(proxy)
|
228
230
|
client_timeout = aiohttp.ClientTimeout(total=timeout) if timeout else None
|
229
231
|
async with (
|
230
232
|
aiohttp.ClientSession(connector=connector, timeout=client_timeout) as session,
|
231
233
|
session.request(method, url, **request_kwargs) as res, # type: ignore[arg-type]
|
232
234
|
):
|
233
|
-
return
|
235
|
+
return HResponse(code=res.status, body=await res.text(), headers=headers_dict(res.headers))
|
234
236
|
|
235
237
|
|
236
238
|
def add_query_params_to_url(url: str, params: dict[str, object]) -> str:
|
@@ -242,3 +244,14 @@ def add_query_params_to_url(url: str, params: dict[str, object]) -> str:
|
|
242
244
|
|
243
245
|
hr = hrequest
|
244
246
|
hra = hrequest_async
|
247
|
+
|
248
|
+
|
249
|
+
def headers_dict(headers: CIMultiDictProxy[str]) -> dict[str, str]:
|
250
|
+
result: dict[str, str] = {}
|
251
|
+
for key in headers:
|
252
|
+
values = headers.getall(key)
|
253
|
+
if len(values) == 1:
|
254
|
+
result[key] = values[0]
|
255
|
+
else:
|
256
|
+
result[key] = ", ".join(values)
|
257
|
+
return result
|
@@ -6,7 +6,7 @@ mm_std/date.py,sha256=976eEkSONuNqHQBgSRu8hrtH23tJqztbmHFHLdbP2TY,1879
|
|
6
6
|
mm_std/dict.py,sha256=6GkhJPXD0LiJDxPcYe6jPdEDw-MN7P7mKu6U5XxwYDk,675
|
7
7
|
mm_std/env.py,sha256=5zaR9VeIfObN-4yfgxoFeU5IM1GDeZZj9SuYf7t9sOA,125
|
8
8
|
mm_std/fs.py,sha256=RwarNRJq3tIMG6LVX_g03hasfYpjYFh_O27oVDt5IPQ,291
|
9
|
-
mm_std/http_.py,sha256=
|
9
|
+
mm_std/http_.py,sha256=5_V5Hx1M07xwzf0VVqAsxSFJkvtaAhj9_sFQP_HliQw,8215
|
10
10
|
mm_std/json_.py,sha256=Naa6mBE4D0yiQGkPNRrFvndnUH3R7ovw3FeaejWV60o,1196
|
11
11
|
mm_std/log.py,sha256=0TkTsAlUTt00gjgukvsvnZRIAGELq0MI6Lv8mKP-Wz4,2887
|
12
12
|
mm_std/net.py,sha256=qdRCBIDneip6FaPNe5mx31UtYVmzqam_AoUF7ydEyjA,590
|
@@ -25,6 +25,6 @@ mm_std/concurrency/async_task_runner.py,sha256=EN7tN2enkVYVgDbhSiAr-_W4o9m9wBXCv
|
|
25
25
|
mm_std/concurrency/sync_decorators.py,sha256=syCQBOmN7qPO55yzgJB2rbkh10CVww376hmyvs6e5tA,1080
|
26
26
|
mm_std/concurrency/sync_scheduler.py,sha256=j4tBL_cBI1spr0cZplTA7N2CoYsznuORMeRN8rpR6gY,2407
|
27
27
|
mm_std/concurrency/sync_task_runner.py,sha256=s5JPlLYLGQGHIxy4oDS-PN7O9gcy-yPZFoNm8RQwzcw,1780
|
28
|
-
mm_std-0.3.
|
29
|
-
mm_std-0.3.
|
30
|
-
mm_std-0.3.
|
28
|
+
mm_std-0.3.25.dist-info/METADATA,sha256=dLHZWg8G8cs5y3S8bu3zwxW-qgJaGaBGVQxS8vl4lcg,415
|
29
|
+
mm_std-0.3.25.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
30
|
+
mm_std-0.3.25.dist-info/RECORD,,
|
File without changes
|