Sicherheitswarnung: Bitte keine Version älter als 1.11 verwenden!

Die Verarbeitungslogik von gzip_cnc

Der Ablauf des Hauptprogramms

  1. Liegt ein Wert für den Pfadnamen der auszuliefernden Datei vor?
    (in der Environment-Variablen PATH_TRANSLATED - diese wird für jeden Apache-Handler vom Webserver gesetzt.)
    • nein => führe den Selbsttest durch.
      (Wir können nicht als Handler aufgerufen worden sein, denn wir wissen nicht, was wir eigentlich tun sollen.)
  2. Enthalten die Environment-Variablen PATH_INFO und REDIRECT_URL denselben Inhalt?
    • nein => weise die Anforderung mit dem HTTP-Status 403 zurück.
      (Dies war offenbar der Versuch, das Skript direkt aufzurufen und dabei bestehende Apache-Zugriffskontrollmechanismen zu umgehen; dieser Test wurde in Version 1.11 hinzugefügt.)
  3. Liegt ein Wert für den URL der auszuliefernden Datei vor?
    (in der Environment-Variablen PATH_INFO - diese wird für jeden Apache-Handler vom Webserver gesetzt)
  4. Berechne den Namen der zugehörigen Cache-Datei aus den Werten dieser beiden Environment-Variablen.
    (PATH_INFO liefert den Pfadnamen, PATH_TRANSLATION den Dateinamen, welcher das Ergebnis einer vom Apache-Server zuvor bereits durchgeführten Content Negotiation sein kann, während PATH_INFO noch den Original-URL der Anforderung enthält.)
  5. Lies die Attribute der Original-Datei.
    (mit der Systemfunktion stat())
    Hat das geklappt?
    • nein => führe eine Behandlung einer fehlende Seite durch.
      (Wir können nicht auf diese Datei zugreifen - ob die Datei nicht existiert oder ob irgend ein Systemfehler aufgetreten ist, macht für den Besucher keinen Unterschied.)
  6. Hat der UserAgent die Auslieferung komprimierter Daten erlaubt?
    (d. h. im HTTP-Header Accept-Encoding den Wert gzip mitgeliefert)
  7. Lies die Attribute der komprimierten Datei im Cache.
    (mit der Systemfunktion stat())
    Hat das geklappt?
  8. Ist das Datum der letzten Änderung für die Cache-Datei neuer als für die Original-Datei?
  9. Ist der Inhalt der Cache-Datei kleiner als für die Original-Datei?
    • nein => liefere den Inhalt der Original-Datei aus.
      (Die komprimierte Version taugt nichts - es macht aber auch keinen Sinn, sie zu löschen, weil wir sie beim nächsten Zugriff wieder neu anlegen müßten, um zu merken, daß sie nichts taugt.)
  10. Liefere den Inhalt der Cache-Datei aus.

Das Anlegen (oder Aktualisieren des Inhalts) einer Cache-Datei

Es macht keinen Unterschied, ob

- in beiden Fällen ist es erforderlich, diese Cache-Datei mit einer komprimierten Form des aktuellen Inhalts der Original-Datei zu füllen.

  1. Trenne im Pfadnamen der Cache-Datei zwischen Verzeichnis- und Datei-Teil.
    Hat das geklappt?
  2. Berechne den Namen des Cache-Verzeichnisses für die komprimierte Version der angeforderten Datei aus dem Verzeichnis-Teil.
  3. Falls dieses Verzeichnis noch nicht existiert, versuche, es anzulegen.
    Hat das geklappt?
  4. Erzeuge einen zufälligen, aber eindeutigen Namen einer temporären Datei innerhalb des Cache-Verzeichnisses.
  5. Komprimiere den Inhalt der Original-Datei in diese temporäre Datei.
    Hat das geklappt?
  6. Benenne die temporäre Datei um in den Namen der Cache-Datei.
    Hat das geklappt?
    • nein => lösche die temporäre Datei und liefere den Inhalt der Original-Datei aus.
      (Wir hätten vielleicht auch die komprimierte Version ausliefern dürfen, aber irgend etwas Ungewöhnliches ist hier kaputt, deshalb gehen wir lieber auf Nummer Sicher.)
  7. Lies die Attribute der komprimierten Datei im Cache
    (mit der Systemfunktion stat()).
    Hat das geklappt?

Die Auslieferung eines Datei-Inhalts

Ob der Inhalt einer Datei in komprimierter oder unkomprimierter Form ausgeliefert werden soll, ist ein relativ kleiner Unterschied, deshalb werden beide Vorgänge mit derselben Funktion erledigt.

  1. Öffne die zu sendende Datei.
    Falls das geklappt hat,
    1. Sende den HTTP-Status 200 zur Anzeige einer erfolgreichen Verarbeitung.
    2. Sende den HTTP-Header Date zur Beschreibung der aktuellen Serverzeit.
    3. Sende den HTTP-Header Vary zur Beschreibung der durchgeführten Content-Negotiation
      (als Kennzeichnung der bedingter Auslieferung des Datei-Inhalts, abhängig vom Inhalt des empfangenen HTTP-Headers Accept-Encoding - ein Proxy-Server soll wissen, daß er solche Seiten nicht bedenkenlos speichern und als Antwort weiterer Anfragen nach demselben URL ausliefern darf).
    4. Sende den HTTP-Header Last-Modified zur Beschreibung des Datums der letzten Änderung des Inhalts.
      (Der Browser wird diesen Wert an den Server zurück senden, wenn er die Gültigkeit seines Cache-Inhalts überprüfen will.)
    5. Sende den HTTP-Header Content-Type zur Beschreibung des Datentyps des ausgelieferten Datei-Inhalts.
    6. Sende den HTTP-Header Content-Length zur Beschreibung der Länge des ausgelieferten Datei-Inhalts.
    7. Falls gewünscht, sende die HTTP-Header
      • Expires zur Beschreibung der garantierten Gültigkeit des Inhalts im Browser-Cache eines HTTP/1.0-Clients und
      • Cache-Control zur Beschreibung der garantierten Gültigkeit des Inhalts im Browser-Cache eines HTTP/1.1-Clients.
      (Das hat beides mit Komprimierung nichts zu tun - aber Anfragen, die der Browser gar nicht erst sendet, kosten nun mal am wenigsten Bandbreite.)
    8. Ist das eine Auslieferung komprimierter Daten?
      • Sende den HTTP-Header Content-Encoding zur Beschreibung der Codierung des ausgelieferten Datei-Inhalts.
      • Falls gewünscht, sende unsere eigenen HTTP-Header:
        1. X-Gzipcnc-Original-File-Size zur Beschreibung der Größe der Original-Datei,
        2. X-Gzipcnc-Version zur Beschreibung der verwendeten Programm-Version,
        3. X-Gzipcnc-Path-Info zur Beschreibung des URL des angeforderten Dokuments (nur falls der Selbsttest-Modus aktiv ist) und
        4. X-Gzipcnc-Path-Translated zur Beschreibung des Dateinamens des angeforderten Dokuments (nur falls der Selbsttest-Modus aktiv ist).
    9. Sende den Inhalt der Datei.
    10. Schließe die Datei.
    11. Führe die Abschlußbehandlung durch
  2. Ist das, was wir gerade ausliefern wollten (aber nicht konnten), eine komprimierte Cache-Datei,

Die Behandlung einer fehlenden Seite

  1. Wurde in gzip_cnc eine anwenderspezifische Fehlerbehandlungsseite
    • als URL definiert, dann sende einen HTTP-Header Location zur Weiterleitung auf diesen URL,
    • als Pfadname definiert, dann sende den Inhalt der entsprechenden Datei,
  2. andernfalls gib eine eigene Fehlerbehandlungsseite aus.
  3. Führe die Abschlußbehandlung durch.

Die Abschlußbehandlung

  1. Falls eine Protokolldatei definiert wurde,
    1. Berechne eine formatierte Darstellung von aktuellem Datum und Uhrzeit.
    2. Berechne die verbrauchte CPU-Zeit.
    3. Berechne das eingesparte Datenvolumen.
    4. Schreibe eine Meldung in die Protokolldatei.
  2. Beende den Programmlauf.

(Michael Schröpl, 2002-09-08)