当前位置: 首页 > news >正文

ngx_http_range_body_filter

1 定义

ngx_http_range_body_filter 函数 定义在 src/http/modules/ngx_http_range_filter_module.c
staticngx_int_tngx_http_range_body_filter(ngx_http_request_t*r,ngx_chain_t*in){ngx_http_range_filter_ctx_t*ctx;if(in==NULL){returnngx_http_next_body_filter(r,in);}ctx=ngx_http_get_module_ctx(r,ngx_http_range_body_filter_module);if(ctx==NULL){returnngx_http_next_body_filter(r,in);}if(ctx->ranges.nelts==1){returnngx_http_range_singlepart_body(r,ctx,in);}/* * multipart ranges are supported only if whole body is in a single buffer */if(ngx_buf_special(in->buf)){returnngx_http_next_body_filter(r,in);}if(ngx_http_range_test_overlapped(r,ctx,in)!=NGX_OK){returnNGX_ERROR;}returnngx_http_range_multipart_body(r,ctx,in);}

2 目的

1 设计意图

ngx_http_range_body_filter
Nginx HTTP Range Body Filter 模块的核心入口函数,
属于HTTP 输出 body 过滤链的关键一环。

其核心职责是:
根据客户端请求的 Range 范围,
从完整响应 body 中截取指定字节段,
只将客户端实际请求的那部分数据传递到下游过滤链

当一个 HTTP 响应包含Accept-Ranges: bytes
客户端发送了Range: bytes=...请求头时,
Nginx 需要在 header 过滤阶段 (由ngx_http_range_header_filter处理) 将状态码
改为206 Partial Content,然后在 body 过滤阶段精确裁剪 body 数据。


3 详解

1 函数签名

staticngx_int_tngx_http_range_body_filter(ngx_http_request_t*r,ngx_chain_t*in)

1 返回值:ngx_int_t

返回值含义
NGX_OK成功处理或透传,下游过滤器继续处理
NGX_ERROR内部错误(如缓冲区重叠检测失败)
下游过滤器返回值透传下游ngx_http_next_body_filter的返回结果

2 函数名:ngx_http_range_body_filter

词段含义
ngx_httpNginx HTTP 子系统
range模块名,表示 HTTP Range 功能
bodybody 过滤阶段(对应 header 过滤阶段的range_header_filter
filter过滤器模式,属于 HTTP 输出过滤链的一部分

3 参数列表

参数类型含义来源约束
rngx_http_request_t *HTTP 请求对象,包含请求和响应的全部信息上游调用传入非 NULL
inngx_chain_t *待输出的 body 数据链表(ngx_buf_t 的链表结构)上游过滤器产出可为 NULL(表示 body 结束);非 NULL 时不能无限循环

2 逻辑流程

ngx_http_range_body_filter(r, in) ├─ [1] 空输入检测 │ └─ in == NULL → 透传下游,返回 ├─ [2] 上下文缺失检测 │ └─ ctx == NULL → 透传下游,返回 ├─ [3] 单 range 路由 │ └─ nelts == 1 → singlepart_body,返回 └─ [4] 多 range 处理(nelts > 1) ├─ [4.1] 特殊缓冲区检测 │ └─ ngx_buf_special → 透传下游,返回 ├─ [4.2] 缓冲区重叠检测 │ └─ test_overlapped != OK → return NGX_ERROR └─ [4.3] 多 range body 构造 └─ multipart_body,返回

{ngx_http_range_filter_ctx_t*ctx;

1 空输入检测

if(in==NULL){returnngx_http_next_body_filter(r,in);}

过滤链中,in == NULL是 Nginx 约定的一种 body 结束标记(或空调用)。
此时不需要做任何 range 裁剪,直接原样传递给下游过滤器。

in == NULL在 Nginx 的 body 过滤链中是合法的输入,表示"本次调用不携带数据"
此时直接调用下游函数,跳过后面的所有 range 处理逻辑


2 上下文缺失检测

ctx=ngx_http_get_module_ctx(r,ngx_http_range_body_filter_module);if(ctx==NULL){returnngx_http_next_body_filter(r,in);}

Range 上下文是在 header 过滤阶段由ngx_http_range_header_filter创建的。
如果请求中没有有效的 Range 请求头(或 range 解析失败),
ctx 不会被创建。此时 body 阶段不需要做任何处理,直接透传。

ngx_http_get_module_ctx(r, module)展开为r->ctx[module.ctx_index]
从请求对象的上下文数组中获取模块私有上下文

ctx 的创建发生在 header 过滤阶段(ngx_http_range_header_filterparse:标签处

ctx 为 NULL 意味着该请求不需要 range 处理,
或者 range 解析失败导致 header 阶段已经直接返回


3 单 range 路由

if(ctx->ranges.nelts==1){returnngx_http_range_singlepart_body(r,ctx,in);}

ctx->ranges.nelts
表示解析出了多少个 range 段。
当只有一个 range 时,走ngx_http_range_singlepart_body路径,
该函数直接在原缓冲区的pos/lastfile_pos/file_last指针上做偏移裁剪,
零拷贝且高效。


4 多 range 处理

ctx->ranges.nelts > 1
(即客户端请求了多个不连续的字节范围),
走 multipart 路径。

这条路径的约束远多于单 range 路径,
因为 multipart/byteranges 格式要求将 body 切成多个片段,
每个片段前插入 boundary 分隔头和 Content-Range 头,
需要在一个连续的缓冲区上同时操作。


4-1 特殊缓冲区
/* * multipart ranges are supported only if whole body is in a single buffer */if(ngx_buf_special(in->buf)){returnngx_http_next_body_filter(r,in);}

ngx_buf_special宏检测当前缓冲区是否
仅为控制标记(flush/last_buf/sync)且无实际数据。
这类 buffer 是纯控制型 buffer——只传达控制信息,不携带 body 载荷

如果是 这类 buffer ,则无事可做,继续 下一个 body_filter


4-2 缓冲区重叠检测
if(ngx_http_range_test_overlapped(r,ctx,in)!=NGX_OK){returnNGX_ERROR;}

ngx_http_range_test_overlapped是 multipart 路径的第二道安全屏障。
它检查传入的 body 缓冲区in是否满足"单 buffer 完整覆盖所有 range"的约束:

  • 如果检查通过(返回NGX_OK),程序继续进入 4-3 的多 range 构造阶段。
  • 如果检查失败(返回NGX_ERROR),立即返回NGX_ERROR给上游过滤链,

ngx_http_range_test_overlapped函数
对 multipart 路径实施一个关键约束:
所有请求的 range 必须在同一个 body buffer 中完整交付

安全意义

这个检查有其安全必要性:
multipart/byteranges 格式需要在原始 body buffer 上做多次零拷贝切片(通过指针偏移)。
如果原始 buffer 不完整或不连续,切出的子 buffer 会指向错误的内存地址或文件偏移,
产生损坏的 multipart 响应,甚至可能泄露服务器内存中的其他数据。


4-3 多 range body 构造
returnngx_http_range_multipart_body(r,ctx,in);}

将多 range body 的构造委托给ngx_http_range_multipart_body

这是 multipart 路径的最后一步。
它将经过前两道安全检查的 buffer 和 range 上下文委托给ngx_http_range_multipart_body
由该函数完成完整的 multipart/byteranges 响应 body 的拼装。
组装完成后,结果链被传入下游过滤链(ngx_http_next_body_filter)。


ngx_http_range_multipart_body函数

该函数以 body 的原始 buffer(in->buf)作为数据源,
为每个请求的 range 构建一段对应的 multipart 片段,
最后将所有这些片段串联成一个完整的输出链传给下游。


http://www.jsqmd.com/news/1202823/

相关文章:

  • OpenWireless证书管理指南:自签名SSL证书配置与安全
  • CANN/asc-devkit asc_copy寄存器复制函数
  • 2026 SCI论文辅导机构横评:6家医理工合规平台深度实测! - 小艾学姐
  • 2026年 镇江船用控制变压器厂家:稳定可靠的船舶电气核心供应商 - 品牌发掘
  • C++未来十年三大演进支柱:高效、安全、并发
  • 出轨修复咨询哪家靠谱:谋仕心理资质齐全 - 晴光转树
  • Operator 配额管理详解
  • Kubernetes Dashboard 不想裸奔?Headlamp 本地管理集群,用 cpolar 临时给同事看只读面板
  • 2026 年当下,泉州比较好的衬胶钢管源头厂家哪家靠谱,揭秘!这个工业材料如何悄悄改变你的成本结构 - 领域鉴赏官
  • 服装店线上退换货方便吗?四个平台售后规则对比指南 - Chencen
  • 2026年7月广州机械革命笔记本到店维修指南|高性能机型登记和门店资料卡|地址电话核对|7月16日资料更新 - 品牌售后
  • 靠谱的软件开发团队 - 米諾
  • 四轴飞行器运动控制原理与PLC实现方案
  • 2026年工业过滤器十大品牌榜单:袋式/自清洗/烛式/篮式/精密过滤器厂家深度解析与选购指南 - 甄选服务推荐
  • 【Autosar从入门到精通到进阶实战篇】52 运行时断言与在线监控:让状态机在MCU上学会“自我诊断”
  • Excel-条件合并同类项:TEXTJOIN与IF函数实战(非求和,仅文本聚合)
  • 三星换电池品牌哪个质量好:质酷精密电芯 - MXyuyu
  • 2026 年当下,青羊有实力的落水人员打捞公司哪家强,失踪者救援的真相:专业团队如何逆转死亡时刻? - 行业推荐官[官方】--
  • 2026年7月最新武汉爱彼官方售后客服电话及服务网点地址查询 - 爱彼中国官方服务中心
  • Dify 本地工作流跑通后,我用 cpolar 给团队开了一个临时验收入口
  • 出轨修复咨询推荐:谋仕心理成效显著 - 秋山寄远
  • PCB设计中的电磁兼容(EMC)核心策略与实践
  • 2026 年现阶段,日照有实力的救护车租赁平台哪家强,紧急时刻,如何用它省下万千冤枉钱? - 行业推荐官[官方】--
  • 18年深耕四川企业数智化,用友全国十佳服务商,成都创跃科技斩获用友2025年度多项大奖 - GEORANK
  • 【单片机毕业设计】 基于 STM32 的指纹考勤与蓝牙 APP 管理系统设计与实现 ,基于 STM32 单片机的智能指纹考勤终端设计及移动端开发(015002)
  • AltoClef社区贡献指南:如何为开源Minecraft机器人项目做贡献
  • 集成 mupdf-android 的示例做为模块使用报错,程序包android.support.v4.view不存在
  • 出轨修复咨询哪家专业:谋仕心理资深深耕 - 云溪自乐
  • 大数据-Hadoop-统一操作界面:HUE(Hadoop User Experience)【一站式Web平台,整合HDFS、Hive、YARN等核心组件操作】
  • 2026 年现阶段繁昌值得关注的车间隔离实力厂家全面解析与选购指南,不隔离的代价:你的工厂正在“自杀” - 企业推荐管【认证】