45 lines
1.4 KiB
Python
45 lines
1.4 KiB
Python
|
|
import json
|
||
|
|
import os
|
||
|
|
import gzip
|
||
|
|
from datetime import datetime, timezone
|
||
|
|
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
|
||
|
|
|
||
|
|
|
||
|
|
LOG_FILE = os.environ.get("OPA_REQUEST_LOG_FILE", "/logs/opa.log")
|
||
|
|
PORT = int(os.environ.get("OPA_REQUEST_LOG_PORT", "8282"))
|
||
|
|
|
||
|
|
|
||
|
|
class DecisionLogHandler(BaseHTTPRequestHandler):
|
||
|
|
def do_POST(self):
|
||
|
|
content_length = int(self.headers.get("Content-Length", "0"))
|
||
|
|
raw_payload = self.rfile.read(content_length) if content_length else b""
|
||
|
|
content_encoding = self.headers.get("Content-Encoding", "").lower()
|
||
|
|
|
||
|
|
if content_encoding == "gzip" and raw_payload:
|
||
|
|
raw_payload = gzip.decompress(raw_payload)
|
||
|
|
|
||
|
|
payload = raw_payload.decode("utf-8") if raw_payload else ""
|
||
|
|
|
||
|
|
entry = {
|
||
|
|
"timestamp": datetime.now(timezone.utc).isoformat(),
|
||
|
|
"path": self.path,
|
||
|
|
"headers": dict(self.headers.items()),
|
||
|
|
"body": json.loads(payload) if payload else None,
|
||
|
|
}
|
||
|
|
|
||
|
|
os.makedirs(os.path.dirname(LOG_FILE), exist_ok=True)
|
||
|
|
with open(LOG_FILE, "a", encoding="utf-8") as log_file:
|
||
|
|
log_file.write(json.dumps(entry, ensure_ascii=True) + "\n")
|
||
|
|
|
||
|
|
self.send_response(200)
|
||
|
|
self.end_headers()
|
||
|
|
self.wfile.write(b"ok")
|
||
|
|
|
||
|
|
def log_message(self, format, *args):
|
||
|
|
return
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
server = ThreadingHTTPServer(("0.0.0.0", PORT), DecisionLogHandler)
|
||
|
|
server.serve_forever()
|