Partage
  • Partager sur Facebook
  • Partager sur Twitter

implémentation client-serveur avec tornado_http2

Sujet résolu
22 juillet 2022 à 0:41:48

Bonjour tout le monde,

j'essaye de créer une connection client serveur avec l'api tornado_http2 mais le serveur ne reçoie pas les messages du client pour une raisonj que je ne comprend pas.

J'ai vérifié que le serveur est bien "en ligne" via firefox ou avec cette commande :

(mmsx-TPjM8MGB-py3.9) xx@ITLP071: 7 (master) ~/dev/mmsx/tornado_http2/demo$ proxy=127.0.0.1:8443; curl --http2-prior-knowledge -d "bla bla" -X POST https://localhost:8443/ -E test.crt 
curl: (60) SSL certificate problem: self signed certificate
More details here: https://curl.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

La connection ne se déroule pas entiérement bien (pour une raison que je n'ai pas réussi à résoudre) mais au moins, le serveur réagit => un message est bien affiché sur le terminal du serveur :

(mmsx-TPjM8MGB-py3.9) xx@ITLP071: 130 (master) ~/dev/mmsx/tornado_http2/demo$ poetry run python server_test.py 
[I 220722 04:02:37 server_test:30] starting
[W 220722 04:02:41 iostream:1517] SSL Error on 7 ('127.0.0.1', 60040): [SSL: TLSV1_ALERT_UNKNOWN_CA] tlsv1 alert unknown ca (_ssl.c:1123)

Avec le client, il ne se passe rien, que ce soit du côté du client ou du serveur.

Je me suis inspiré du code de la démo et des tests de tornado_http2 (disponible ici : https://github.com/bdarnell/tornado_http2) mais malgré tout, ça ne fonctionne pas.

Un peu d'aide serait fortement apprécié.

Voici le code du serveur :

import logging
import os
import ssl

from tornado.ioloop import IOLoop
from tornado.options import parse_command_line
from tornado.web import Application, RequestHandler
from tornado_http2.server import Server


class MainHandler(RequestHandler):
    def get(self):
        self.write("Hello world")

    def post(self):
        self.write("bla bla")


def main():
    parse_command_line()
    ssl_ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
    ssl_ctx.load_cert_chain(
        os.path.join(os.path.dirname(__file__), 'test.crt'),
        os.path.join(os.path.dirname(__file__), 'test.key'))
    app = Application([('/hello', MainHandler)], debug=True)
    server = Server(app, ssl_options=ssl_ctx)
    port = 8443
    address = "127.0.0.1"
    server.listen(port, address)
    logging.info("starting")
    IOLoop.instance().start()


if __name__ == '__main__':
    main()




et celui du client :

from tornado_http2.curl import CurlAsyncHTTP2Client as HTTP2Client
import asyncio


URI = "http:127.0.0.1:8443/hello"


class Test():
    def __init__(self):
        self.__client = HTTP2Client(force_instance=True)

    async def send(self):
        global URI
        body = "body"
        response = await self.__client.fetch(URI, method='POST', body=body,
                                             validate_cert=False)
        print(response)


def main():
    asyncio.run(Test().send())


if __name__ == "__main__":
    main()


Avec ce code, le serveur n'affiche rien d'autre que la trace initiale :

(mmsx-TPjM8MGB-py3.9) xx@ITLP071: 130 (master) ~/dev/mmsx/tornado_http2/demo$ poetry run python server_test.py 
[I 220722 04:05:17 server_test:30] starting
    



Merci à tous !



-
Edité par Le_E 22 juillet 2022 à 4:14:37

  • Partager sur Facebook
  • Partager sur Twitter
22 juillet 2022 à 4:42:56

Je ne connais pas ce module mais en général on ne donne pas l'adresse dans le serveur.
J'écrirais:
    address = ""   # ou "localhost"

Et dans ton client, l'adresse est un peu bizarre:
URI = "http:127.0.0.1:8443/hello"
J'aurais écrit:
URI = "http://127.0.0.1:8443/hello"
bien que normalement le numéro du port soit placé entre le : et les //

-
Edité par PierrotLeFou 22 juillet 2022 à 4:52:44

  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

22 juillet 2022 à 12:09:33

Salut, merci de ta réponse.

En effet, l'adresse du client n'était pas bonne...

J'ai également testé avec une adresse vide dans le serveur mais le client continue à être ignoré...

Edit:

OK, j'ai trouvé.

C'est un bug de l'api http2. L'event loop doit être créer avant le client (HHTP2Client) sinon, ça plante.
Si le code du client est remplacé par ceci :

from tornado_http2.curl import CurlAsyncHTTP2Client as HTTP2Client
import asyncio
from tornado.httpclient import AsyncHTTPClient

from tornado.ioloop import IOLoop


class Test():
    def __init__(self):
        self.__client = HTTP2Client(force_instance=True)

    async def send(self):
        uri = "https://127.0.0.1:8443/hello"
        response = await self.__client.fetch(uri, validate_cert=False)
        print(response.body.decode('utf-8'))

def run_asyncio():
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    try:
        return loop.run_until_complete(Test().send())
    finally:
        loop.close()
        asyncio.set_event_loop(None)

def main():
    run_asyncio()


if __name__ == "__main__":
    main()

alors, ça fonctionne.

Voilà, si jamais, ça peux aoider quelqu'un =).



-
Edité par Le_E 22 juillet 2022 à 16:57:33

  • Partager sur Facebook
  • Partager sur Twitter