From 8196da840e76dc5105f415396112799d0807dc59 Mon Sep 17 00:00:00 2001 From: Hazel Noack Date: Wed, 11 Jun 2025 11:46:42 +0200 Subject: [PATCH] implemented basic cache --- python_requests/__main__.py | 2 +- python_requests/cache.py | 29 +++++++++++++++++++++++++++++ python_requests/connections.py | 8 ++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 python_requests/cache.py diff --git a/python_requests/__main__.py b/python_requests/__main__.py index 3e664f7..692402f 100644 --- a/python_requests/__main__.py +++ b/python_requests/__main__.py @@ -36,7 +36,7 @@ def cli(): c.generate_headers() print(c.session.headers) - + print(c.get("http://ip.org/")) if __name__ == "__main__": diff --git a/python_requests/cache.py b/python_requests/cache.py new file mode 100644 index 0000000..bcdf068 --- /dev/null +++ b/python_requests/cache.py @@ -0,0 +1,29 @@ +from codecs import encode +from hashlib import sha1 +from pathlib import Path +import requests +import pickle + +from . import CACHE_DIRECTORY + + +def get_url_hash(url: str) -> str: + return sha1(encode(url.strip(), "utf-8")).hexdigest() + + +def get_url_file(url: str) -> Path: + return Path(CACHE_DIRECTORY, f"{get_url_hash(url)}.request") + + +def has_cache(url: str) -> bool: + return get_url_file(url).exists() + + +def get_cache(url: str) -> requests.Response: + with get_url_file(url).open("rb") as cache_file: + return pickle.load(cache_file) + + +def write_cache(url: str, resp: requests.Response): + with get_url_file(url).open("wb") as url_file: + pickle.dump(resp, url_file) diff --git a/python_requests/connections.py b/python_requests/connections.py index 58e8a7a..785710d 100644 --- a/python_requests/connections.py +++ b/python_requests/connections.py @@ -3,6 +3,7 @@ from typing import Optional import requests from urllib.parse import urlparse, urlunsplit, ParseResult +from . import cache class Connection: def __init__(self, session: Optional[requests.Session] = None) -> None: @@ -20,3 +21,10 @@ class Connection: self.session.headers.update(**headers) + def get(self, url: str): + if cache.has_cache(url): + return cache.get_cache(url) + + resp = self.session.get(url) + cache.write_cache(url, resp) + return resp