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:
parent
faf85ee68a
commit
72a7cb928e
2 changed files with 25 additions and 2 deletions
|
|
@ -9,12 +9,26 @@ async function request(path, options = {}) {
|
|||
...options,
|
||||
});
|
||||
|
||||
const isJson = res.headers.get('content-type')?.includes('application/json');
|
||||
const data = isJson ? await res.json() : null;
|
||||
// Bewusst unabhängig vom Content-Type-Header versucht: der Header kann durch
|
||||
// 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) {
|
||||
throw new Error(data?.error || `Fehler ${res.status}`);
|
||||
}
|
||||
if (data === null && rawText) {
|
||||
throw new Error('Unerwartete Server-Antwort (kein gültiges JSON)');
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,11 @@
|
|||
<?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';
|
||||
|
||||
use App\Controllers\AdminUserController;
|
||||
|
|
@ -163,6 +169,9 @@ $path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
|
|||
$apiBase = rtrim($config['app']['base_path'], '/') . '/api';
|
||||
$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');
|
||||
|
||||
try {
|
||||
|
|
|
|||
Loading…
Reference in a new issue