news 2026/7/10 9:16:03

ngx_http_set_default_types

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ngx_http_set_default_types

1 定义

ngx_http_set_default_types 函数 定义在 ./nginx-1.24.0/src/http/ngx_http.c
ngx_int_tngx_http_set_default_types(ngx_conf_t*cf,ngx_array_t**types,ngx_str_t*default_type){ngx_hash_key_t*type;*types=ngx_array_create(cf->temp_pool,1,sizeof(ngx_hash_key_t));if(*types==NULL){returnNGX_ERROR;}while(default_type->len){type=ngx_array_push(*types);if(type==NULL){returnNGX_ERROR;}type->key=*default_type;type->key_hash=ngx_hash_key(default_type->data,default_type->len);type->value=(void*)4;default_type++;}returnNGX_OK;}

2 目的

ngx_http_set_default_types是 Nginx 中一个专门用于
将硬编码的默认 MIME 类型字符串数组,转换为 Nginx 内部可用的动态数组的辅助函数。


它的核心任务非常单一:

接收一个静态的字符串数组(如ngx_http_charset_default_types),
在配置内存池中创建一个动态数组(ngx_array_t),
将这些字符串逐个填入,并为每个字符串计算哈希键,
以便后续能够构建运行时查找用的哈希表。

执行完成后,调用者(如ngx_http_merge_types)就能获得一个格式规范、
可以直接用于ngx_hash_init的数组。


Nginx 各个模块的默认 MIME 类型列表,
在源码中通常定义为静态常量数组。

这些静态数组无法直接用于 Nginx 的哈希表构建,
因为哈希表构建函数ngx_hash_init
要求输入的元素必须是一个ngx_array_t类型的动态数组,
数组元素为ngx_hash_key_t结构体,包含键字符串、哈希值和关联值。

ngx_http_set_default_types的作用就是把这种“静态配置”转换为“动态配置”,
使模块内置的默认类型能够融入到统一的配置合并流程中。


3 详解

1 函数签名

ngx_int_tngx_http_set_default_types(ngx_conf_t*cf,ngx_array_t**types,ngx_str_t*default_type)

1 返回值类型:ngx_int_t

用来表示操作的状态,而不是实际数据。可能的返回值只有两种:

NGX_OK:表示函数成功创建了动态数组,并将所有默认类型填充进去。
NGX_ERROR:表示过程中发生错误,例如内存分配失败。

调用者通过检查返回值是否为NGX_OK来判断函数是否正常完成。


2 函数名:ngx_http_set_default_types

函数名由下划线分隔的多个部分组成,遵循 Nginx 的命名惯例:

set
动词,意为“设置”。这里指将静态定义转换成可用的动态结构。

default
形容词,表明这些类型是“默认的”,即当配置文件中没有显式指定时使用的回退值。

types
特指 MIME 类型列表(如text/htmlapplication/json等)。

因此,ngx_http_set_default_types的完整含义是:
在 HTTP 配置处理过程中,将静态定义的默认 MIME 类型列表设置到动态数组中的函数。


3 参数列表

该函数接收三个参数,提供了输入数据源、输出位置以及操作所需的内存上下文。


1ngx_conf_t *cf

该结构体代表 Nginx 在解析配置文件时的配置上下文
通过cf可以访问配置解析阶段的全局资源


2ngx_array_t **types

指向ngx_array_t *的指针,也就是“指向数组指针的指针”。
types是函数的主要输出参数。
调用者通过它获得填充好的默认类型数组,之后可以用于构建哈希表或继承。


3ngx_str_t *default_type

该指针实际上指向一个静态定义的字符串数组的第一个元素。
这个数组由各个模块在源码中定义,
例如字符集模块的ngx_http_charset_default_types数组。
该数组中的每个元素都是一个ngx_str_t
代表一个默认的 MIME 类型(如"text/html")。
数组以空字符串作为结束标记。

将默认类型列表的定义权留给各调用模块,
函数本身不关心具体有哪些类型,只负责通用的填充逻辑。
这保持了函数的通用性和模块的自治性。


2 逻辑流程

1 创建数组: 从临时内存池中分配一个空动态数组,用于存放 ngx_hash_key_t 元素。 2 遍历静态数组: 通过 while 循环逐个读取默认类型列表中的字符串,直到遇到空字符串。 填充数组: 对每个类型,在动态数组末尾添加新元素,并设置其键字符串、哈希值和哑指针值。 3 返回成功: 所有类型处理完毕,返回 NGX_OK。

{ngx_hash_key_t*type;

声明局部变量


1 创建数组

*types=ngx_array_create(cf->temp_pool,1,sizeof(ngx_hash_key_t));if(*types==NULL){returnNGX_ERROR;}

创建动态数组


2 遍历静态数组

while(default_type->len){type=ngx_array_push(*types);if(type==NULL){returnNGX_ERROR;}type->key=*default_type;type->key_hash=ngx_hash_key(default_type->data,default_type->len);type->value=(void*)4;default_type++;}

遍历默认类型数组

default_type->len
只要 len 不为 0,就继续循环。
当遇到一个 len 为 0 的元素(空字符串)时,
循环结束。这是约定的终止标记。

在数组中添加一个新元素
将当前default_type指向的字符串结构体直接复制给type->key
这样,数组中的元素便记录了 MIME 类型的名称和长度。

注意:这里复制的是ngx_str_t结构体本身(包含data 指针和 len),
并不复制字符串内容。因为default_type指向的字符串常量在静态数据区或全局内存中,
生命周期长,所以直接共享指针是安全的。

计算并设置哈希值

设置元素的关联值
type->value是一个void *类型的指针。
在类型哈希表中,键的值并不存储实际的 MIME 类型字符串,
而是作为一个简单的“存在标记”。

这里将其设置为(void *) 4,一个非 NULL 的哑值。
当在哈希表中查找某个类型时,如果找到,函数会返回一个非 NULL 的指针,
调用者就知道该类型在列表中。

移动指针到下一个默认类型
指针自增操作。因为default_type指向ngx_str_t类型,
自增后指向数组的下一个元素(即下一个ngx_str_t)。

意义:迭代到下一个 MIME 类型,直到遇到长度为 0 的终止元素。


3 返回成功

returnNGX_OK;}

所有默认类型已成功填充到动态数组中,返回 NGX_OK。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/10 9:15:47

一套音响想装进兰博基尼,要先过多少关?

为什么兰博基尼原厂选了森索姆,而不是柏林之声或BOSE?不是谁都能进主机厂的大门自2017年Urus上市起,兰博基尼就提供森索姆音响作为原厂选装配置,在国外车主论坛积累了相当好的口碑。很多奔驰车主第一次听到这个名字是在改装店&…

作者头像 李华
网站建设 2026/7/10 9:12:26

Zoutendijk可行方向法 MATLAB 2024b 实现:3步解析线性约束非线性规划求解

Zoutendijk可行方向法MATLAB 2024b实现:3步解析线性约束非线性规划求解 在工程优化领域,线性约束下的非线性规划问题广泛存在于资源分配、路径规划等实际场景中。Zoutendijk可行方向法作为经典求解方法,其核心思想是通过迭代寻找既满足约束又…

作者头像 李华
网站建设 2026/7/10 9:11:47

【五度妙笔】投资尽调分析指南:5个极易被忽略的风险核查要点!

很多投资项目踩坑,并非源于大额财务造假,而是人工尽调遗漏了隐蔽的非财务风险。本文梳理了 5个极易被忽略的尽调暗坑,覆盖股权、知产、合规等多个核查盲区,同时分享五度妙笔 AI 工具补位方案,帮你补齐细节、守住投资风…

作者头像 李华