aiohttp icon indicating copy to clipboard operation
aiohttp copied to clipboard

How to override HTTP CONNECT

Open andrey-oparin opened this issue 5 years ago • 9 comments

🐞 Describe the bug I implement HTTP/HTTPS Proxy based on aiohttp and I need override HTTP connect method in subclass of aiohttp.web.View such as this guide

https://aiohttp.readthedocs.io/en/latest/web_reference.html

Overridable coroutine methods: connect(), delete(), get(), head(), options(), patch(), post(), put(), trace().

In this sample code, HTTP connect handler never called

💡 To Reproduce

import asyncio

from aiohttp import web, hdrs
from aiohttp.log import logging as logger


class HttpProxyView(web.View):
    
    async def get(self):
        logger.debug('Handle {}'.format(self.request.path))
        name = self.request.match_info.get('name', "Anonymous")
        text = "Hello, " + name
        return web.Response(text=text)

    async def connect(self):
        logger.debug('Start CONNECT to %s', self.request.path)


async def run_app(app, host, port):
    runner = web.AppRunner(app)
    await runner.setup()

    site = web.TCPSite(runner, host, port)
    await site.start()

    while True:
        await asyncio.sleep(3600)


if __name__ == '__main__':
    logger.basicConfig(level=logger.DEBUG)

    app = web.Application()
    app.add_routes([
        web.view('/', HttpProxyView),
        web.view('/{name:.*}', HttpProxyView)])

    loop = asyncio.get_event_loop()
    try:
        loop.run_until_complete(run_app(app, host='0.0.0.0', port=8080))
    except KeyboardInterrupt:
        pass

andrey-oparin avatar Feb 13 '20 10:02 andrey-oparin