随着#1357 的合并,可以将请求正文流式传输到应用程序,而无需在 H2O 中缓冲整个内容。 但是,到目前为止,该功能仅由 http2 协议处理程序和代理处理程序实现。
我们还需要在以下模块中实现该功能。
涉及:#1585
是否有人对此功能请求工作或感兴趣? 我们如何帮助找到感兴趣的各方来实施?
我对 http1 部分感兴趣,但不清楚如何实现此功能。
@kazuho我对 mruby 部分很感兴趣,虽然我不知道从哪里开始。 :)
我还假设一旦#1966 合并,就开始研究这个更有意义,对吗?
@kazuho关于从哪里开始的任何指示?
https://github.com/h2o/h2o/pull/1357将是一个好的开始,因为它实现了 http2 和代理处理程序的请求流。
关键部分是它使处理程序(mruby、fastcgi、proxy 等)声明它们是否通过h2o_handler_t::has_body_stream
支持流媒体。 如果他们这样做了,通过 http2 接收的请求(因为还没有针对 http1 的流),可以通过以下 h2o_req_t 结构成员进行流传输:
struct {
h2o_write_req_chunk cb;
void *priv;
} _write_req_chunk;
h2o_write_req_chunk_done _write_req_chunk_done;
我明白了,谢谢@deweerdt。 这将如何在 Mruby 方面翻译? (即,您将如何触发回调或通知以从数据流中获取新块)
对于 mruby,这将转化为设置写入块回调,以便前端协议(目前仅 http2)可以在正文块可用时写入它们。 这是代理的地方: https :
抱歉,伙计们……实际上我已经实现了几乎完成的 mruby 请求流传输,但是很久没有推送了。 我提交了一份正在进行中的 PR 作为 #1980。
@tomas如果您有兴趣实施它,如果您基于该分支工作,将不胜感激,并随时问我任何问题。 如果您只是想使用它,请再等一会儿。
好消息@i110! 如果有帮助,我可以帮助进行测试。 我正在开发一个流式多部分解析器,很想在你的分支上尝试一下。
从我在你的 PR 上看到的,它应该可以正常工作,对吧? (至少用于接收和不发送数据)
我看到 http 1 请求流的一些工作已经登陆https://github.com/h2o/h2o/pull/2007 -- 有人可以澄清它现在是否可以在 HTTP 1.1 上工作吗?
我修改了POST
示例以使用流 API,但它仅适用于 HTTP 2 请求。
当我强迫卷曲使用HTTP 1.1,在req->write_req.cb
是没有得到所谓的在所有即使req->proceed_req
不为NULL,局部反应是可req->entity
和我初始化回调适当地:
https://gist.github.com/kishorenc/9aa7073fd31e10b5bcc4ceec9682cd0e#file -h2o_streaming-cpp-L61-L77
快速澄清将不胜感激。
@kazuho @deweerdt很抱歉再次碰到这个线程。 我尝试针对 master 进行构建,但仍然面临同样的问题——请求流在 HTTP 1.1 上不起作用,但适用于 HTTP 2——你能确认 HTTP 1.1 的请求流支持的状态吗? 谢谢你。
@kishorenc是否手动调用req->proceed_req帮助?
这工作@chenbd - 诀窍是手动调用req->process_req
。 我已经验证请求正文流现在适用于 http 1.1 和 http 2。
非常感谢您在这里的帮助。 谢谢你。
@chenbd或其他人,我在这里有一个后续问题:所需的行为是仅在调用req->process_req
时才将下一块请求正文发送到回调。 然而,在 HTTP 2 上,即使在调用req->process_req
之前,异步请求回调也会被连续触发——这是不可取的,因为我的应用程序在下一个块到达之前没有完成处理前一个块。
为什么 HTTP 1.1 和 HTTP 2 之间的行为存在差异? HTTP 2 行为是错误吗?
发现问题: http2.active_stream_window_size
大于请求正文的大小。 在 HTTP2 上,请求正文回调以16384
字节块被多次调用,直到达到active_stream_window_size
大小。 但是,在 HTTP 1 上,处理程序仅在较小的块大小下调用一次,并且需要调用process_req()
以获取更多块。