Ecrire un serveur HTTP / 2 en Python

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:

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

Ecrire un serveur HTTP / 2 en Python
Ecrire Python dans MySQL
Serveur DNS en Python ....
Lancer un serveur HTTP dans le répertoire courant
Tri rapide d'un tableau en Python 3
Ecrire des filtres Pandec en Python
Écrire une distribution bêta en Python
Ecrire python dans Rstudio (réticulé)
Utiliser le cache HTTP en Python
Serveur HTTP facile avec Python
Serveur HTTP simple pour python
Ecrire une dichotomie en Python
Ecrire une fonction AWS Lambda en Python
Ecrire des algorithmes A * (A-star) en Python
[Python] Comment écrire une instruction if en une phrase.
Développons un algorithme d'investissement avec Python 2
Ecrire le code de test du sélénium en python
Ecrire un graphique à secteurs en Python
Ecrire le plugin vim en Python
Écrire une recherche de priorité en profondeur en Python
Python in est aussi un opérateur
Ecrire un test unitaire de langage C en Python
Une alternative à `pause` en Python
Écrire de la documentation dans Sphinx avec Python Livereload
CGI Server (1) édition python en une ligne
Un client HTTP simple implémenté en Python
Ecrire le test dans la docstring python
Ecrire une courte définition de propriété en Python
Ecrire le fichier O_SYNC en C et Python
Ecrire un programme de chiffrement Caesar en Python
Lire et écrire des fichiers JSON avec Python
Ecrire une méthode de cupidité simple en Python
Ecrire un module python dans fortran en utilisant f2py
Ecrire un plugin Vim simple en Python 3
Comment écrire Ruby to_s en Python
Quadtree en Python --2
Python en optimisation
CURL en Python
Géocodage en python
SendKeys en Python
Méta-analyse en Python
Unittest en Python
Époque en Python
Discord en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python
Programmation avec Python
Plink en Python
Constante en Python
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
LINE-Bot [0] en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python