Ubuntu 下 nginx-1.24.0 源码分析 - ngx_test_full_name

news/2025/2/22 11:23:38

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
  • 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.niftyadmin.cn/n/5862178.html

相关文章

探索关键领域的AI工具:机器学习、深度学习、计算机视觉与自然语言处理

引言 在人工智能(AI)迅猛发展的今天&#xff0c;机器学习(ML)、深度学习(DL)、计算机视觉(CV)和自然语言处理(NLP)已经成为解决复杂问题的关键技术。无论是自动驾驶车辆的视觉识别&#xff0c;还是智能助手的对话理解&#xff0c;这些技术都在改变着世界。本文将介绍在各个领域…

百万架构师第三十七课:RabbitMq:高可用集群搭建步骤|JavaGuide

安装环境 Centos-7 三台虚拟机 192.168.8.150&#xff08;磁盘节点&#xff09; 192.168.8.45 &#xff08;内存节点&#xff09; 192.168.8.40 &#xff08;内存节点&#xff09;一、安装Erlang 1、erlang 下载地址&#xff1a; http://www.rabbitmq.com/releases/erlang…

Unity摄像机与灯光相关知识

一、Inspector窗口 Inspector窗口可以查看和编辑对象的属性以及设置 其中包含各种组件&#xff0c;例如用Cube对象来举例 1.Sphere(Mesh)组件&#xff1a; 用来决定对象的网格属性&#xff0c;例如球体网格为Sphere、立方体网格为Cube 2.Mesh Renderer组件&#xff1a; 用来设置…

【弹性计算】虚拟化技术

虚拟化技术 1.虚拟化技术的发展历程1.1 Xen 虚拟化架构&#xff08;2009 ~ 2015 年&#xff09;1.2 KVM 虚拟化架构&#xff08;2015 ~ 2018 年&#xff09;1.3 软硬件结合的虚拟化架构&#xff08;2018 年至今&#xff09; 2.KVM 虚拟化技术3.热迁移技术4.热升级技术4.1 内核热…

玩机日记 10 群晖开启文件服务挂载到手机/电脑,测试传输性能

目录 1、群晖开启smb和sftp 2、Windows11挂载群晖磁盘 3、手机连接sftp访问群晖文件 之前在PVE上安装Windows11时只划分了512g的磁盘大小作为C盘&#xff0c;没有添加别的磁盘。在安装了一堆游戏测试性能后&#xff0c;c盘已经爆红了&#xff0c;我需要挂载群晖的硬盘&#…

利用非球面透镜进行激光光束重组

这是高斯分布激光束重塑透镜设计的分步演示。该透镜用于将高斯分布转换为成像平面上的均匀照明。 输入激光光束轮廓&#xff1a; 光学结构&#xff1a; Excel 中坐标的数学计算&#xff1a; 输出照度曲线&#xff1a;

一文读懂 KYC:金融、IT 领域的关键应用与实践

文章目录 一、KYC 的基本概念&#xff08;一&#xff09;定义&#xff08;二&#xff09;起源与发展&#xff08;三&#xff09;目的与作用&#xff08;四&#xff09;主要组成部分&#xff08;五&#xff09;适用范围 二、KYC 在金融领域的应用 —— 以保险业务为例&#xff0…

酒店旅游API:数据交互的隐形桥梁——以携程API为例

一、API&#xff1a;酒店 和第三方服务无缝连接。 核心价值&#xff1a; 实时数据互通&#xff1a;房态、价格、库存秒级同步。业务流程自动化&#xff1a;预订、支付、确认全程无需人工干预。生态扩展&#xff1a;开发者可基于API构建定制化工具&#xff08;如比价插件、智能…