http.py

1.3 kB · python · 39 lines

1import json2import socket3from urllib.error import HTTPError, URLError4from urllib.parse import urlencode5from urllib.request import Request, urlopen6from .errors import Retry78TIMEOUT = 30910class Response:1112    def __init__(self, status_code: int, body):13        self.status_code = status_code14        self._body = body1516    @property17    def text(self) -> str:18        return self._body.decode() if isinstance(self._body, bytes) else self._body1920    def json(self) -> dict:21        return json.loads(self._body)2223def request(method: str, url: str, headers: dict = None, data: dict = None, json_data=None) -> Response:24    headers = dict(headers) if headers else {}25    body = None26    if json_data is not None:27        body = json.dumps(json_data).encode()28        headers.setdefault("Content-Type", "application/json")29    elif data is not None:30        body = urlencode(data).encode()31        headers.setdefault("Content-Type", "application/x-www-form-urlencoded")32    req = Request(url, data=body, headers=headers, method=method)33    try:34        response = urlopen(req, timeout=TIMEOUT)35        return Response(response.status, response.read())36    except HTTPError as error:37        return Response(error.code, error.read())38    except (URLError, socket.timeout, TimeoutError) as error:39        raise Retry(f"{type(error).__name__} on {method} {url}")