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()