Python 3.x 如何获取并解析原始http响应?

Python 3.x 如何获取并解析原始http响应?,python-3.x,http,python-asyncio,aiohttp,Python 3.x,Http,Python Asyncio,Aiohttp,我在写某种委托书。它使用aiohttp获取请求,然后通过asyncio以原始格式发送请求。 我在这里使用的是asyncio,因为据我所知aiohttp不支持发送原始请求。 出于我的目的我需要从服务器获取原始响应,然后将其发送回aiohttp客户端。但在这里,我面临两个问题: aiohttp只能通过web.response发送解析后的响应形式。及 asyncio不能只读取http响应(如下所述:)。 为了解决第二个问题,我可以为内容长度标题编写一些肮脏的解决方案: headers=wait rea

我在写某种委托书。它使用aiohttp获取请求,然后通过asyncio以原始格式发送请求。 我在这里使用的是asyncio,因为据我所知aiohttp不支持发送原始请求。 出于我的目的我需要从服务器获取原始响应,然后将其发送回aiohttp客户端。但在这里,我面临两个问题:

  • aiohttp只能通过web.response发送解析后的响应形式。及
  • asyncio不能只读取http响应(如下所述:)。 为了解决第二个问题,我可以为内容长度标题编写一些肮脏的解决方案:
  • headers=wait reader.readuntil(CRLF*2)
    #然后获取内容长度标题
    如有以下情况:
    正文=等待读卡器读取(正文的长度)
    
    但我可能会遇到传输编码

    我如何解决这个问题?欢迎任何其他解决方案

    更新:我查看了http.client.HTTPResponse、urllib3.response.HTTPResponse,它们使用套接字,但到目前为止没有成功。我不能从他们那里得到任何东西。 这都是因为连接:keep alive头,它不允许远程服务器关闭连接,所以异步IO只是挂起

    我需要什么:发送原始请求并立即获得原始响应。不知怎的

    我的解决方案:(到目前为止)。由于我的代理旨在检测各种wierdness,所以我需要从套接字获取所有数据。所以,有两种方法

    一个是正在使用连接:保持活动标题进行连接。在这种情况下,我们通过regex
    re.compile('\s连接\s*:\s+keep-alive\b',re.I)
    对原始请求进行脏检查,以检测它是否应该保持活动状态。然后我们
    reader.read(1)
    直到连接关闭,同时返回当前读取数据。 第二,当连接关闭时,我们只需
    reader.read()


    有没有改进或添加smth的方法?

    请注意,
    reader.read(n)
    可以返回小于
    n
    字节的数据。您可能需要
    reader.readjustice(正文的长度)
    。我认为上面自我实现的解决方案太脏了。我试图避免它。同意-我只是指出了与您实际问题无关的
    read()
    的语义。你的问题很有趣,我投了更高的票。不幸的是,我不知道有哪一个库能够在以原始形式提供HTTP请求的同时提供读取HTTP请求的功能。实际上,您可能需要自己实现它。所以,问题是,使用reader.read()我实际上得到了我想要的东西。但当连接打开时,它会挂起。即使由1个读卡器读取。读取(1)并关闭
    data==b''
    它仍然挂起。在我的
    read()
    的第二个注释中,我的意思是“一个名为
    read
    的函数”(
    ()
    后缀表示一个按约定的函数),没有暗示无参数调用的意思。换句话说,我的第一条评论只是关于
    reader.read(length)
    的语义,它不做处理
    内容长度所需的工作(它可以返回更少的数据)-您需要
    reader.readjustice(length)
    。我知道理想情况下,您希望避免实现HTTP的传输部分。请注意,
    reader.read(n)
    可以返回小于
    n
    字节的数据。您可能需要
    reader.readjustice(正文的长度)
    。我认为上面自我实现的解决方案太脏了。我试图避免它。同意-我只是指出了与您实际问题无关的
    read()
    的语义。你的问题很有趣,我投了更高的票。不幸的是,我不知道有哪一个库能够在以原始形式提供HTTP请求的同时提供读取HTTP请求的功能。实际上,您可能需要自己实现它。所以,问题是,使用reader.read()我实际上得到了我想要的东西。但当连接打开时,它会挂起。即使由1个读卡器读取。读取(1)并关闭
    data==b''
    它仍然挂起。在我的
    read()
    的第二个注释中,我的意思是“一个名为
    read
    的函数”(
    ()
    后缀表示一个按约定的函数),没有暗示无参数调用的意思。换句话说,我的第一条评论只是关于
    reader.read(length)
    的语义,它不做处理
    内容长度所需的工作(它可以返回更少的数据)-您需要
    reader.readjustice(length)
    。我理解,理想情况下,您希望避免实现HTTP的传输部分。