#stream #http #replace #async #http-response #multipart #request-response

multipart-stream

解析和序列化异步multipart/x-mixed-replace流

3个版本

0.1.2 2021年5月24日
0.1.1 2021年4月27日
0.1.0 2021年4月26日

HTTP客户端 中排名 312

MIT/Apache

32KB
588

CI

Rust库,用于解析和序列化异步 multipart/x-mixed-replace 流,适用于与 reqwesthypertokio 一起使用。

注意 multipart/x-mixed-replacemultipart/form-data 不同;你可能对multipart crate感兴趣。

什么是multipart流?

Multipart流是HTTP响应中的一个部分序列,每个部分都有其自己的头和体。一个流可能永远持续,提供在请求开始时不存在的部分。这是一种“悬挂GET”或Comet请求。每个部分可能代表最新的状态,并在概念上替换先前的部分,因此MIME类型为multipart/x-mixed-replace

这是一种简单的HTTP/1.1方法,可以完成通常可能需要更复杂的客户端和服务器端技术的任务,例如:

在IP摄像头领域,永不结束的multipart流似乎很受欢迎

  • 大华IP摄像头提供了一种multipart/x-mixed-replace事件流,例如运动检测变化。(规范
  • 海康威视IP摄像头提供了一个这里描述的事件multipart/mixed流。
  • 维基百科提及,IP摄像头使用此格式进行MJPEG流。

然而,存在一个很大的限制,即浏览器对并发连接数的限制相对较低。在Chrome的情况下,每个主机的连接数限制为六个。因此,多部分流仅在客户端不是网页浏览器的HTTP API中适用。

多部分流究竟是什么?

一个多部分响应可能看起来像这样

Content-Type: multipart/x-mixed-replace: boundary=B

--B
Content-Type: text/plain
Content-Length: 3

foo

--B
Content-Type: text/plain
Content-Length: 3

bar

通常与Transfer-Encoding: chunkedConnection: close配对,以允许发送大小无限或直到结束才可知的响应。

我找不到一个好的规范。《[WHATWG文档](https://html.whatwg.com.cn/multipage/iana.html#multipart/x-mixed-replace)》对multipart/x-mixed-replace进行了松散的描述。它引用了RFC 2046,该规范最初用于富电子邮件中的多部分编码。我认为这些HTTP多部分流并不完全遵循该RFC。我的库目前需要

  • 任何内容类型——调用者应根据需要验证此内容,并将边界参数传递给multipart-stream库。
  • 没有前言。也就是说,没有要丢弃的任意字节,直到第一个部分的边界。(换行符是可以的。)
  • 每个部分和下一个部分边界之间可以有零个或多个换行符(更准确地说:\r\n序列)。
  • 为每个部分提供一条Content-Length行。这种方法比生产者尝试选择一个不会出现在任何部分中的边界,消费者必须搜索部分主体要干净得多。
  • 在最终部分的边界上没有额外的--后缀。我从未见过。

如果您遇到不满足这些要求的multipart流,请打开github问题。

这个库做什么?

它接受一个Bytes流(例如由reqwesthyper返回的流)并返回一个multipart_stream::Part流,反之亦然。(分别针对客户端或服务器用例。)每个Part将头和体打包在一起。

作者

Scott Lamb <[email protected]>

许可

SPDX-License-Identifier: MIT OR Apache-2.0

请参阅LICENSE-MIT.txtLICENSE-APACHE,分别。

依赖关系

~1.5–2.3MB
~44K SLoC