dispatcher.py 文件源码

python
阅读 23 收藏 0 点赞 0 评论 0

项目:gateway 作者: wasp 项目源码 文件源码
def dispatch(self, request: Request):
        service_addr = await self._resolver.resolve(request)
        print('service_addr:', service_addr)

        # we need the headers as a dict:
        headers = CIMultiDict()
        for k, v in request.headers:
            headers[k.decode()] = v.decode()

        # aiohttp will try to do a len on the content if there is
        # no content-length header. Since we aren't currently supporting
        # streaming incoming, we are going to just pretend that there is
        # no data...
        if headers.get('Content-Length') is None:
            data = None
        else:
            data = request.content

        try:
            async with self._session.request(request.method.decode(),
                                             service_addr,
                                             data=data,
                                             headers=headers) as resp:
                # TODO: Need to support any other versions?
                # TODO: Abstract to response class.
                request.transport.write(b'HTTP/1.1 %d %b\r\n' % (resp.status,
                                                                 resp.reason.encode()))  # noqa
                # TODO: Figure out how to use raw_headers to bypass en/decode
                for k, v in resp.headers.items():
                    request.transport.write(b'%b: %b\r\n' % (k.encode(),
                                                             v.encode()))
                request.transport.write(b'\r\n')

                while True:
                    chunk = await resp.content.readany()
                    if not chunk:
                        break
                    request.transport.write(chunk)

                request.transport.close()
        except ClientOSError:
            raise HTTPBadGatewayException('Unable to reach destination, '
                                          'service unreachable.')
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号