fix: resolve 5 Sentry production errors (668 total events)

- Filter known client-error noise (rate limit, empty body, unsupported
  media type, content-length mismatch, premature close) from Sentry
  via beforeSend to stop 644 events of non-actionable noise
- Sanitize x-output-filename header to prevent TypeError on non-ASCII
  filenames in optimize-for-web preview (23 events)
- Handle EPIPE on Python dispatcher stdin write with graceful fallback
  to per-request spawning instead of crashing (NODE-W)
- Map EACCES on storage directory/file write to proper 503 status
  instead of generic 500 (NODE-P, 3 events)
This commit is contained in:
SnapOtter
2026-05-16 12:22:24 +08:00
parent 2c45a3a9e8
commit 212ef653b5
4 changed files with 49 additions and 5 deletions
@@ -159,7 +159,8 @@ export function registerOptimizeForWeb(app: FastifyInstance) {
reply.header("Content-Type", result.contentType);
reply.header("X-Original-Size", String(fileBuffer.length));
reply.header("X-Processed-Size", String(result.buffer.length));
reply.header("X-Output-Filename", encodeURIComponent(result.filename));
const safeFilename = encodeURIComponent(result.filename).replace(/[^ -~]/g, "");
reply.header("X-Output-Filename", safeFilename);
return reply.send(result.buffer);
} catch (err) {
const message = err instanceof Error ? err.message : "Preview processing failed";