Title: Beispiele
mod_ext_filter Der Rumpf der Antwort wird vor der Auslieferung an den Client an ein externes Programm übergeben. Erweiterung mod_ext_filter.c ext_filter_module

Das Modul mod_ext_filter entspricht einem einfachen und bekannten Programmiermodell für Filter. Mit diesem Modul kann ein Programm, das von stdin liest und in stdout schreibt, als Filter fungieren (ein Filterbefehl im Unix-Stil). Dieser Filtermechanismus ist wesentlich langsamer als ein Filter, der speziell für die Apache-API programmiert wurde und der innerhalb des Serverprozesses ausgeführt wird und hat folgende Vorteil:

  • Das Programmiermodell ist wesentlich einfacher.
  • Es kann jede Programmier- oder Skriptsprache benutzt werden, die zulässt, dass das Programm die Standardeingabe liest und in die Standardausgabe schreibt.
  • Vorhandene Programm können ohne Änderungen als Apache-Filter benutzt werden.

Auch wenn die Leistungscharakteristika für den produktiven Einsatz nicht genügen, kann das Modul mod_ext_filter dennoch als Prototyp für Filter dienen.

Filter
HTML-Ausgaben mit einem anderen Antworttyp erzeugen # Mit mod_ext_filter einen Filter für die
# HTML-Ausgabe von text/c-Dateien mit dem externen
# Programm /usr/bin/enscript erzeugen. Der Ausgabetyp
# ist text/html.
ExtFilterDefine c-to-html mode=output \
intype=text/c outtype=text/html \
cmd="/usr/bin/enscript --color -W html -Ec -o - -"

<Directory "/export/home/trawick/apacheinst/htdocs/c">
# Die Anweisung für die Ausgabe mit dem neuen Filter
SetOutputFilter c-to-html

# Die mod_mime-Direktive für den Typ .c
AddType text/c .c

# Die mod_ext_filter-Anweisung für den Debug-
# Level hoch genug für eine Nachricht über die Konfiguration
# pro Anfrage setzen
ExtFilterOptions DebugLevel=1
</Directory>
Implementierung eines Inhaltverschlüsselungsfilters

Hinweis: Das gzip-Beispiel dient lediglich der Veranschaulichung. Eine sinnvolle Implementierung finden Sie unter mod_deflate.

# Die mod_ext_filter-Anweisung für die Definition des externen Filters
ExtFilterDefine gzip mode=output cmd=/bin/gzip

<Location /gzipped>
# Die Anweisung für die Anwendung des gzip-Filters
# für die Ausgabe
SetOutputFilter gzip

# Die mod_header-Anweisung für das Header-Feld
# "Content-Encoding: gzip"
Header set Content-Encoding gzip
</Location>
Den Server verlangsamen # Die mod_ext_filter-Anweisung für die Definition eines Filters,
# der alles außer cat ausführt; cat verändert
# nichts, sondern führt nur zu längeren Pfaden
# und benötigt mehr Ressourcen.
ExtFilterDefine slowdown mode=output cmd=/bin/cat \
preservescontentlength

<Location />
# Die Anweisung für die mehrfache Anwendung des
# slowdown-Filters für die Ausgabe
#
SetOutputFilter slowdown;slowdown;slowdown
</Location>
Mit sed Text in der Antwort ersetzen # Die mod_ext_filter-Anweisung für die Definition eines Filters,
# der Text in der Antwort ersetzt.
#
ExtFilterDefine fixtext mode=output intype=text/html \
cmd="/bin/sed s/verdana/arial/g"

<Location />
# Die Anweisung für die Anwendung des Filters
# für die Ausgabe
SetOutputFilter fixtext
</Location>
Einen anderen Filter überwachen # Die von mod_deflate geschriebenen und gelesenen Daten
# für einen bestimmten Client (IP 192.168.1.31) überwachen,
# um Komprimierungsprobleme zu erkennen.
# Dieser Filter überwacht die Daten für mod_deflate.
ExtFilterDefine tracebefore \
cmd="/bin/tracefilter.pl /tmp/tracebefore" \
EnableEnv=trace_this_client

# Dieser Filter überwacht, was an mod_deflate geht.
# Ohne den ftype-Parameter, würde der Filtertyp
# AP_FTYPE_RESOURCE
# *vor* den Filter mod_deflate gesetzt.
# Ein etwas höherer Wert als AP_FTYPE_CONTENT_SET
# sorgt dafür, dass er nach
# mod_deflate platziert wird.
ExtFilterDefine traceafter \
cmd="/bin/tracefilter.pl /tmp/traceafter" \
EnableEnv=trace_this_client ftype=21

<Directory /usr/local/docs>
SetEnvIf Remote_Addr 192.168.1.31 trace_this_client
SetOutputFilter tracebefore;deflate;traceafter
</Directory>
Der Filter für die Überwachung der Daten: #!/usr/local/bin/perl -w
use strict;

open(SAVE, ">$ARGV[0]")
or die "can't open $ARGV[0]: $?";

while (<STDIN>) {
print SAVE $_;
print $_;
}

close(SAVE);
ExtFilterDefine Definition eines externen Filters ExtFilterDefine Filtername Parameter server config

Die ExtFilterDefine-Direktive legt die Charakeristika eines externen Filters und gibt das auszuführende Programm und die Argumente an.

Filtername ist die Bezeichnung des definierten Filters. Dieser Name kann in SetOutputFilter- Anweisungen benutzt werden. Alle registrierten Filter müssen eine eindeutige Bezeichnung haben. Zur Zeit wird von der register- Filter-API keine Fehlermeldung ausgegeben, so dass doppelt vergebene Namen nicht zu erkennen sind.

Die weiteren Parameter können in beliebiger Reihenfolge stehen und definieren den auszuführenden externen Befehl sowie andere Merkmale. Nur der Parameter cmd= muss angegeben werden:

cmd=cmdline
Mit dem Schlüsselwort cmd= kann der auszuführende externe Befehl angegeben werden. Folgen auf Programmnamen Argumente, dann sollte die Befehlszeile in Anführungszeichen gesetzt werden (cmd="/bin/mypgm arg1 arg2"). Die normalen Shell-Anführungszeichen sind nicht erforderlich, da das Programm unter Umgehung der Shell direkt ausgeführt wird. Programmargumente werden durch Leerzeichen voneinander getrennt. Leerzeichen, die Bestandteil eines Arguments sind, werden mit einem Backslash gekennzeichnet. Ein Backslash, der Bestandteil eines Arguments ist, muss ebenfalls mit einem Backslash markiert werden. Zusätzlich zu den standardmäßigen CGI-Umgebungsvariablen werden die Variablen DOCUMENT_URI, DOCUMENT_PATH_INFO, und QUERY_STRING_UNESCAPED für das Programm gesetzt.
mode=Modus
Als Modus wird zur Zeit output (Voreinstellung) angegeben. Zukünftig wird mode=input gesetzt, um einen Filter für den Anfragenrumpf anzugeben.
intype=imt
Dieser Parameter gibt den Internet-Medientyp an (MIME-Typ) der zu filternden Dokumente an. Standardmäßig werden alle Dokumente gefiltert. Wird intype= angegeben, wird der Filter für Dokumente eines anderen Typs deaktiviert.
outtype=imt
Dieser Parameter gibt den Internet-Medientyp (MIME-Typ) der gefilterten Dokumente an. Das ist sinnvoll, wenn der Filter den Internet-Medientyp während der Filteroperation ändert. Standardmäßig wird der Internet-Medientyp nicht geändert.
PreservesContentLength
Mit dem Schlüsselwort PreservesContentLength wird vorgeschrieben, dass der Filter die Datenlänge nicht verändern darf. Das ist nicht die Voreinstellung, denn die meisten Filter ändern den Datenumfang.
ftype=Filtertyp
Dieser Parameter gibt den numerischen Wert für den Filtertyp an, unter dem der Filter registeriert ist. Die Voreinstellung AP_FTYPE_RESOURCE reicht meist aus. Muss der Filter an anderer Position in der Filterkette als Ressourcenfilter wirksam werden, dann ist dieser Parameter erforderlich. In der Datei util_filter.h unter den AP_FTYPE_foo- Definitionen finden Sie die entsprechenden Werte.
disableenv=env
Dieser Parameter gibt die Umgebungsvariable an, die, falls sie gesetzt wurde, den Filter deaktiviert.
enableenv=env
Dieser Parameter gibt den Namen der Umgebungsvariable an, die gesetzt werden muss, wenn der Filter aktiviert werden soll.
ExtFilterOptions mod_ext_filter-Konfigurationsoptionen ExtFilterOptions Option [Option] ... ExtFilterOptions DebugLevel=0 NoLogStderr directory

Die ExtFilterOptions-Direktive gibt spezielle Verarbeitungsptionen für mod_ext_filter an. Als Option kann angegeben werden:

DebugLevel=n
Mit dem Schlüsselwort DebugLevel kann der Level für die von mod_ext_filter erzeugten Fehlermeldungen angegeben werden. Standardmäßig werden keine Fehlermeldungen erzeugt, was der Angabe DebugLevel=0 entspricht. Bei höheren Angaben werden Fehlermeldungen erzeugt und die Serverleistung herabgesetzt. Die Bedeutung der numerischen Werte wird bei den Definitionen der DBGLVL_ -Konstanten am Anfang der Datei mod_ext_filter.c angegeben.

Hinweis: Mit der zentralen Anweisung LogLevel sollte dafür gesorgt werden, dass die Fehlermeldungen im Apache-Fehlerprotokoll gespeichert werden.

LogStderr | NoLogStderr
Mit dem Schlüsselwort LogStderr wird angegeben, dass die vom externen Filterprogramm nach stderr geschrieben Fehlermeldungen im Apache-Fehlerprotokoll gespeichert werden. NoLogStderr deaktiviert diesen Ablauf.
Beispiel ExtFilterOptions LogStderr DebugLevel=0

Die vom Filter in die Standardfehlerausgabe geschriebenen Meldungen werden im Apache-Fehlerprotokoll gespeichert. Vom Modul mod_ext_filter werden keine Fehlermeldungen erzeugt.

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to