Title: Beispiele




mod_ext_filter
Das HTTP-Antwortpaket 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 präsentiert ein einfaches und gewohntes Programmier-Modell zur Einbindung von Filter. Mit diesem Modul kann ein Programm, das von stdin liest und in stdout schreibt (ein Filterbefehl im Unix-Stil), auch als Apache-Filter verwendet werden. 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 Vorteile:

  • 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 # mod_ext_filter-Direktive, um den Debug-Level hoch genug zu setzen,
# dass pro Anfrage ein Protokolleintrag pro Request erzeugt wird
# (um zu demonstrieren, dass diese Konfiguration tatsächlich eine Wirkung
# hat). Der MIME-Content-Typ 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 Direktive 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-Direktive für den Debug-
# Level hoch genug für eine Nachricht über die Konfiguration
# pro Anfrage setzen
ExtFilterOptions DebugLevel=1
</Directory>
Implementierung eines Inhaltkodierungsfilters

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

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

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

# Die mod_header-Direktive zum _Hinzufügen_ des Header-Feldes
# "Content-Encoding: gzip"
Header set Content-Encoding gzip
</Location>
Den Server verlangsamen # Die mod_ext_filter-Direktive für die Definition eines Filters,
# dder alle Ausgaben durch 'cat' hindurch schickt; 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 Direktive für die mehrfache Anwendung des
# slowdown-Filters auf die Ausgabe
#
SetOutputFilter slowdown;slowdown;slowdown
</Location>
Mit sed Text in der Antwort ersetzen # Die mod_ext_filter-Direktive 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 Direktive für die Anwendung des 'fixtext'-Filters
# auf 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) protokollieren,
# 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 nach der Verarbeitung
# durch mod_deflate heraus kam.
# Ohne die explizite Angabe eines ftype-Parameters
# würde der (dann implizit gültige) Default-Filtertyp
# AP_FTYPE_RESOURCE bewirken, dass dieser Filter
# (nämlich unser Trace-Filter) innerhalb der Filter-Kette
# vor den mod_deflate-Filter gesetzt würde
# *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 Protokollierung 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 definiert die Charakteristika eines externen Filters, einschließlich des dabei auszuführenden Programms und dessen Argumente.

Filtername ist die Bezeichnung des definierten Filters. Dieser Name kann in SetOutputFilter- Direktiven benutzt werden. Alle registrierten Filter müssen eine eindeutige Bezeichnung haben. Zur Zeit wird von API zur Registrierung von Filtern 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 sollte zur Zeit output (Voreinstellung) angegeben. Zukünftig wird mode=input verfügbar sein, 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 angegeben, dass der Filter die Datenlänge nicht verändert. Das ist nicht die Voreinstellung, denn die meisten Filter ändern den Datenumfang. Für den Fall, dass der Filter die Länge nicht verändert, sollte dieses Schlüsselwort angegeben werden
ftype=Filtertyp
Dieser Parameter gibt den numerischen Wert für den Filtertyp an, unter dem der Filter registriert 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 Konfigurieren von mod_ext_filter-Optionen 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, was die Serverleistung beeinträchtigen wird. Die Bedeutung der numerischen Werte wird bei den Definitionen der DBGLVL_ -Konstanten nahe dem Anfang der Datei mod_ext_filter.c angegeben.

Hinweis: mit der Direktive des Apache-Modules core 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 geschriebenen 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