www.fabiankeil.de/blog-surrogat/2006/04/13/vorstellung-neuer-privoxy-erweiterungen.html
crunch-header
, hide-accept-language
,
crunch-if-modified-since
, crunch-if-none-match
, content-type-overwrite
und force-text-mode
Wenn man Privoxys Innereien erstmal oberflächlich verstanden hat, ist das Schreiben eines einfachen Header-Filters nur noch eine Sache von Kopieren und Einfügen.
Beim Lösen meiner Privoxy-DNS-Probleme und beim Schreiben der Privoxy-Ergänzung
+hide-referrer{conditional-block}
hatte ich mich bereits etwas mit Privoxys Quelltext auseinander gesetzt, für Version 0.4
von uagen.pl
fehlte mir eine Funktion
um den Accept-Language
-Header zu unterdrücken und wo ich schon dabei war, habe ich ein
paar zusätzliche Erweiterungen geschrieben, die mir sinnvoll erschienen.
crunch-header
Diese Privoxy-Aktion löscht beliebig viele Header, die noch nicht von anderen Aktionen erfasst wurden
und die eine als Parameter übergebene Zeichenkette enthalten. Zusammen mit der bereits vorhandenen Privoxy-Aktion
add-header
kann damit eine noch nicht vorhandene Header-Ersetzungs-Aktion simuliert werden.
Die nicht veröffentlichte Version 0.3 von uagen.pl
stellte die benötigte
Accept-Language
-Header-Fälschung mit einer Sektion wie
{+crunch-header{Accept-Language:} \ +add-header{Accept-Language: de-ch} \ +hide-user-agent{Mozilla/5.0 (X11; U; NetBSD sparc64; de-CH; rv:1.8.0.1) Gecko/20060218 Firefox/1.5.0.1} \ } /
nach. Um die schweizerische Firefox-Version glaubhafter zu machen wird damit erst der gesendete
Accept-Language
-Header gelöscht und anschließend ein neuer Header angelegt, der
sprachlich passt.
Da add-header
und crunch-header
unabhängig voneinander arbeiten,
handelt es sich dabei nur um eine Notlösung mit der man sich auch in den Fuß schießen kann.
Wenn man sich bei der crunch-header
-Zeichenkette vertippt, hat man nachher
zwei Header die sich wiedersprechen. Formuliert man die Zeichenkette zu allgemein,
wird die Anfrage ungültig, weil vorgeschriebene Header fehlen.
+crunch-header{:}
würde zum Beispiel jeden Header entfernen, den sich nicht vorher
eine andere Privoxy-Aktion gekrallt hat.
Im Notfall ist crunch-header
besser als gar nichts, eine passende Privoxy-Aktion
ist jedoch stets vorzuziehen.
Im Gegensatz zu add-header
kann crunch-header
auch über das
Webinterface aktiviert werden, als großer Nachteil kann dadurch pro Anfrage immer nur eine
Zeichenkette zur Header-Unterdrückung genutzt werden.
hide-accept-language
Version 0.4 von uagen.pl
muss in die user-agent.action
nur noch:
{+hide-accept-language{sk-sk}\ +hide-user-agent{Mozilla/5.0 (X11; U; OpenBSD alpha; sk-SK; rv:1.8.0.1) Gecko/20060219 Firefox/1.5.0.1} \ } /
schreiben. Damit wird sichergestellt, dass der Benutzer die Fälschung des Accept-Language
-Headers
nicht aus Versehen sabotiert, indem er crunch-header
zum Entfernen eines anderen Headers
nutzt und damit unbeabsichtigt die in user-agent.action
angegebene Zeichenkette
Accept-Language:
überschreibt.
hide-accept-language
kann, wie alle anderen hier beschriebenen Erweiterungen,
auch über das Webinterface bedient werden.
crunch-if-modified-since
Beim Testen von neuen regulären Ausdrücken kommt es regelmäßig vor,
dass man die zu filternde Seite mit F5
statt mit
Strg
+ F5
anfordert, der Browser die Seite aus dem Cache lädt und man sich über die
Wirkungslosigkeit des zu testenden Filters wundert.
Während des Tests kann mit der Aktion crunch-if-modified-since
dafür gesorgt werden, dass der Server die komplette Seite neu liefert und Privoxy eine
Chance hat, den neuen Filter anzuwenden.
Als Firefox-Nutzer kann man sich damit auch den Affentanz sparen, der nötig ist, um einen Feed wirklich neu zu laden.
Prinzipiell hat der If-Modified-Since
-Header einen Sinn,
crunch-if-modified-since
sollte daher nur bei Bedarf
und für bestimmte Seiten aktiviert werden, ansonsten verlangsamt sich der Seitenaufbau.
crunch-if-none-match
Der If-None-Match
-Header kann wie der If-Modified-Since
-Header
dafür genutzt werden, um das Dokument nur bei Änderungen neu übertragen zu müssen.
Wenn auch der If-None-Match
-Header gesetzt ist, reicht das Unterdrücken des
If-Modified-Since
-Headers nicht aus, mit dieser Aktion kann man zusätzlich
den If-None-Match
-Header unterdrücken.
Ich überlege noch, ob ich die beiden Aktionen zusammenfassen sollte, mir fällt jedenfalls kein Grund ein, warum man nur die eine verwenden wollte.
content-type-overwrite
Ich begründetet bereits, warum ich 99% der
XHTML-Benutzer für
inkompetente Nasenbären halte, unter den restlichen Spezialisten
gibt es aber noch die Clowns, die ihre Seiten zwar als application/xhtml+xml
ausgeben, sich aber nicht an die Regeln halten.
Bei XHTML führt das dazu, dass der Browser die Seite nicht darstellt, egal wie geringfügig die Fehler sind. Der glückliche Besucher darf dann den Quelltext selber parsen, oder den Fehler mit Privoxy (und viel Zeit) selber beseitigen.
Mit content-type-overwrite
kann man auch mal Schnarchnase spielen und den
Content-Type
auf text/html
setzen, auf das der Browser die
Seite als defektes HTML betrachtet
und versucht, das Beste aus ihr zu machen.
Diese Aktion nimmt keine Rücksicht darauf, mit welchem Content-Type
das Dokument geliefert wird. Sie greift sobald Privoxy das Dokument anhand des Content-Type
s
als Text eingestuft hat.
Damit wird zwar sichergestellt, dass man nicht ungewollt Bilder und andere Binär-Dokumente umdeklariert, der Benutzer muss aber selbst dafür sorgen, dass keine Style-Sheets umdeklariert werden. Es sei denn es wäre erwünscht oder zumindest egal.
Wenn die Aktion zuerst für alle Dokumente der gewünschten Domain aktiviert
und anschließend für alle Adressen, die die Zeichenkette CSS
oder Style
enthalten wieder deaktiviert, stehen die Chancen gut:
{+content-type-overwrite{text/html} \ } .example.com/ {-content-type-overwrite \ } /.*(CSS|Style)
Wie Marius Müller-Westernhagen schon wusste: Garantie gibt es keine.
force-text-mode
Wenn man sicher ist, eine von Privoxy nicht als Text erkanntes Dokument über reguläre Ausdrücke
verändern oder mit content-type-overwrite
umdeklarieren zu wollen, kann man
mit force-text-mode
den Text-Modus erzwingen.
Diese Privoxy-Aktion hat das Potential defekte Dateien zu verursachen, den Einsatz sollte man sich gut überlegen und um den Schaden gering zu halten dabei alle nicht benötigten Aktionen, die Einfluss auf den Textinhalt haben können, ausdrücklich deaktivieren.
Nochmal zum mitschreiben:
force-text-mode
, Schere, Feuer, Licht, ist für Kinderhände nicht!
crunch-header
greift nur auf dem Weg vom Browser zum Server, wenn man die Kommentar-Zeichen in
Zeile 515 (+-X, bin gerade zu faul die Angabe zu aktualisieren) von parsers.c
entfernt
auch auf dem Rückweg. Da add-header
jedoch nur auf
dem Hinweg tätig wird, kann crunch-header
auf dem Rückweg nur zum Header-Löschen genutzt
werden.
hide-accept-language
, crunch-if-none-match
und crunch-if-modified-since
sind ebenfalls nur auf dem Hinweg aktiv, content-type-overwrite
und force-text-mode
nur auf dem Rückweg.
Da es mir zu umständlich geworden ist, für jede geänderte Datei einen eigenen Patch zu erzeugen und hochzuladen, habe ich einen Sammel-Patch angelegt.
Momentan umfasst er alle im Blog-Surrogat erwähnten Erweiterungen mit Ausnahme der Umdeklaration
von DNS-Fehlermeldungen nach 503
, die nicht
mehr benötigt werden sollte.
Den Patch werde ich noch gelegentlich verändern, Teile der neuen Erweiterungen müssen
gesäubert werden, möglicherweise finden sich auch noch Fehler. Beim Einsatz des Patches ist es
empfehlenswert, in Privoxys Konfigurationsdatei debug 8
aktivieren
und Privoxy beim Parsen der Header über die Schultern zu schauen.
Der Patch basiert auf Privoxys Entwickler-Version, kann aber auch mit Privoxy 3.0.3 ohne Anpassungen genutzt werden. Die Offset-Meldungen sind kein Grund zur Panik. Weitere Informationen zum Patch gibt es auf der Seite Minor Privoxy improvements.