Fix API responses silently becoming null on the live server

Symptom: Admin-Login zeigte "Cannot read properties of null (reading
'requires_2fa')". Ursache: falls vor den header()-Aufrufen in index.php
irgendeine Ausgabe passiert (z.B. eine PHP-Notice - passiert offenbar auf
PHP 8.4 anders als lokal auf 8.2), geht der Content-Type-Header verloren,
und der Client hat JSON-Antworten dann still als null behandelt statt
sie zu parsen. Backend puffert Ausgaben jetzt und verwirft ungewollten
Output vor den Headern; Client versucht JSON-Parsing jetzt unabhaengig
vom Content-Type-Header und wirft einen klaren Fehler statt still null
zurueckzugeben.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Maaxxs 2026-07-05 16:16:11 +02:00
parent faf85ee68a
commit 72a7cb928e
2 changed files with 25 additions and 2 deletions

View file

@ -9,12 +9,26 @@ async function request(path, options = {}) {
...options, ...options,
}); });
const isJson = res.headers.get('content-type')?.includes('application/json'); // Bewusst unabhängig vom Content-Type-Header versucht: der Header kann durch
const data = isJson ? await res.json() : null; // eine versehentliche Server-Ausgabe vor den PHP-header()-Aufrufen verloren
// gehen, obwohl der Body trotzdem gültiges JSON enthält. Ohne das würde ein
// eigentlich erfolgreicher Request still `null` liefern statt die echten Daten.
const rawText = await res.text();
let data = null;
if (rawText) {
try {
data = JSON.parse(rawText);
} catch {
// Antwort war kein gültiges JSON - unten anhand von res.ok/rawText behandelt.
}
}
if (!res.ok) { if (!res.ok) {
throw new Error(data?.error || `Fehler ${res.status}`); throw new Error(data?.error || `Fehler ${res.status}`);
} }
if (data === null && rawText) {
throw new Error('Unerwartete Server-Antwort (kein gültiges JSON)');
}
return data; return data;
} }

View file

@ -1,5 +1,11 @@
<?php <?php
// Fängt versehentliche Ausgaben vor den header()-Aufrufen ab (z.B. PHP-
// Warnungen/Notices oder ein BOM in einer Datei) - ohne das würde eine solche
// Ausgabe den Content-Type-Header verhindern ("headers already sent"), das
// Frontend bekäme dann keine gültige JSON-Antwort mehr, sondern still null.
ob_start();
require __DIR__ . '/../vendor/autoload.php'; require __DIR__ . '/../vendor/autoload.php';
use App\Controllers\AdminUserController; use App\Controllers\AdminUserController;
@ -163,6 +169,9 @@ $path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$apiBase = rtrim($config['app']['base_path'], '/') . '/api'; $apiBase = rtrim($config['app']['base_path'], '/') . '/api';
$route = '/' . ltrim(substr($path, strlen($apiBase)), '/'); $route = '/' . ltrim(substr($path, strlen($apiBase)), '/');
// Alles, was bis hierhin versehentlich ausgegeben wurde, verwerfen - danach
// kann der Content-Type-Header noch garantiert gesetzt werden.
ob_clean();
header('Content-Type: application/json; charset=utf-8'); header('Content-Type: application/json; charset=utf-8');
try { try {