Files
gauvainboiche 0d071d2843 Semaine 11
2026-07-11 21:38:00 +02:00

76 lines
2.6 KiB
Python

import json
import threading
from http.server import BaseHTTPRequestHandler, HTTPServer
from urllib.parse import urlparse
_lock = threading.Lock()
_equipments = []
_next_id = 1
MAX_BODY = 1_048_576 # 1 Mo
class InventoryHandler(BaseHTTPRequestHandler):
def _send_json(self, code, payload):
body = json.dumps(payload).encode("utf-8")
self.send_response(code)
self.send_header("Content-Type", "application/json")
self.send_header("Content-Length", str(len(body)))
self.end_headers()
self.wfile.write(body)
def _read_json(self):
length = int(self.headers.get("Content-Length", 0))
if not length or length > MAX_BODY:
raise ValueError("Corps absent ou trop volumineux.")
if "application/json" not in self.headers.get("Content-Type", ""):
raise ValueError("Content-Type invalide.")
return json.loads(self.rfile.read(length))
def do_GET(self):
path = urlparse(self.path).path
parts = path.strip("/").split("/")
if parts[0] != "equipments":
return self._send_json(404, {"erreur": "route inconnue"})
with _lock:
if len(parts) == 1:
return self._send_json(200, _equipments)
if len(parts) == 2:
try:
eid = int(parts[1])
except ValueError:
return self._send_json(400, {"erreur": "id non entier"})
for e in _equipments:
if e["id"] == eid:
return self._send_json(200, e)
return self._send_json(404, {"erreur": "équipement introuvable"})
return self._send_json(405, {"erreur": "méthode non autorisée"})
def do_POST(self):
global _next_id
if urlparse(self.path).path.rstrip("/") != "/equipments":
return self._send_json(404, {"erreur": "route inconnue"})
try:
data = self._read_json()
except (ValueError, json.JSONDecodeError) as exc:
return self._send_json(400, {"erreur": f"JSON invalide : {exc}"})
if not isinstance(data, dict) or "hostname" not in data or "ip" not in data:
return self._send_json(400, {"erreur": "hostname et ip requis"})
with _lock:
equipement = {"id": _next_id, "hostname": data["hostname"], "ip": data["ip"]}
_equipments.append(equipement)
_next_id += 1
self._send_json(201, equipement)
if __name__ == "__main__":
HTTPServer(("127.0.0.1", 8000), InventoryHandler).serve_forever()