主页 > 其他  > 

Ubuntu下nginx-1.24.0源码分析-ngx_test_full_name

Ubuntu下nginx-1.24.0源码分析-ngx_test_full_name
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; #else if (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。c0 和 c1 :分别用于存储路径字符串的第一个和第二个字符。

检查路径长度

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 地址。例如: FileServer192.168.1.100 <SharedResource> :这是服务器上共享的具体资源名称,例如文件夹或打印机。例如: SharedFolderPrinter1

完整的 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)的路径规范较为统一,只需检查是否以 / 开头即可

标签:

Ubuntu下nginx-1.24.0源码分析-ngx_test_full_name由讯客互联其他栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“Ubuntu下nginx-1.24.0源码分析-ngx_test_full_name