kaws
kaws

Reputation: 125

aiohttp how to expose two port 80 and 443 for http and https?

How do I run aiohttp on two ports? One for port 80 and port 443 for ssl?

I've tried:

ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
ssl_context.load_cert_chain('/certs/fullchain.pem', '/certs/privkey.pem')

runners = []

async def start_site(app, address='localhost', port=80, ssl_context=None):
    runner = web.AppRunner(app, ssl_context=ssl_context)
    runners.append(runner)
    await runner.setup()
    site = web.TCPSite(runner, address, port)
    await site.start()

loop = asyncio.get_event_loop()
loop.create_task(start_site(init_app() port=80))
loop.create_task(start_site(init_app(), port=443, ssl_context=ssl_context))

try:
    loop.run_forever()
except:
    pass
finally:
    for runner in runners:
        loop.run_until_complete(runner.cleanup())

But it still runs on port 80 only?

Upvotes: 3

Views: 1804

Answers (1)

Vasiliy  Kostrubov
Vasiliy Kostrubov

Reputation: 66

It works like this for me:

import asyncio
import ssl
from aiohttp import web

async def start_tasks(app):
    loop = asyncio.get_event_loop()
    loop.create_task(foo_app())

async def foo_app():
    ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
    ssl_context.load_cert_chain('/certs/cert.pem', '/certs/key.pem')
    foo = web.Application()
    runner = web.AppRunner(foo)
    await runner.setup()
    site = web.TCPSite(runner, "localhost", port=8443, ssl_context=ssl_context)
    await site.start()

app = web.Application()
app.on_startup.append(start_tasks)
web.run_app(app, host="localhost", port=8080)

You can use both http://localhost:8080 and https://localhost:8443

Upvotes: 5

Related Questions