Semaine 11
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user