From f05dfb702726c4fdd49b06926eeca78a6f1a0012 Mon Sep 17 00:00:00 2001
From: Julian Rother <julian@jrother.eu>
Date: Wed, 28 Jul 2021 15:20:17 +0200
Subject: [PATCH] Added http request caching with cachecontrol

---
 config.json      | 3 ++-
 requirements.txt | 2 ++
 server.py        | 8 +++++---
 3 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/config.json b/config.json
index ed8458c..e04452f 100644
--- a/config.json
+++ b/config.json
@@ -3,5 +3,6 @@
 	"bind_password": "thisisthebindpassword",
 	"api_baseurl": "http://localhost:5000/api/v1",
 	"api_key": "secretapikey",
-	"listen_addr": "127.0.0.1:3389"
+	"listen_addr": "127.0.0.1:3389",
+	"cache_ttl": 60
 }
diff --git a/requirements.txt b/requirements.txt
index 0091a34..b636ab0 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,2 +1,4 @@
 --extra-index-url https://git.cccv.de/api/v4/projects/220/packages/pypi/simple
 ldapserver==0.0.1.dev3
+
+CacheControl
diff --git a/server.py b/server.py
index 6a53bf5..99257bc 100644
--- a/server.py
+++ b/server.py
@@ -2,6 +2,8 @@ import sys
 import json
 import socketserver
 import requests
+from cachecontrol import CacheControl
+from cachecontrol.heuristics import ExpiresAfter
 
 from ldapserver import SimpleLDAPRequestHandler
 from ldapserver.dn import DN, RDN
@@ -12,10 +14,10 @@ from ldapserver.exceptions import LDAPInvalidCredentials
 from ldapserver.schema import RFC2307BIS_SUBSCHEMA
 
 class UffdAPI:
-	def __init__(self, baseurl, key):
+	def __init__(self, baseurl, key, cache_ttl=60):
 		self.baseurl = baseurl
 		self.key = key
-		self.session = requests.Session()
+		self.session = CacheControl(requests.Session(), heuristic=ExpiresAfter(seconds=cache_ttl))
 		self.session.headers['Authorization'] = 'Bearer '+self.key
 
 	def get(self, endpoint, **kwargs):
@@ -191,7 +193,7 @@ class RequestHandler(SimpleLDAPRequestHandler):
 
 def main(config):
 	dn_base = DN(config['dn_base'])
-	api = UffdAPI(config['api_baseurl'], config['api_key'])
+	api = UffdAPI(config['api_baseurl'], config['api_key'], config.get('cache_ttl', 60))
 	user_directory = UserDirectory(api, dn_base)
 	group_directory = GroupDirectory(api, dn_base)
 
-- 
GitLab