Erweiterung schreiben

From WaveCDN Wiki
Revision as of 14:38, 7 January 2014 by Nfr (talk | contribs) (→‎Einleitung)
Jump to navigation Jump to search

Einleitung

Bei Erweiterungen handelt es sich um Python-Skripts, die auf den weltweiten Edges von WaveCDN ausgeführt werden. Damit ist es möglich, die Abarbeitung der HTTP(S)-Anfragen stark zu beeinflussen. Die Erweiterungen können Daten auslesen und verändern. Erweiterungen erlauben es WaveCDN auf flexibelste Art und Weise an die eigenen Anforderungen anzupassen.

Die Erweiterungen laufen auf den Edges in abgeschlossenen Einheiten. Der Speicher ist auf 8 MB limitiert und die CPU-Nutzung ist ebenfalls stark eingeschränkt. Die Funktionen des Python-Skripts werden von WaveCDN parallel kmit mehreren Threads aufgerufen. Die Funktionen müssen also thread-safe sein. Es sollten ausschließlich Python-Skripts mit hoher Performance ausgeführt werden. Für Fehler oder Beschränkungen bei der Ausführung von Python-Skripts übernehmen wir keinerlei Verantwortung. Man sollte Erweiterungen insbesondere ausgiebig Testen.

Wir empfehlen vorweg die FAQ durchlesen. Außerdem sollte man sich mit dem Anfragenmodell vertraut machen.

Schritte der Anfragenabarbeitung

Das Anfragenmodell gibt an, welche Schritte WaveCDN ausführt, wenn ein Webuser eine Anfrage stellt. Konkret handelt es sich um folgende fünf Schritte:

  • wavecdn_receive
  • wavecdn_hit
  • wavecdn_miss
  • wavecdn_fetch
  • wavecdn_deliver

Eine Erweiterung kann sich in die einzelnen Schritte einklinken, in dem sie eine Python-Funktion mit dem jeweiligen Schrittnamen deklariert. Damit zum Beispiel eine Erweiterung im Schritt wavecdn_receive ausgeführt wird, muss eine Funktion "def wavecdn_receive()" im Python-Skript deklariert sein. Je nach Schritt gibt es bestimmte Rückgabewerte, mehr dazu später.

Die Klasse WavecdnEnvironmentV1

Wenn WaveCDN eine Funktion der Erweiterung aufruft, wird eine Instanz der Environment-Klasse übergeben. Aus ihr können Daten ausgelesen oder auch gespeichert werden. Im folgenden eine kurze Dokumentation der Environment-Klasse:

  • get_client_ip(): Gibt die IP vom Webuser zurück.
  • get_request_ssl(): Gibt in Form eines Boolean zurück, ob der Webuser bei der Anfrage SSL genutzt hat oder nicht.
  • get_request_method(): Gibt die Methode der Anfrage vom Webuser zurück. Zum Beispiel 'GET' oder 'POST'.
  • get_request_url(): Gibt die vom Webuser angefragte URL zurück.
  • get_request_path(): Gibt die vom Webuser angefragte URL ohne Query-String zurück.
  • get_request_query_string(): Gibt den Query-String aus der vom Webuser angefragten URl zurück.
  • get_request_query_string_parameter(name): Gibt den Parameter mit dem angegebenen Namen aus dem Query-String zurück.
  • get_request_header(name): Gibt den Request-Header mit dem angegebenen Namen zurück.
  • get_request_headers(): Gibt ein Dictionary mit den Headern der Anfrage vom Webuser zurück.
  • get_backend_response_header(name): Gibt den Header mit dem angegebenen Namen aus der Origin/Storage-Antwort zurück.
  • set_backend_response_header(name, value): Setzt den Header mit dem angegebenen Namen und Wert in der Origin/Storage-Antwort. Sinnvoll, wenn Header noch vor dem Caching hinzugefügt werden sollen.
  • get_response_status(): Gibt den HTTP-Code der Antwort zurück, die WaveCDN an den Webuser schicken wird.
  • get_response_header(name): Gibt den Header mit dem angegebenen Namen aus der Antwort zurück, die WaveCDN an den Webuser schicken wird.
  • set_response_header(name, value): Setzt den Header mit dem angegebenen Namen und Wert in der Anwort, die WaveCDN an den Webuser schicken wird.

Je nach Schritt sind bestimmte Funktionen verfügbar oder nicht.

Deployment

Um die Erweiterungen auf den weltweiten Edges von WaveCDN zu deployen, muss man zunächst im Webpanel das CDN-Setup öffnen, in welchem die Erweiterung laufen soll. Im Tab "Erweiterungen" gibt es einen Button zum Hinzufügen einer Erweiterung. Nach Einfügen des Python-Codes und Abschicken des Formulars wird die Erweiterung weltweit installiert. Dies kann einige Minuten dauern.

Troubleshooting

Zunächst sollte ein Blick in die Logs geworfen werden. Dafür klickt man auf das betroffene CDN-Setup, auf den Tab "Erweiterungen" und auf den Button "Anzeigen" bei der entsprechenden Erweiterung. Unten auf der Seite sind dann die letzten Log Messages vorzufinden.