复现方式
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 都没这问题.
1
Kobayashi 2021-03-18 00:38:08 +08:00 1
|
2
abersheeran 2021-03-18 14:12:34 +08:00
httpx yes !
|
3
ClericPy OP @abersheeran 之前选型 httpx 被 aiohttp 那些 C 的模块从性能上打败了, 现在我也被那些 C 里包的写死参数给打败了... 郁闷, 估计只能用 httpx 或者 Requests 整个备份 HTTP 请求模块了
@Kobayashi 之前打 patch 一路不生效, 我还以为是我语法问题, 后来去源码里一看才发现各种 pyx xxx.c 火花带闪电, 感谢提供源码, 我试试看哈, 就喜欢这种人狠话不多直接 show me your code... |
4
ClericPy OP @Kobayashi 再次感谢... 我一开始打 Patch 位置不对, 打到 MultipartReader 上了似乎压根不是这里...
|
5
abersheeran 2021-03-19 10:07:01 +08:00
@ClericPy 不对吧。我记得 aiohttp 的客户端性能没比 httpx 好到哪儿去。也就服务端性能不错。
|
6
ClericPy OP @abersheeran 之前特意测了客户端的性能, 打的是本地 127.0.0.1 的接口, 复用 Session 的时候并发一上去 aiohttp 比 httpx 快了一倍, 不过已经是前年做的实验了, 现在 httpx 有没有把 Cython 支持上还不确定
@Kobayashi 呃, 找了台 windows 测试 ok, 在 Linux 上(Manjaro, Python3.9) 无效, 我继续找找什么问题 |
7
ClericPy OP @Kobayashi windows 上是 py 文件, Linux 下 http_parser 安装以后编译带了 .so 和 .c 那些... 难怪之前死活打不上了
|
9
ClericPy OP @Kobayashi 找了半天官方 issue 里有提到, 然后三四年没新消息, 要不是 aiohttp 真的快, 早就换别的用了... 已经不少于 5 次遇到这种它独占的问题了, 别的库都没这种情况, 不过之前的都能打补丁解决, 这次的真就坑了
|
10
abersheeran 2021-03-19 11:04:56 +08:00
@ClericPy 你说测这个啊,那的确是 aiohttp 更快,毕竟有 C 加持。不过一般发请求的客户端速度瓶颈都在目标服务器啊。
|
11
sujin190 2021-03-22 11:41:56 +08:00
8k 的 http 头还不够,你这是要往 http 头写啥。。
|