Files
orascheandClaude Fable 5.1 5121eaa000 Client-Error-Endpoint POST /api/vitec/client-error (0072-FE / 0077-BE)
Neue PSR-15-Middleware ClientErrorMiddleware: nimmt Browser-Fehler des
React-Frontends als JSON {url, message, stack, release, userAgent}
entgegen und antwortet 204 ohne Body. Schutz: 30 Meldungen pro Minute
und IP (Sliding Window ueber TYPO3-RateLimiter, 429 + Retry-After),
8-KB-Body-Limit (413, Content-Length und tatsaechliche Bytes), kein
JSON-Objekt oder leere message = 400, GET = 405. Keine Session, keine
Cookies; der /_json-Praefix funktioniert ebenfalls.

Speicherung in der neuen Tabelle tx_vitec_clienterrorlog mit
anonymisierter IP (IPv4 letztes Oktett 0, IPv6 /48). Sichtbar als
Tabelle "Client errors (last 24 h)" im Modul VITEC SSR (mit Stack als
Aufklapper) und als Zeile "Client errors reported (24 h / 7 d)" in der
Dashboard-Kachel VITEC: SSR statistics.

CLI vitec:client-error-cleanup [--days=30] loescht Eintraege aelter als
30 Tage (taeglich per Cron).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-10 17:25:23 +01:00

96 lines
3.4 KiB
PHP
Executable File

<?php
declare(strict_types=1);
/**
* Frontend middleware registration for EXT:vitec.
*/
return [
'frontend' => [
'vitec/json-prefix-rewrite' => [
'target' => \Evomedien\Vitec\Middleware\JsonPrefixRewrite::class,
'after' => [
'typo3/cms-core/normalized-params-attribute',
],
'before' => [
'typo3/cms-frontend/site',
'vitec/form-submission',
'vitec/success-story-path-rewrite',
'vitec/download-file',
],
],
'vitec/form-submission' => [
'target' => \Evomedien\Vitec\Middleware\FormSubmissionMiddleware::class,
'after' => [
'typo3/cms-core/normalized-params-attribute',
],
'before' => [
'typo3/cms-frontend/site',
],
],
'vitec/success-story-path-rewrite' => [
'target' => \Evomedien\Vitec\Middleware\SuccessStoryPathRewrite::class,
'after' => [
'typo3/cms-core/normalized-params-attribute',
],
'before' => [
'typo3/cms-frontend/site',
],
],
'vitec/download-file' => [
'target' => \Evomedien\Vitec\Middleware\DownloadFileMiddleware::class,
'after' => [
'typo3/cms-core/normalized-params-attribute',
],
'before' => [
'typo3/cms-frontend/site',
],
],
// Self-healing sync of the SSR routing flag file against the
// Site Set switch vitec.ssr.enabled (no core event fires on
// settings save, hence per-request sync; cheap file_exists when
// nothing changed). Also registered for the backend below.
'vitec/sync-ssr-flag' => [
'target' => \Evomedien\Vitec\Middleware\SyncSsrFlag::class,
'after' => [
'typo3/cms-core/normalized-params-attribute',
],
],
// Client error reports from the React frontend:
// POST /api/vitec/client-error -> tx_vitec_clienterrorlog, 204
// (0072-FE section 4 / 0077-BE). Answers before site resolution,
// no session, rate-limited per IP, 8 KB body limit. Placed after
// the /_json strip so the prefixed form reaches it as well.
'vitec/client-error' => [
'target' => \Evomedien\Vitec\Middleware\ClientErrorMiddleware::class,
'after' => [
'typo3/cms-core/normalized-params-attribute',
'vitec/json-prefix-rewrite',
],
'before' => [
'typo3/cms-frontend/site',
'vitec/form-submission',
],
],
// Outer response filter: Cache-Control: no-cache + ETag/304 for
// /_json (tickets 0011-FE / 0055-BE).
'vitec/json-cache-headers' => [
'target' => \Evomedien\Vitec\Middleware\JsonCacheHeaders::class,
'after' => [
'typo3/cms-core/normalized-params-attribute',
],
'before' => [
'vitec/json-prefix-rewrite',
],
],
],
'backend' => [
'vitec/sync-ssr-flag' => [
'target' => \Evomedien\Vitec\Middleware\SyncSsrFlag::class,
'after' => [
'typo3/cms-core/normalized-params-attribute',
],
],
],
];