assert( !str_contains($header, 'legit"; filename*='), 'Eingeschleustes filename*= bricht nicht aus dem ersten Parameter aus' ); $this->assertEquals( 1, substr_count($header, '"; filename*='), 'Es gibt nur ein echtes filename*=-Parameter (direkt nach dem schließenden Anführungszeichen)' ); $this->assert(!str_contains($header, "\r") && !str_contains($header, "\n"), 'Header enthält kein CR/LF'); $mitAnführungszeichen = View::contentDispositionHeader('attachment', 'a"b\\c.pdf'); $this->assert( !preg_match('/filename="[^"]*"[^"]*"/', $mitAnführungszeichen), 'Anführungszeichen im Dateinamen schließen den filename-Parameter nicht vorzeitig' ); $umlaut = View::contentDispositionHeader('inline', 'Rechnung Übersicht äöü.pdf'); $this->assert( str_contains($umlaut, "filename*=UTF-8''" . rawurlencode('Rechnung Übersicht äöü.pdf')), 'filename* transportiert den unveränderten UTF-8-Namen RFC-6266-konform' ); $normal = View::contentDispositionHeader('attachment', 'Rechnung-2026-001.pdf'); $this->assertEquals( 'attachment; filename="Rechnung-2026-001.pdf"; filename*=UTF-8\'\'Rechnung-2026-001.pdf', $normal, 'Unauffällige Dateinamen bleiben unverändert' ); } }