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,