From e2713913e78aaf6ca1ec0ac901cae0e71cbee695 Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Tue, 21 Apr 2026 13:37:42 +0200 Subject: [PATCH] feat(photo-upload): Logging fuer Upload-Parse-Fehler MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Der bisherige Endpoint verschluckte den formData()-Fehler mit einem generischen "Multipart erwartet" — wir wissen nicht, warum Chrome auf dem Tablet scheitert. Jetzt wird beim Fehler Content-Type, -Length und User-Agent geloggt, plus die konkrete Error-Message in der Response. Kein Foto-Inhalt im Log. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../api/recipes/extract-from-photo/+server.ts | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/routes/api/recipes/extract-from-photo/+server.ts b/src/routes/api/recipes/extract-from-photo/+server.ts index 927b1ac..75d84b8 100644 --- a/src/routes/api/recipes/extract-from-photo/+server.ts +++ b/src/routes/api/recipes/extract-from-photo/+server.ts @@ -45,16 +45,38 @@ export const POST: RequestHandler = async ({ request, getClientAddress }) => { ); } + // Header-Snapshot fuer Diagnose beim Upload-Parse-Fehler. Wir loggen + // Content-Type, -Length und User-Agent — nichts, was Inhalt verraet. + const contentType = request.headers.get('content-type') ?? '(missing)'; + const contentLength = request.headers.get('content-length') ?? '(missing)'; + const userAgent = request.headers.get('user-agent')?.slice(0, 120) ?? '(missing)'; + let form: FormData; try { form = await request.formData(); - } catch { - return errJson(400, 'BAD_REQUEST', 'Multipart body erwartet.'); + } catch (e) { + const err = e as Error; + console.warn( + `[extract-from-photo] formData() failed: name=${err.name} msg=${err.message} ` + + `ct="${contentType}" len=${contentLength} ua="${userAgent}"` + ); + return errJson( + 400, + 'BAD_REQUEST', + `Upload konnte nicht gelesen werden (${err.name}: ${err.message}).` + ); } const photo = form.get('photo'); if (!(photo instanceof Blob)) { + console.warn( + `[extract-from-photo] photo field missing or not a Blob. ct="${contentType}" ` + + `len=${contentLength} fields=${[...form.keys()].join(',')}` + ); return errJson(400, 'BAD_REQUEST', 'Feld "photo" fehlt.'); } + console.info( + `[extract-from-photo] received photo size=${photo.size} mime="${photo.type}" ua="${userAgent}"` + ); if (photo.size > MAX_BYTES) { return errJson( 413,