Erfahren Sie, wie Sie einen HTTP / 2-Server in Python mithilfe der in nghttp2 enthaltenen Python-API schreiben.
Die Python-API wird als Erweiterungsbibliothek unter Verwendung der nghttp2 C-Bibliothek bereitgestellt. Python 3.4 oder höher ist erforderlich, da der Code, der den HTTP / 2-Server bereitstellt, das Modul "asyncio" verwendet. Erstellen Sie die Erweiterungsbibliothek. Benötigt das Python 3.4-Entwicklungspaket und Cython. Ubuntu 14.04 LTS akzeptiert die Pakete python3.4-dev und cython. Das Konfigurationsskript wählt automatisch die verfügbare Python-Umgebung aus, jedoch standardmäßig Ich denke, Python ist in vielen Fällen nicht 3.4. Geben Sie daher den Pfad des Interpreters von Python 3.4 explizit mit der Variablen PYTHON
an und geben Sie ihn an das Konfigurationsskript weiter:
$ ./configure PYTHON=/usr/bin/python3.4
make install
installiert die nghttp2 C-Bibliothek und die Python-Erweiterungsbibliothek. Wenn Sie sie nicht installieren möchten, können Sie die entsprechenden Verzeichnisse auch mit LD_LIBRARY_PATH
und PYTHONPATH
angeben.
Nachdem wir fertig sind, schreiben wir einen Server. Wir verwenden die Klassen "nghttp2.HTTP2Server" und "nghttp2.BaseRequestHandler". Die Klasse "nghttp2.HTTP2Server" wartet auf Verbindungen, betreibt Ereignisschleifen usw. Eine Klasse, die Serverfunktionalität bereitstellt. Nghttp2.BaseRequestHandler
ist eine Klasse, die einen Stream (HTTP-Anforderung) verarbeitet. Es gibt eine Rückrufmethode, die für jedes Ereignis ausgelöst wird. Sie wird in Unterklassen unterteilt und diese Rückrufmethoden werden entsprechend implementiert und gestreamt. Schauen wir uns eine einfache Serverimplementierung an, die zuerst "nghttp2 FTW" zurückgibt und später eine ausführliche Erklärung hinterlässt:
import ssl
import nghttp2
class Handler(nghttp2.BaseRequestHandler):
def on_headers(self):
res = b'nghttp2 FTW\n'
self.send_response(status=200,
headers = [('content-length', str(len(res)))],
body=res)
# SSL/So aktivieren Sie TLS,Zertifikatserver.crt,Privater Schlüsselserver.In der Schlüsseldatei
#sparen,Aktivieren Sie die folgenden 3 Zeilen, nghttp2.Geben Sie ctx für den ssl-Parameter HTTP2Server an.
# ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
# ctx.options = ssl.OP_ALL | ssl.OP_NO_SSLv2
# ctx.load_cert_chain('server.crt', 'server.key')
server = nghttp2.HTTP2Server(('127.0.0.1', 8080), Handler, ssl=None)
server.serve_forever()
Bei der Ausführung wird Port 8080 abgehört. Beim Zugriff mit "nghttp http: //127.0.0.1: 8080 /" sollten die Zeichen "nghttp2 FTW" zurückgegeben werden.
Schauen wir uns nghttp2.BaseRequestHandler
genauer an.
nghttp2.BaseRequestHandler
bietet die folgenden Instanzvariablen:
: Schema
.: method
.: Authority
oder Host
.: path
.Als nächstes werde ich die Rückrufmethode erläutern. Das obige Beispiel implementiert die Methode "on_headers ()". Diese Methode wird aufgerufen, wenn der Anforderungsheader empfangen wird. Es gibt andere Rückrufmethoden wie folgt. ..
Verwenden Sie zum Zurückgeben der Antwort die Methode send_response (status = 200, headers = None, body = None)
wie im obigen Beispiel. * Status * gibt den HTTP-Statuscode an. * Headers * ist Geben Sie zusätzliche Antwortheader an. * Body * ist der Antworttext, der eine Instanz der Unterklasse "str", "byte" oder "io.Base" angibt.
Es bietet auch eine Push-Methode (Pfad, Methode = 'GET', request_headers = None, Status = 200, Header = None, body = None) zum Ausführen von Server Push, eine der Funktionen von HTTP / 2. Bei Server-Push müssen Sie den Anforderungspfad und die Anforderungsmethode angeben, die der Client beim Anfordern der vom Server gepussten Ressource anfordert, sowie zusätzliche Anforderungsheaderfelder. * Pfad *, * Methode * bzw. *. Angegeben von request_headers *. Die verbleibenden * status *, * headers *, * body * geben den Inhalt der Antwort auf dieselbe Weise an wie die Methode "send_response ()".
Fügen wir dem obigen Beispiel Server Push hinzu. Verschieben wir Ressourcen im Anforderungspfad / Push:
class Handler(nghttp2.BaseRequestHandler):
def on_headers(self):
self.push(path='/push',
status=200,
body='pushed content')
res = b'nghttp2-python FTW\n'
self.send_response(status=200,
headers = [('content-length', str(len(res)))],
body=res)
...
Sie können sehen, dass es gepusht wird, indem Sie mit dem Befehlszeilentool nghttp darauf zugreifen. Obwohl die Anzahl der zu multiplexenden Streams begrenzt ist, können mehrere Pushs angegeben werden. Aufgrund von Protokollbeschränkungen ist push ( )
Muss vor send_response ()
aufgerufen werden`.
Bisher haben wir Ihnen gezeigt, wie Sie einen HTTP / 2-Server mit der nghttp2-Python-API schreiben. Weitere Informationen zur API finden Sie in der Dokumentation (https://nghttp2.org/documentation/python-apiref.html).
Recommended Posts