Ubuntu 下 nginx-1.24.0 源码分析 - ngx_test_full_name

ops/2025/2/23 0:49:01/

ngx_test_full_name

声明在 src\core\ngx_file.c 

static ngx_int_t ngx_test_full_name(ngx_str_t *name);

定义在 src\core\ngx_file.c 

static ngx_int_t
ngx_test_full_name(ngx_str_t *name)
{
#if (NGX_WIN32)u_char  c0, c1;c0 = name->data[0];if (name->len < 2) {if (c0 == '/') {return 2;}return NGX_DECLINED;}c1 = name->data[1];if (c1 == ':') {c0 |= 0x20;if ((c0 >= 'a' && c0 <= 'z')) {return NGX_OK;}return NGX_DECLINED;}if (c1 == '/') {return NGX_OK;}if (c0 == '/') {return 2;}return NGX_DECLINED;#elseif (name->data[0] == '/') {return NGX_OK;}return NGX_DECLINED;#endif
}

ngx_test_full_name 是一个用于判断路径名是否为“完整路径”的函数 

函数签名

static ngx_int_t
ngx_test_full_name(ngx_str_t *name)

 

  • ngx_int_t :Nginx 自定义的整数类型,通常用于返回状态码。
  • ngx_str_t :Nginx 自定义的字符串结构体,包含两个字段:
    • data:指向字符串数据的指针。
    • len:字符串的长度。
  • static :表明该函数的作用域仅限于当前文件,不会被其他文件调用。
  • name:传入的需要判断的路径

Windows 平台的特殊处理

#if (NGX_WIN32)

 条件编译 NGX_WIN32 是一个宏,表示当前代码运行在 Windows 平台上。

Windows 和类 Unix 系统(如 Linux)对路径的处理方式不同,因此需要分别处理

 变量声明

u_char  c0, c1;
  • u_char :无符号字符类型,等价于 unsigned char
  • c0c1 :分别用于存储路径字符串的第一个和第二个字符。

检查路径长度

c0 = name->data[0];
if (name->len < 2) {if (c0 == '/') {return 2;}return NGX_DECLINED;
}

 

  • c0 = name->data[0] :获取路径字符串的第一个字符。
  • if (name->len < 2) :如果路径长度小于 2,则进行以下判断:
    • 如果第一个字符是 /,返回 2,表示路径是一个根路径(例如 //abc),需要添加盘符 (如/ → C:/
    • 否则,返回 NGX_DECLINED,表示路径不符合要求。

在路径长度不足的情况下,快速判断是否为根路径。

提取次字符并检测盘符路径 
c1 = name->data[1];
if (c1 == ':') {c0 |= 0x20;if ((c0 >= 'a' && c0 <= 'z')) {return NGX_OK;}return NGX_DECLINED;
}

c1 == ':': 检测Windows盘符格式(如C:)。

c0 |= 0x20: 通过位操作将大写字母转为小写(A(0x41) → a(0x61))。

原理: 0x20 是ASCII表中大小写字母的差值,按位或操作实现不区分大小写。

范围检查: 确保盘符在a-z之间,兼容C:/c:/写法。

拒绝非法盘符: 如0:G:(超出a-z范围)。

检查 UNC 路径

if (c1 == '/') {return NGX_OK;
}

 

  • if (c1 == '/') :如果第二个字符是斜杠 /,则可能是 UNC 路径(例如 //server/share)。
  • 返回 NGX_OK,表示路径有效。

UNC(Universal Naming Convention,通用命名约定)路径 是一种用于在计算机网络中标识共享资源(如文件夹、打印机等)的路径格式。它主要用于 Windows 操作系统,允许用户通过网络访问远程计算机上的资源,而无需映射网络驱动器

UNC 路径的基本格式如下:

\\<ServerName>\<SharedResource>
  • \\ :UNC 路径以两个反斜杠开头,表示这是一个网络路径。
  • <ServerName> :这是提供共享资源的服务器名称或 IP 地址。例如:
    • FileServer
    • 192.168.1.100
  • <SharedResource> :这是服务器上共享的具体资源名称,例如文件夹或打印机。例如:
    • SharedFolder
    • Printer1

完整的 UNC 路径示例:

  • \\FileServer\SharedFolder
  • \\192.168.1.100\Documents

检查根路径 

if (c0 == '/') {return 2;
}

首字符为'/' 

可能为根目录(如"/path"需转换为"C:/path")

 

return NGX_DECLINED;

 

  • 如果以上条件都不满足,则返回 NGX_DECLINED,表示路径无效。

非 Windows 平台的处理

#else
if (name->data[0] == '/') {return NGX_OK;
}
return NGX_DECLINED;
#endif

 

  • 在非 Windows 平台上,路径的有效性判断较为简单:
    • 如果路径的第一个字符是 /,则返回 NGX_OK,表示路径有效。
    • 否则,返回 NGX_DECLINED

类 Unix 系统(如 Linux)的路径规范较为统一,只需检查是否以 / 开头即可


http://www.ppmy.cn/ops/160642.html

相关文章

超多目标优化:基于导航变量的多目标粒子群优化算法(NMOPSO)的无人机三维路径规划,MATLAB代码

一、基于导航变量的多目标粒子群优化算法&#xff08;NMOPSO&#xff09;介绍 基于导航变量的多目标粒子群优化算法&#xff08;Navigation variable-based multi-objective particle swarm optimization&#xff0c;NMOPSO&#xff09;是2025年提出的一种用于无人机路径规划的…

Redis复制性能优化利器:深入解析replica-lazy-flush参数

Redis复制性能优化利器&#xff1a;深入解析replica-lazy-flush参数 在Redis的主从复制场景中&#xff0c;你是否遇到过这些情况&#xff1f; 主从全量同步时从节点长时间不可用大数据量同步期间出现连接超时内存使用量在同步期间突然飙升 这些问题的解决方案可能就藏在repl…

Redis-线程模型

线程模型 前言单线程模型一次客户端与Redis完整通信过程建立连接执行一个set请求为什么选择单线程多线程就不行吗 I/O多路复用模型基本的IO模型非阻塞模式IO多路复用 多线程模型 前言 Redis 的线程模型其实是分两块的&#xff1a; Redis 6.0 之前的单线程模型。其实从 4.0 开始…

blender笔记2

一、物体贴地 物体->变换->对齐物体 ->对齐弹窗(对齐模式&#xff1a;反方&#xff0c;相对于&#xff1a;场景原点&#xff0c;对齐&#xff1a;z)。 之后可以设置原点->原点--3d游标 二、面上有阴影 在编辑模式下操作过后&#xff0c;物体面有阴影。 数据-&g…

动态规划

简介 动态规划最核心两步&#xff1a; 状态表示&#xff1a;dp[i]代表什么状态转移方程&#xff1a;如何利用已有的dp求解dp[i] 只要这两步搞对了&#xff0c; 就完成了动态规划的%95 剩下的就是细节问题&#xff1a; dp初始化顺序&#xff08;有时是倒序&#xff09;处理边…

从WebRTC到EasyRTC:嵌入式适配的视频通话SDK实现低延迟、高稳定性音视频通信

WebRTC最初是为浏览器之间的实时通信设计的&#xff0c;其资源需求和复杂性可能对嵌入式设备的性能提出较高要求&#xff0c;因此在嵌入式系统中应用时面临一些挑战&#xff1a; 1&#xff09;资源消耗较高 CPU和内存占用&#xff1a;WebRTC是一个功能强大的实时通信框架&…

Python爬虫实战:从零到一构建数据采集系统

文章目录 前言一、准备工作1.1 环境配置1.2 选择目标网站 二、爬虫实现步骤2.1 获取网页内容2.2 解析HTML2.3 数据保存 三、完整代码示例四、优化与扩展4.1 反爬应对策略4.2 动态页面处理4.3 数据可视化扩展 五、注意事项六、总结互动环节 前言 在大数据时代&#xff0c;数据采…

使用html css js 来实现一个服装行业的企业站源码-静态网站模板

最近在练习 前端基础&#xff0c;html css 和js 为了加强 代码的 熟悉程序&#xff0c;就使用 前端 写了一个个服装行业的企业站。把使用的技术 和 页面效果分享给大家。 应用场景 该制衣服装工厂官网前端静态网站模板主要用于前端练习和编程练习&#xff0c;适合初学者进行 HT…