MultipartWriter.as_bytes() 不会应用部分的 Content-Encoding/Content-Transfer-Encoding, 与 write() 不同
作者: 2sumtech创建于 2026年8月19日更新于 2026年9月7日
标签bug
描述错误
如果附在非形式数据MultipartWriter'上的一部分带有Content-Encoding'(gzip/deflate)或Content-Transfer-Encoding'(base64/quoted-printable),write()'通过MultipartPayloadWriter'压缩/编码了线上的部分,但as bytes()'返回原始的、未转换的部分内容。 结果与该部分自己的头相矛盾,与服务器实际接收的机体不符.
这也打破了此类机构的“ qop=auth- int” 消化认证: 中间软件“ await body.as bytes() ” (“ 客户 middleware digest auth.py” ) , 因此实体的散列从未与发送的内容相匹配, 认证总是失败 。
重写
导入 Ayncio
从 Aiohttp 导入 MultipartWriter,有效载荷
类 Buf :
def init ( 自 ): self.data=字节( )
async def write(自,块):自.data.extend (chunk)
async def 主线( ):
mp = 多部分Writer ("混合","边界"为"XBOUND")
部分=有效载荷。 StringPayload( “你好世界” )
part.headers ["Content-Encoding"] ="gzip" (中文(简体) ).
mp.append 活口(部分)
buf = buf( )
等待 mp.write( buf )
print ("wie = as bytes (:")",字节 (buf.data) =======================================================================================================================================================================
ayncio.run(主要())产出:wie = as bytes (: False'-as bytes ()'在标题中宣布Content-Encoding: gzip'之后,包含hello world'。
预期行为
as 字节()' 返回相同的字节write()',按其多段数据表示符来生成。
aiohttp 版本
收录于 3.14.3和当前主人公 4.0.0a2.dev0上. 由#11017中的"as 字节()"所引入.
根原因
a. aiohttp/multip.py'中的multipartWriter.as bytes ()' 字段为自己'. parts'字段,而忽略了所储存的编码 ' /te-encoding ' 字段为write ()'所尊重的值。
相关部分
客户端
我准备好了 将打开公关.
内容来源: aio-libs/aiohttp