LittleApple_fp16
upload
69a6cef
raw
history blame
5.52 kB
import json
import logging
import os
import random
import time
from typing import Optional, Dict
import requests
from huggingface_hub import hf_hub_download
from requests.adapters import HTTPAdapter, Retry
from requests.exceptions import RequestException
DEFAULT_TIMEOUT = 30 # seconds
class TimeoutHTTPAdapter(HTTPAdapter):
"""
Custom HTTP adapter that sets a default timeout for requests.
Inherits from `HTTPAdapter`.
Usage:
- Create an instance of `TimeoutHTTPAdapter` and pass it to a `requests.Session` object's `mount` method.
Example:
```python
session = requests.Session()
adapter = TimeoutHTTPAdapter(timeout=10)
session.mount('http://', adapter)
session.mount('https://', adapter)
```
:param timeout: The default timeout value in seconds. (default: 10)
:type timeout: int
"""
def __init__(self, *args, **kwargs):
self.timeout = DEFAULT_TIMEOUT
if "timeout" in kwargs:
self.timeout = kwargs["timeout"]
del kwargs["timeout"]
super().__init__(*args, **kwargs)
def send(self, request, **kwargs):
"""
Sends a request with the provided timeout value.
:param request: The request to send.
:type request: PreparedRequest
:param kwargs: Additional keyword arguments.
:type kwargs: dict
:returns: The response from the request.
:rtype: Response
"""
timeout = kwargs.get("timeout")
if timeout is None:
kwargs["timeout"] = self.timeout
return super().send(request, **kwargs)
def get_requests_session(max_retries: int = 5, timeout: int = DEFAULT_TIMEOUT, verify: bool = True,
headers: Optional[Dict[str, str]] = None, session: Optional[requests.Session] = None) \
-> requests.Session:
"""
Returns a requests Session object configured with retry and timeout settings.
:param max_retries: The maximum number of retries. (default: 5)
:type max_retries: int
:param timeout: The default timeout value in seconds. (default: 10)
:type timeout: int
:param headers: Additional headers to be added to the session. (default: None)
:type headers: Optional[Dict[str, str]]
:param session: An existing requests Session object to use. If not provided, a new Session object is created. (default: None)
:type session: Optional[requests.Session]
:returns: The requests Session object.
:rtype: requests.Session
"""
session = session or requests.session()
retries = Retry(
total=max_retries, backoff_factor=1,
status_forcelist=[408, 413, 429, 500, 501, 502, 503, 504, 505, 506, 507, 509, 510, 511],
allowed_methods=["HEAD", "GET", "POST", "PUT", "DELETE", "OPTIONS", "TRACE"],
)
adapter = TimeoutHTTPAdapter(max_retries=retries, timeout=timeout, pool_connections=32, pool_maxsize=32)
session.mount('http://', adapter)
session.mount('https://', adapter)
session.headers.update({
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36",
**dict(headers or {}),
})
if not verify:
session.verify = False
return session
def get_civitai_session(
civitai_repository: str = 'narugo/civitai_session',
max_retries: int = 5, timeout: int = DEFAULT_TIMEOUT, verify: bool = True,
headers: Optional[Dict[str, str]] = None, session: Optional[requests.Session] = None) -> requests.Session:
session = get_requests_session(max_retries, timeout, verify, headers, session)
session_file = hf_hub_download(repo_id=civitai_repository, repo_type='dataset',
filename='session.json', token=os.environ['HF_TOKEN'])
with open(session_file, 'r', encoding='utf-8') as f:
session.cookies.update(json.load(f)['cookies'])
return session
def srequest(session: requests.Session, method, url, *, max_retries: int = 5,
sleep_time: float = 5.0, raise_for_status: bool = True, **kwargs) -> requests.Response:
"""
Send a request using the provided session object with retry and timeout settings.
:param session: The requests Session object to use for the request.
:type session: requests.Session
:param method: The HTTP method for the request.
:type method: str
:param url: The URL for the request.
:type url: str
:param max_retries: The maximum number of retries. (default: 5)
:type max_retries: int
:param sleep_time: The sleep time between retries in seconds. (default: 5.0)
:type sleep_time: float
:param raise_for_status: Whether to raise an exception for non-successful response status codes. (default: True)
:type raise_for_status: bool
:param kwargs: Additional keyword arguments for the request.
:type kwargs: dict
:returns: The response from the request.
:rtype: requests.Response
"""
if isinstance(session, (list, tuple)):
session = random.choice(session)
resp = None
for _ in range(max_retries):
try:
resp = session.request(method, url, **kwargs)
except RequestException as err:
logging.error(f'Request error - {err!r}')
time.sleep(sleep_time)
else:
break
assert resp is not None, f'Request failed for {max_retries} time(s).'
if raise_for_status:
resp.raise_for_status()
return resp