-
Notifications
You must be signed in to change notification settings - Fork 376
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
反向代理的问题 #649
Comments
https://github.com/qicosmos/cinatra/blob/master/tests/test_coro_http_server.cpp#L1485 |
@qicosmos
然后我直接访问 反代到everything
反代到浏览器
同样尝试了反代alist,alist的响应为Transfer-Encoding: chunked |
不知道你说的代理到浏览器是什么意思,测试代码也不完整。 |
chunked数据不存在body_ 里面,body_里面存的是有length的数据,chunked是流式的存在chunked_buf_里面。不管存在哪里,都会通过resp_data 返回出去。 如果有问题欢迎帮助提个pr修复一下。 |
1、首先说一下http1.0中content-length的问题,虽然是个古老协议,但万一有人踩坑了好知道怎么回事。
但是cinatra的http client处理后变成了
显然标头中Transfer-Encoding: chunked依然存在,但body已经不是chunked了 |
谢谢,我晚点构造一下chunked的case看一下什么情况。 后面继续在这里讨论。 |
这个代码应该可以说明问题,http client因为反向代理返回的数据错误一直在试图用chunked解析,然后就卡住了
|
好的,晚点看一下这个case。 |
这个问题是因为反代的时候把chunked的数据解析之后再发给client的,同时header里又保持了服务端响应的header,里面包括了chunked,但实际上反代服务器返回的不是chunked格式数据,从而引起了问题。 一种解决方法是如果是chunked multipart 这种格式的数据时把对应的header删掉,按照length 返回给client。 另外一种解决方法是完全透明的反代,即反代服务器完全不解析http 协议,收到什么就转发什么,这种情况下client 端收到的数据和代理的服务器响应的数据格式完全一样。但这种方法有个问题是如果用户希望校验服务端响应的http 头的时候就不行了,这时候不得不延迟到client 端去检查了。 现在的反代是先解析了http 协议再返回给client,只适合有length的场景。 我的想法是改进现在的反代,先解析http 头,允许用户传入检查http头的回调函数,通过http头可以得知是否含有length,如果检查通过则将http 头响应给client,再读body返回给client;如果为chunked,multipart等格式时,则按流的内容实时响应给client。这样就能灵活适配多种格式了,并且还支持用户检查http 头。有必要的话也可以增加body内容检查的回调函数。 透明反代是stream based的反代;现在的反代是http based的反代。 你的想法如何?是透明代理好还是改进现在的反代好? @dosmlp |
先简单改一版,反代响应的时候把header里面的chunked multipart删掉,这样就能正常返回给client了。虽然不是一个好方法,先解决问题。后面再持续改进。 |
如果要做一个功能完善的反代,request和response的标头都要处理,甚至body还会修改,比如增加压缩。 |
这个示例似乎跑不起来啊,代码里似乎也没有反向代理哦
reverse_proxy proxy_rr(10, 8091);
proxy_rr.add_dest_host("127.0.0.1:9001");
proxy_rr.add_dest_host("127.0.0.1:9002");
proxy_rr.add_dest_host("127.0.0.1:9003");
proxy_rr.start_reverse_proxy<GET, POST>("/rr", true,
coro_io::load_blance_algorithm::RR);
The text was updated successfully, but these errors were encountered: