ngx_http_set_default_types 📅 2026/7/10 9:16:17 1 定义ngx_http_set_default_types 函数 定义在 ./nginx-1.24.0/src/http/ngx_http.cngx_int_tngx_http_set_default_types(ngx_conf_t*cf,ngx_array_t**types,ngx_str_t*default_type){ngx_hash_key_t*type;*typesngx_array_create(cf-temp_pool,1,sizeof(ngx_hash_key_t));if(*typesNULL){returnNGX_ERROR;}while(default_type-len){typengx_array_push(*types);if(typeNULL){returnNGX_ERROR;}type-key*default_type;type-key_hashngx_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/html、application/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 创建数组*typesngx_array_create(cf-temp_pool,1,sizeof(ngx_hash_key_t));if(*typesNULL){returnNGX_ERROR;}创建动态数组2 遍历静态数组while(default_type-len){typengx_array_push(*types);if(typeNULL){returnNGX_ERROR;}type-key*default_type;type-key_hashngx_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。