Archiv für den Monat: August 2010

Mehrere Content-Type in HTTP-Header

Aufgrund der Probleme mit mehreren Content-Type-Elementen im HTTP-Header wollte ich wissen, was der Standard dazu meint.

Das Hypertext Transfer Protocol (HTTP) in der Version 1.1 ist im RFC 2616 beschrieben.

In Kapitel 4.2: Message Headers, letzter Abschnitt, ist allgemein zu mehreren Feldern mit dem selben Namen zu lesen:

Multiple message-header fields with the same field-name MAY be present in a message if and only if the entire field-value for that header field is defined as a comma-separated list [i.e., #(values)].

Als Beispiel schauen wir uns Kapitel 14.1: Accept an:


Accept         = "Accept" ":"
                        #( media-range [ accept-params ] )

Nun schauen wir uns im Kapitel 14.17: Content-Type die Definition desselbigen an:


Content-Type   = "Content-Type" ":" media-type

Nach dem Standard ist folglich die Aussage bei TCPDF falsch, es sei ein Bug von FastCGI. Es ist TCPDF, das sich nicht an den Standard hält.
Da die Browser aber damit zurecht kommen und auch bei anderen Anwendungen mehrere Content-Type Werte zurückgeliefert werden, wäre es für die Kunden von Web-Hostern hilfreich, wenn FastCGI etwas toleranter wäre.

Piwik PDF Reports bei Hostpoint (mit FastCGI)

Seit Version 0.7 können mit Piwik PDF Reports erzeugt werden. Als PDF-Bibliothek wird dabei TCPDF eingesetzt.
Bei Hostpoint erzeugt TCPDF aber Probleme. Beim Download des Reports wird folgender Fehler im ErrorLog angezeigt:
[error] [client ###.###.###.###] FastCGI: comm with server „/var/run/hcgi/86“ aborted: error parsing headers: duplicate header ‚Content-Type‘, referer: http://###.######.##/index.php?module=PDFReports&action=index&idSite=2&period=day&date=yesterday

Der Fehler wird durch die TCPDF Bibliiothek ausgelöst, da sie mehrere Content-Type Header-Elemente erzeugt und FastCGI dies nicht unterstützt.

Um die Reports doch herunterladen zu können müssen in der Datei tcpdf.php die Zeilen 7221-7223 (bei der in Piwik 0.9 eingesetzten TCPDF Version 5.5.009) auskommentiert werden, so dass nur noch der Content-Type „application/download“ ausgeliefert wird:

// force download dialog
// header('Content-Type: application/force-download');
// header('Content-Type: application/octet-stream', false);
// header('Content-Type: application/download', false);
header('Content-Type: application/pdf', false);

Laut TCPDF ist dies ein FastCGI Bug. Mit diesem Hack ist es (zumindest mit Internet Explorer 8 und Firefox 3.6) möglich, den Report herunterzuladen, nach jedem Piwik Update muss aber der Eintrag wieder angepasst werden.