Apprenez à écrire un serveur HTTP / 2 en Python à l'aide de l'API Python incluse dans nghttp2.
L'API Python est fournie en tant que bibliothèque d'extension en utilisant la bibliothèque nghttp2 C. Python 3.4 ou version ultérieure est nécessaire car le code qui fournit le serveur HTTP / 2 utilise le module ʻasyncio. Nécessite le package de développement Python 3.4 et Cython. Ubuntu 14.04 LTS accepte les packages python3.4-dev et cython. Le script configure sélectionne automatiquement l'environnement Python disponible, mais par défaut Je pense que Python n'est pas 3.4 dans de nombreux cas, alors spécifiez explicitement le chemin de l'interpréteur de Python 3.4 avec la variable
PYTHON` et donnez-le au script configure:
$ ./configure PYTHON=/usr/bin/python3.4
make install
installera la bibliothèque nghttp2 C et la bibliothèque d'extension Python. Si vous ne voulez pas l'installer, vous pouvez également spécifier les répertoires respectifs avec LD_LIBRARY_PATH
et PYTHONPATH
.
Maintenant que nous sommes prêts, écrivons un serveur. Nous utiliserons les classes nghttp2.HTTP2Server
et nghttp2.BaseRequestHandler
. La classe nghttp2.HTTP2Server
écoutera les connexions, exécutera des boucles d'événements, etc. Une classe qui fournit des fonctionnalités de serveur. Nghttp2.BaseRequestHandler
est une classe qui gère un flux (requête HTTP). Il existe une méthode de rappel qui se déclenche pour chaque événement, et elle est sous-classée et ces méthodes de rappel sont implémentées de manière appropriée et diffusées en continu. Jetons un coup d'œil à une implémentation de serveur simple qui renvoie d'abord "nghttp2 FTW", en laissant une explication détaillée plus tard:
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/Pour activer TLS,Serveur de certificat.crt,Serveur de clé privée.Dans le fichier clé
#sauvegarder,Activez les 3 lignes suivantes, nghttp2.Spécifiez ctx pour le paramètre ssl HTTP2Server.
# 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()
Lorsqu'il est exécuté, il écoute sur le port 8080. L'accès avec nghttp http: //127.0.0.1: 8080 /
doit renvoyer les caractères "nghttp2 FTW".
Examinons de plus près nghttp2.BaseRequestHandler
.
nghttp2.BaseRequestHandler
fournit les variables d'instance suivantes:
: method
.: path
.Ensuite, j'expliquerai la méthode de rappel. L'exemple ci-dessus implémente la méthode ʻon_headers () `. Cette méthode est appelée lorsque l'en-tête de requête est reçu. Il existe d'autres méthodes de rappel comme suit. ..
Pour renvoyer la réponse, utilisez la méthode send_response (status = 200, headers = None, body = None)
comme dans l'exemple ci-dessus. * Status * spécifie le code d'état HTTP. * Headers * is Spécifiez des en-têtes de réponse supplémentaires. * Body * est le corps de la réponse, qui spécifie une instance de la sous-classe «str», «byte» ou «io.Base ».
Il fournit également une méthode push (path, method = 'GET', request_headers = None, status = 200, headers = None, body = None)
pour exécuter Server Push, qui est l'une des fonctionnalités de HTTP / 2. Server Push vous oblige à spécifier le chemin de la demande et la méthode que le client utilisera lors de la demande de la ressource que le serveur pousse, ainsi que des champs d'en-tête de demande supplémentaires. * Chemin *, * méthode *, *, respectivement. Spécifié par request_headers *. Les * status *, * headers *, * body * restants spécifient le contenu de la réponse de la même manière que la méthode send_response ()
.
Ajoutons Server Push à l'exemple ci-dessus. Poussons les ressources dans le chemin / push de la requête:
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)
...
Vous pouvez voir qu'il est poussé en y accédant avec l'outil de ligne de commande nghttp. Bien que le nombre de flux à multiplexer soit limité, plusieurs pushs peuvent être spécifiés. De plus, en raison des restrictions de protocole, push ( )
Doit être appelé avant send_response ()
.
Jusqu'à présent, nous vous avons montré comment écrire un serveur HTTP / 2 à l'aide de l'API Python nghttp2. Pour plus d'informations sur l'API, consultez la documentation (https://nghttp2.org/documentation/python-apiref.html).
Recommended Posts