news 2026/5/16 20:09:04

ngx_http_read_request_header

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ngx_http_read_request_header

1 定义

ngx_http_read_request_header 函数 定义在 ./nginx-1.24.0/src/http/ngx_http_request.c
staticssize_tngx_http_read_request_header(ngx_http_request_t*r){ssize_tn;ngx_event_t*rev;ngx_connection_t*c;ngx_http_core_srv_conf_t*cscf;c=r->connection;rev=c->read;n=r->header_in->last-r->header_in->pos;if(n>0){returnn;}if(rev->ready){n=c->recv(c,r->header_in->last,r->header_in->end-r->header_in->last);}else{n=NGX_AGAIN;}if(n==NGX_AGAIN){if(!rev->timer_set){cscf=ngx_http_get_module_srv_conf(r,ngx_http_core_module);ngx_add_timer(rev,cscf->client_header_timeout);}if(ngx_handle_read_event(rev,0)!=NGX_OK){ngx_http_close_request(r,NGX_HTTP_INTERNAL_SERVER_ERROR);returnNGX_ERROR;}returnNGX_AGAIN;}if(n==0){ngx_log_error(NGX_LOG_INFO,c->log,0,"client prematurely closed connection");}if(n==0||n==NGX_ERROR){c->error=1;c->log->action="reading client request headers";ngx_http_finalize_request(r,NGX_HTTP_BAD_REQUEST);returnNGX_ERROR;}r->header_in->last+=n;returnn;}
ngx_http_read_request_header 函数的主要作用是 以非阻塞方式从客户端连接读取 HTTP 请求头原始数据。 它优先检查接收缓冲区中是否已有未处理的数据并直接返回其长度; 若无数据且读事件就绪则执行系统调用读入新数据; 若读操作尚未就绪,则设置客户端请求头超时定时器并注册读事件, 然后向上层返回 `NGX_AGAIN` 等待下次被触发; 当读取到数据时更新缓冲区指针并返回字节数, 若遇到连接关闭或读取错误则记录日志并以 400 错误结束请求。

2 详解

1 函数签名

staticssize_tngx_http_read_request_header(ngx_http_request_t*r)
返回值 正数 > 0:成功读取的字节数(或缓冲区中已有的未处理数据长度), 调用者可据此继续解析请求头。 NGX_AGAIN(通常为 -2): 表示操作尚未完成, 没有数据可读,需要等待 I/O 事件就绪后再次调用。 NGX_ERROR(通常为 -1): 发生严重错误(如读取失败、连接关闭),请求已终结。
参数 ngx_http_request_t *r 当前 请求对象

2 逻辑流程

1 局部变量 2 未处理数据 3 读取数据 3-1 暂无数据 3-2 读取出错 4 更新缓冲区指针并返回

1 局部变量
{ssize_tn;ngx_event_t*rev;ngx_connection_t*c;ngx_http_core_srv_conf_t*cscf;c=r->connection;rev=c->read;

2 未处理数据
n=r->header_in->last-r->header_in->pos;if(n>0){returnn;}
#1 header_in 是专门用于接收 HTTP 请求头的缓冲区 pos:指向待解析数据的起始位置。 last:指向已读入数据的末尾。 end:指向缓冲区容量的末尾。 计算 n 为缓冲区中尚未解析的字节数。 意义:Nginx 采用边读边解析模式。 每次进入此函数可能是新一轮读事件触发, 但有可能上一次 recv 读入的数据尚未被解析完 此时无需执行系统调用,直接返回已有长度,让上层解析器继续工作。
#2 若已有数据则直接返回

3 读取数据
if(rev->ready){n=c->recv(c,r->header_in->last,r->header_in->end-r->header_in->last);}else{n=NGX_AGAIN;}
#1 rev->ready 读事件已就绪 读取数据
#2 未就绪, 无数据可读 直接设 n = NGX_AGAIN 表示暂时无数据,需等待事件通知

3-1 暂无数据
if(n==NGX_AGAIN){if(!rev->timer_set){cscf=ngx_http_get_module_srv_conf(r,ngx_http_core_module);ngx_add_timer(rev,cscf->client_header_timeout);}if(ngx_handle_read_event(rev,0)!=NGX_OK){ngx_http_close_request(r,NGX_HTTP_INTERNAL_SERVER_ERROR);returnNGX_ERROR;}returnNGX_AGAIN;}
#1 暂无数据可读 设置读取超时定时器 !rev->timer_set:检查该读事件是否已经设置过定时器 未设置,则设置定时器
#2 注册读事件 失败, 直接关闭请求并记录 500 错误 返回 NGX_ERROR 结束函数 确保事件在监控中,这样下次收到数据才能收到通知然后去处理
#3 返回 NGX_AGAIN 告诉调用链:数据尚未读取完毕,等待事件

3-2 读取出错
if(n==0){ngx_log_error(NGX_LOG_INFO,c->log,0,"client prematurely closed connection");}
n == 0 表示客户端关闭了连接 记录一条 INFO 级别日志,内容为“客户端过早关闭连接”

if(n==0||n==NGX_ERROR){c->error=1;c->log->action="reading client request headers";ngx_http_finalize_request(r,NGX_HTTP_BAD_REQUEST);returnNGX_ERROR;}
错误处理 标记连接发生错误 结束当前请求,传递状态码 400 Bad Request 返回 NGX_ERROR,终止函数

4 更新缓冲区指针并返回
r->header_in->last+=n;returnn;}
成功读取了 n 个字节到缓冲区中 将缓冲区描述指针 last 向后移动 n 个字节,准确标记已填充数据的末尾 返回成功读取的字节数
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/16 20:08:09

PHP的final 类禁止继承的庖丁解牛

它的本质是:final 关键字是一个 编译期/解析期指令 (Parse-time Directive),它向 PHP 引擎声明:“此类的实现逻辑是 封闭且完整 (Closed and Complete) 的,不允许任何子类通过 重写 (Override) 或 扩展 (Extend) 来修改其行为。”…

作者头像 李华
网站建设 2026/5/16 20:06:09

【独家首发】ElevenLabs法语语音API未公开高级参数手册(含voice_stability、similarity_boost、style_expansion隐藏阈值):仅限前500名订阅者获取

更多请点击: https://intelliparadigm.com 第一章:ElevenLabs法语语音合成技术全景概览 ElevenLabs 作为当前业界领先的多语言语音合成平台,其法语语音模型在自然度、韵律准确性和情感表达方面均达到专业播音级水准。该平台通过微调基于 Tra…

作者头像 李华
网站建设 2026/5/16 20:03:18

GHelper终极指南:3步轻松掌控华硕笔记本性能与续航平衡

GHelper终极指南:3步轻松掌控华硕笔记本性能与续航平衡 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, E…

作者头像 李华
网站建设 2026/5/16 20:03:17

2025届最火的六大降AI率工具实测分析

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 当今,人工智能生成内容也就是AIGC技术不断普及,其生成文本所具有的“…

作者头像 李华
网站建设 2026/5/16 20:01:05

技术归零与失效分析体系深度解析

在复杂装备、电子系统、机械设备以及工业产品研发中,最可怕的并不是“出现故障”,而是: 找不到真正原因 问题反复出现 修复后再次失效 结论停留在表面 改进措施无法闭环 但问题的本质并没有真正解决。因此,在大型工业、航空航天、军工以及高可靠性工程领域,逐渐形成了一套…

作者头像 李华
网站建设 2026/5/16 19:59:38

前端入门必学:CSS盒子模型与图片样式全解析前言

在学习前端开发的过程中,掌握 CSS 的基础知识是至关重要的一步。本文将详细介绍 CSS 盒子模型、标签宽高、边框、边距 以及 图片与背景图片 的使用方法,适合刚入门的同学系统学习和复习。一、CSS 盒子模型——页面布局的基石1. 什么是盒子模型&#xff1…

作者头像 李华