From 2506199c5f41dbc4982f6f13733dbec5b1358bd8 Mon Sep 17 00:00:00 2001 From: buiaca Date: Wed, 12 Aug 2026 11:54:32 +0200 Subject: [PATCH] Add server.py: HTTP API server for IBAN generation via /api?konto=...&blz=... --- Hermes/iban_tool/iban_tool_windows.zip | Bin 1708 -> 3788 bytes Hermes/iban_tool/server.py | 141 +++++++++++++++++++++++++ 2 files changed, 141 insertions(+) create mode 100644 Hermes/iban_tool/server.py diff --git a/Hermes/iban_tool/iban_tool_windows.zip b/Hermes/iban_tool/iban_tool_windows.zip index b920534e2068c7d1b861adf0d60133bd467f4d73..d997cea25e86fdfe8c2ce93600419fa202091d01 100644 GIT binary patch delta 2469 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 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" + "IBAN Generator API\n" + "\n" + "\n\n" + "

IBAN Generator API

\n" + "

Dieser Dienst generiert deutsche IBAN-Adressen aus Kontonummer und Bankleitzahl.

\n" + "

API-Endpunkt

\n" + "

/api?konto={Kontonummer}&blz={Bankleitzahl}

\n" + "

Beispiel

\n" + "

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