有谁遇到过 aiohttp Got more than 8190 bytes Headers 相关的错误了吗

2021-03-17 23:26:19 +08:00
 ClericPy

复现方式

Server Code

import bottle

app = bottle.Bottle()


@app.get('/')
def index():
    bottle.response.set_cookie("a" * 10000, "test")
    return 'ok'


app.run()

Client Code

import asyncio
from aiohttp import ClientSession


async def main():
    async with ClientSession() as req:
        async with req.get('http://127.0.0.1:8080/') as r:
            print(await r.text())


asyncio.run(main())

报错就是

aiohttp.client_exceptions.ClientResponseError: 400, message='Got more than 8190 bytes (10005) when reading request header field Set-Cookie.', url=URL('http://127.0.0.1:8080/')

尝试

简单的 patch 一个类的方法, 改掉默认值. 失败, 因为这是 C 实现的...

https://github.com/aio-libs/aiohttp/search?q=max_field_size+&type=

基本全是写死的常量默认值

另:

基本又是一个 aiohttp 独占的报错, 浏览器 / httpx / Requests 都没这问题.

2222 次点击
所在节点    Python
12 条回复
Kobayashi
2021-03-18 00:38:08 +08:00
依赖的太深了,不好改,monkey patch 吧。

https://pastebin.com/VrcZaj32
https://pastebin.com/raw/VrcZaj32
abersheeran
2021-03-18 14:12:34 +08:00
httpx yes !
ClericPy
2021-03-19 09:45:08 +08:00
@abersheeran 之前选型 httpx 被 aiohttp 那些 C 的模块从性能上打败了, 现在我也被那些 C 里包的写死参数给打败了... 郁闷, 估计只能用 httpx 或者 Requests 整个备份 HTTP 请求模块了


@Kobayashi 之前打 patch 一路不生效, 我还以为是我语法问题, 后来去源码里一看才发现各种 pyx xxx.c 火花带闪电, 感谢提供源码, 我试试看哈, 就喜欢这种人狠话不多直接 show me your code...
ClericPy
2021-03-19 09:48:52 +08:00
@Kobayashi 再次感谢... 我一开始打 Patch 位置不对, 打到 MultipartReader 上了似乎压根不是这里...
abersheeran
2021-03-19 10:07:01 +08:00
@ClericPy 不对吧。我记得 aiohttp 的客户端性能没比 httpx 好到哪儿去。也就服务端性能不错。
ClericPy
2021-03-19 10:23:44 +08:00
@abersheeran 之前特意测了客户端的性能, 打的是本地 127.0.0.1 的接口, 复用 Session 的时候并发一上去 aiohttp 比 httpx 快了一倍, 不过已经是前年做的实验了, 现在 httpx 有没有把 Cython 支持上还不确定


@Kobayashi 呃, 找了台 windows 测试 ok, 在 Linux 上(Manjaro, Python3.9) 无效, 我继续找找什么问题
ClericPy
2021-03-19 10:26:28 +08:00
@Kobayashi windows 上是 py 文件, Linux 下 http_parser 安装以后编译带了 .so 和 .c 那些... 难怪之前死活打不上了
Kobayashi
2021-03-19 10:51:50 +08:00
@ClericPy 确实是,那估计没得玩儿了。
ClericPy
2021-03-19 10:56:15 +08:00
@Kobayashi 找了半天官方 issue 里有提到, 然后三四年没新消息, 要不是 aiohttp 真的快, 早就换别的用了... 已经不少于 5 次遇到这种它独占的问题了, 别的库都没这种情况, 不过之前的都能打补丁解决, 这次的真就坑了
abersheeran
2021-03-19 11:04:56 +08:00
@ClericPy 你说测这个啊,那的确是 aiohttp 更快,毕竟有 C 加持。不过一般发请求的客户端速度瓶颈都在目标服务器啊。
sujin190
2021-03-22 11:41:56 +08:00
8k 的 http 头还不够,你这是要往 http 头写啥。。
ClericPy
2021-03-22 20:48:18 +08:00
@sujin190 我是读... 看官方 Github 似乎服务端有办法覆盖这个参数, 客户端没辙...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/762640

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX