H2o: 对请求流的更多支持

创建于 2018-01-12  ·  15评论  ·  资料来源: h2o/h2o

随着#1357 的合并,可以将请求正文流式传输到应用程序,而无需在 H2O 中缓冲整个内容。 但是,到目前为止,该功能仅由 http2 协议处理程序和代理处理程序实现。

我们还需要在以下模块中实现该功能。

  • [] http1
  • [] fastcgi
  • [ ] 穆鲁比

涉及:#1585

help wanted

所有15条评论

是否有人对此功能请求工作或感兴趣? 我们如何帮助找到感兴趣的各方来实施?

我对 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()以获取更多块。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

wujunjenny picture wujunjenny  ·  5评论

ndac-todoroki picture ndac-todoroki  ·  5评论

Ys88 picture Ys88  ·  5评论

daniel-lucio picture daniel-lucio  ·  5评论

chenbd picture chenbd  ·  3评论