#!/usr/bin/env python3 """ server.py - HTTP-API-Server für IBAN-Generierung. Startet einen lokalen Webserver, der Anfragen im Format /api?konto=123456789&blz=10020520 bedient und eine IBAN als JSON zurückgibt. Nutzung: venv/bin/python server.py [PORT] [--host HOST] Standard: localhost:8000 Beispiel-Anfrage: curl "http://localhost:8000/api?konto=123456789&blz=10020520" """ import argparse import json import sys import urllib.parse from http.server import HTTPServer, BaseHTTPRequestHandler # Importiert die Kernlogik aus iban.py (muss im selben Verzeichnis liegen) from iban import generate_iban class IBANRequestHandler(BaseHTTPRequestHandler): """HTTP-Request-Handler für die IBAN-Generierungs-API.""" def do_GET(self): """Verarbeitet GET-Anfragen an /api.""" # Stelle eine minimale Indexseite bereit if self.path == "/" or self.path == "": self._serve_index() return # Route: /api?konto=...&blz=... if not self.path.startswith("/api"): self._send_json(404, {"error": "Nicht gefunden", "valid": False}) return self._handle_api_request() def _handle_api_request(self): """Parst Query-Parameter und ruft die IBAN-Logik auf.""" parsed = urllib.parse.urlparse(self.path) params = urllib.parse.parse_qs(parsed.query) kontonummer = params.get("konto", [None])[0] bankleitzahl = params.get("blz", [None])[0] if not kontonummer or not bankleitzahl: self._send_json( 400, { "error": "Parameter 'konto' und 'blz' sind erforderlich.", "valid": False, }, ) return try: result = generate_iban(kontonummer, bankleitzahl) self._send_json(200, result) except Exception as e: self._send_json( 500, { "error": f"Interner Serverfehler: {str(e)}", "valid": False, }, ) def _serve_index(self): """Liefert eine einfache HTML-Indexseite.""" html = ( "\n" "\n
\n" "\n" "\n" "Dieser Dienst generiert deutsche IBAN-Adressen aus Kontonummer und Bankleitzahl.
\n" "/api?konto={Kontonummer}&blz={Bankleitzahl}
\n" "/api?konto=123456789&blz=10020520\n" "
\n" "\n\n" ) self.send_response(200) self.send_header("Content-Type", "text/html; charset=utf-8") self.end_headers() self.wfile.write(html.encode("utf-8")) def _send_json(self, status_code: int, data: dict): """Sendet eine JSON-Antwort mit angegebenem Statuscode.""" body = json.dumps(data, ensure_ascii=False, indent=2) self.send_response(status_code) self.send_header("Content-Type", "application/json; charset=utf-8") self.send_header("Access-Control-Allow-Origin", "*") # CORS für Frontend-Tests self.end_headers() self.wfile.write(body.encode("utf-8")) def main(): parser = argparse.ArgumentParser( description="Startet einen lokalen HTTP-Server für die IBAN-Generierungs-API." ) parser.add_argument( "port", nargs="?", type=int, default=8000, help="Port für den Server (Standard: 8000)" ) parser.add_argument( "--host", default="0.0.0.0", help="Host-Adresse (Standard: 0.0.0.0 fuer alle Schnittstellen)" ) args = parser.parse_args() print(f"Starte IBAN-API-Server auf http://{args.host}:{args.port}/") print(" GET /api?konto=...&blz=... -> IBAN als JSON") print(" GET / -> Diese Hilfeseite") print("Drücke Strg+C, um den Server zu stoppen.") server = HTTPServer((args.host, args.port), IBANRequestHandler) try: server.serve_forever() except KeyboardInterrupt: print("\nServer wird beendet...") server.server_close() if __name__ == "__main__": main()