diff --git a/Hermes/iban_tool/iban_tool_windows.zip b/Hermes/iban_tool/iban_tool_windows.zip index b920534..d997cea 100644 Binary files a/Hermes/iban_tool/iban_tool_windows.zip and b/Hermes/iban_tool/iban_tool_windows.zip differ diff --git a/Hermes/iban_tool/server.py b/Hermes/iban_tool/server.py new file mode 100644 index 0000000..e9247f9 --- /dev/null +++ b/Hermes/iban_tool/server.py @@ -0,0 +1,141 @@ +#!/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()