import http.server import socketserver import json import os import sys from urllib.parse import urlparse, parse_qs PORT = 8000 DB_FILE = 'database.json' def load_db(): if not os.path.exists(DB_FILE): return {"users": [], "posts": []} try: with open(DB_FILE, 'r') as f: return json.load(f) except: return {"users": [], "posts": []} def save_db(data): with open(DB_FILE, 'w') as f: json.dump(data, f, indent=2) class CustomHandler(http.server.SimpleHTTPRequestHandler): def do_GET(self): parsed = urlparse(self.path) if parsed.path == '/api/users': self.send_response(200) self.send_header('Content-type', 'application/json') self.send_header('Cache-Control', 'no-store, no-cache, must-revalidate') self.end_headers() db = load_db() self.wfile.write(json.dumps(db.get("users", [])).encode()) return elif parsed.path == '/api/posts': self.send_response(200) self.send_header('Content-type', 'application/json') self.send_header('Cache-Control', 'no-store, no-cache, must-revalidate') self.end_headers() db = load_db() self.wfile.write(json.dumps(db.get("posts", [])).encode()) return # Default behavior (serve files) super().do_GET() def do_POST(self): parsed = urlparse(self.path) length = int(self.headers.get('Content-Length', 0)) body = self.rfile.read(length).decode('utf-8') try: payload = json.loads(body) except: payload = None if parsed.path == '/api/users/add': db = load_db() db["users"].append(payload) save_db(db) self.success(payload) return elif parsed.path == '/api/posts/add': db = load_db() # New posts go to top db["posts"].insert(0, payload) save_db(db) self.success(payload) return elif parsed.path == '/api/posts/update': # Expects full post object, finds by ID and replaces db = load_db() posts = db.get("posts", []) for i, p in enumerate(posts): if p["id"] == payload["id"]: posts[i] = payload break db["posts"] = posts save_db(db) self.success(payload) return elif parsed.path == '/api/posts/delete': # Expects { "id": "..." } db = load_db() posts = db.get("posts", []) db["posts"] = [p for p in posts if p["id"] != payload["id"]] save_db(db) self.success({"deleted": True}) return self.send_error(404, "API Endpoint not found") def success(self, data): self.send_response(200) self.send_header('Content-type', 'application/json') self.end_headers() self.wfile.write(json.dumps(data).encode()) # Support binding to all interfaces Handler = CustomHandler with socketserver.TCPServer(("0.0.0.0", PORT), Handler) as httpd: print(f"Serving at http://0.0.0.0:{PORT}") try: httpd.serve_forever() except KeyboardInterrupt: print("\nStopping server...")