ngx_http_compile_complex_value

server/2025/3/30 17:06:14/

定义在 src\http\ngx_http_script.c

ngx_int_t
ngx_http_compile_complex_value(ngx_http_compile_complex_value_t *ccv)
{ngx_str_t                  *v;ngx_uint_t                  i, n, nv, nc;ngx_array_t                 flushes, lengths, values, *pf, *pl, *pv;ngx_http_script_compile_t   sc;v = ccv->value;nv = 0;nc = 0;for (i = 0; i < v->len; i++) {if (v->data[i] == '$') {if (v->data[i + 1] >= '1' && v->data[i + 1] <= '9') {nc++;} else {nv++;}}}if ((v->len == 0 || v->data[0] != '$')&& (ccv->conf_prefix || ccv->root_prefix)){if (ngx_conf_full_name(ccv->cf->cycle, v, ccv->conf_prefix) != NGX_OK) {return NGX_ERROR;}ccv->conf_prefix = 0;ccv->root_prefix = 0;}ccv->complex_value->value = *v;ccv->complex_value->flushes = NULL;ccv->complex_value->lengths = NULL;ccv->complex_value->values = NULL;if (nv == 0 && nc == 0) {return NGX_OK;}n = nv + 1;if (ngx_array_init(&flushes, ccv->cf->pool, n, sizeof(ngx_uint_t))!= NGX_OK){return NGX_ERROR;}n = nv * (2 * sizeof(ngx_http_script_copy_code_t)+ sizeof(ngx_http_script_var_code_t))+ sizeof(uintptr_t);if (ngx_array_init(&lengths, ccv->cf->pool, n, 1) != NGX_OK) {return NGX_ERROR;}n = (nv * (2 * sizeof(ngx_http_script_copy_code_t)+ sizeof(ngx_http_script_var_code_t))+ sizeof(uintptr_t)+ v->len+ sizeof(uintptr_t) - 1)& ~(sizeof(uintptr_t) - 1);if (ngx_array_init(&values, ccv->cf->pool, n, 1) != NGX_OK) {return NGX_ERROR;}pf = &flushes;pl = &lengths;pv = &values;ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));sc.cf = ccv->cf;sc.source = v;sc.flushes = &pf;sc.lengths = &pl;sc.values = &pv;sc.complete_lengths = 1;sc.complete_values = 1;sc.zero = ccv->zero;sc.conf_prefix = ccv->conf_prefix;sc.root_prefix = ccv->root_prefix;if (ngx_http_script_compile(&sc) != NGX_OK) {return NGX_ERROR;}if (flushes.nelts) {ccv->complex_value->flushes = flushes.elts;ccv->complex_value->flushes[flushes.nelts] = (ngx_uint_t) -1;}ccv->complex_value->lengths = lengths.elts;ccv->complex_value->values = values.elts;return NGX_OK;
}

该函数用于将 Nginx 配置中的动态字符串(包含变量或特殊符号)编译为可运行时解析的内部结构 ,以支持后续高效地生成实际值 


    v = ccv->value;nv = 0;nc = 0;for (i = 0; i < v->len; i++) {if (v->data[i] == '$') {if (v->data[i + 1] >= '1' && v->data[i + 1] <= '9') {nc++;} else {nv++;}}}

v = ccv->value;

获取待编译的字符串值


nv = 0;

初始化变量计数器

nv(variable count):统计普通变量(如 $var)的数量


nc = 0;

初始化变量计数器

nc(capture count):统计正则捕获组变量(如 $1-9)的数量


for (i = 0; i < v->len; i++) { ... }

遍历字符串的每个字符,逐个分析是否为变量


if (v->data[i] == '$') { ... }

检测变量起始符 $

如果当前字符是 $,则进入变量分析逻辑

变量以 $ 开头,需进一步判断是普通变量还是正则捕获组


此次 没有符合条件的值

循环结束后

nv=0    nc=0

    if ((v->len == 0 || v->data[0] != '$')&& (ccv->conf_prefix || ccv->root_prefix)){if (ngx_conf_full_name(ccv->cf->cycle, v, ccv->conf_prefix) != NGX_OK) {return NGX_ERROR;}ccv->conf_prefix = 0;ccv->root_prefix = 0;}

if ((v->len == 0 || v->data[0] != '$') && (ccv->conf_prefix || ccv->root_prefix))

  • v->len == 0 :检查字符串是否为空。
  • v->data[0] != '$' :检查字符串是否以 $ 开头(即是否为变量)
  • ccv->conf_prefix || ccv->root_prefix :检查是否需要添加前缀(配置路径或根路径)

当字符串是静态路径 (非变量、非空)且需要路径前缀时,进入处理逻辑


ngx_conf_full_name(ccv->cf->cycle, v, ccv->conf_prefix)

将相对路径转换为绝对路径


此次

v->len =9
v->data[0]=/
ccv->conf_prefix=0
ccv->root_prefix=0

条件不成立

    ccv->complex_value->value = *v;ccv->complex_value->flushes = NULL;ccv->complex_value->lengths = NULL;ccv->complex_value->values = NULL;

 ccv->complex_value->value = *v;

保存原始字符串值

v 是经过路径处理后的字符串


ccv->complex_value->flushes = NULL;

初始化

需要清除缓存的变量索引列表


ccv->complex_value->lengths = NULL;

初始化 lengths 指针

lengths 存储计算动态值长度的指令数组


ccv->complex_value->values = NULL;

初始化 values 指针

values 存储生成动态值内容的指令数组


ngx_http_complex_value_t-CSDN博客

    if (nv == 0 && nc == 0) {return NGX_OK;}

 条件成立

返回 NGX_OK


http://www.ppmy.cn/server/179493.html

相关文章

级联FFT(超采样FFT架构)的MATLAB代码及原理

一、原理 该算法首先对输入时间序列的数据进行抽样&#xff0c;然后对抽样后数组内的数据进行 FFT 运算处理&#xff0c;然后进行交叉项的补偿&#xff0c;再对 FFT 之后不同数组间相同位置上的数据进行第 2 次 FFT 处理&#xff0c;从而达到一次 FFT 运算能够得到的效果。   …

gitee第三方登录获取openid | python+Django |已跑通

注&#xff1a;此项目根据美多改编&#xff0c;qq第三方需要备案gitee不用 一、获取appid和appsecret 点击右侧账号设置 左侧菜单栏数据管理里有第三方应用 点击创建应用&#xff0c;根据你的具体情况设置 二、以下是事例代码&#xff0c;根据需要修改即可 setting.py #QQ登…

针对stm32F103C8t6芯片调节USB串口的经验

1、首先这是自己手搓的板子,对于之前一直没有了解过USB这方面,则这个针对USB部分没有设计上拉电阻,造成不管怎么调节PC端都没有反应。 图一 这个没有添加1.5K电阻 这个D+位置应该再接一个1.5KR的电阻如图2所示 图2 这样调节的话PC端就可以识别到USB串口,但是这是串口还是会…

计算机二级:函数基础题

函数基础题 第一题 rinput("请输入半径&#xff1a;") c3.1415926*r*2 print("{:.0f}".format(c))输出&#xff1a; Type Error第二题 a7 b2 print(a%2)输出 1第三题 ab4 def my_ab(ab,xy):abpow(ab,xy)print(ab,end"\n") my_ab(ab,2)prin…

数据库基础知识点(系列七)

视图和索引相关的语句 1&#xff0e;引入视图的主要目的是什么? 答&#xff1a;数据库的基本表是按照数据库设计人员的观点设计的&#xff0c;并不一定符合用户的需求。SQL Server 2008可以根据用户需求重新定义表的数据结构&#xff0c;这种数据结构就是视图。视图是关系数据…

微信小程序登录和获取手机号

目录 准备工作 实现流程 实现代码 公共部分 通过code获取openid等信息 解密手机号 扩展 不借助工具类实现解密 借助工具类获取access_token 准备工作 需要小程序账号&#xff08;可以去微信公众平台创建一个测试号或者正式号&#xff09; appid&#xff1a;小程序id …

使用selenium来获取数据集

使用selenium来获取数据集 1、下载最新的chrome浏览器与chromedriver.exe 查看chrome的版本,打开谷歌浏览器,点击右上角的三个点,然后点击【帮助】, 点击【关于Google Chrome】 然后去下载同样为134版本号的chromedriver.exe, 网址:https://googlechromelabs.github.…

云原生进化:架构现代化的核心引擎

摘要 云原生技术通过容器化、动态编排、微服务等核心能力&#xff0c;正在重构企业IT架构的DNA。本文系统性剖析云原生的技术演进路径、关键架构要素及实施方法论&#xff0c;结合行业典型案例与量化数据&#xff0c;揭示其如何驱动企业实现资源利用率提升60%、故障恢复速度加…