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}")