Chromium 网络栈之SourceStream

发布于 2021-11-07


SourceStream

Http 协议的实体消息头部 Content-Encoding,用来指定对实体内容的的编码。下面是一些常见的编码:

Content-Encoding: gzip
Content-Encoding: compress
Content-Encoding: deflate
Content-Encoding: identity
Content-Encoding: br

Http 的响应头部如果包含了 Content-Encoding,代表着网络栈拿到的是编码后的数据。所以客户端还需要对接收到的数据做解码。

Chromium 网络栈通过 SourceStream 来处理 Content-Encoding 过的数据。

以处理Content-Encoding: gzipGzipSourceStream为例,最重要的是实现FilterData接口。

  virtual int FilterData(IOBuffer* output_buffer,
                         int output_buffer_size,
                         IOBuffer* input_buffer,
                         int input_buffer_size,
                         int* consumed_bytes,
                         bool upstream_eof_reached) = 0;
  • output_buffer表示处理后输出数据的缓冲区。
  • output_buffer_size表示处理后输出数据的缓冲区的大小。
  • input_buffer表示处理前输入数据的缓冲区。
  • input_buffer_size表示处理前输入数据的缓冲区的大小。
  • consumed_bytes表示实际处理过的输入数据的缓冲区的大小。
  • upstream_eof_reached表示上游数据已经到了尾部。

函数返回负值表示错误信息。正值表示读取到数据。当函数返回为 0 时,consumed_bytes值必须等于input_buffer_size

参考