实现目的

Util 工具类为 HTTP 服务器提供一组无状态的通用静态工具函数,涵盖以下功能:

  • 字符串分割:按指定分隔符拆分字符串,用于解析 URL 路径和 HTTP 头部。
  • 文件读写:以二进制方式高效读取或写入文件内容,用于响应静态资源请求。
  • URL 编解码:处理浏览器请求中的特殊字符转义,避免歧义。
  • HTTP 状态码与 MIME 映射:根据状态码获取描述信息,根据文件后缀获取 Content-Type。
  • 文件属性判断:判断路径是否为普通文件或目录,用于实现静态资源目录索引。
  • 路径安全性校验:防止客户端通过 ../ 等方式访问服务器根目录外的敏感文件。

技术选型

  • 容器与基础库:使用 C++ 标准库,避免第三方依赖。
  • 文件操作:通过 std::ifstreamstd::ofstream 以二进制模式操作文件,避免文本模式下的换行符转换问题。
  • URL 编解码:遵循 RFC 3986 规范,将非保留字符转为 %HH 格式,兼容 W3C 标准中 + 与空格的转换。
  • 映射表:使用 std::unordered_map 存储 HTTP 状态码描述和 MIME 类型映射,查询效率为 O(1)。
  • 路径验证:通过解析路径中的 .. 层级,确保客户端无法跳出根目录。

工具类要素

Util 类为纯静态类,无需实例化,主要包含以下内容:

全局映射表

  • _status_msg:状态码到状态描述的映射(如 200 → "OK")。
  • _mime_msg:文件后缀到 MIME 类型的映射(如 ".html" → "text/html")。

静态方法接口

  • 字符串分割:Split()
  • 文件读写:ReadFile()WriteFile()
  • URL 编解码:UrlEncode()UrlDecode() 及辅助函数 HEXTOI()
  • 状态码描述:StatusDesc()
  • MIME 类型获取:ExtMime()
  • 文件属性判断:IsDirectory()IsRegular()
  • 路径有效性判断:ValidPath()

接口设计与操作

字符串分割
static size_t Split(const std::string &src, const std::string &sep, std::vector<std::string> *array)

  • src 开头查找分隔符 sep,分割结果存入 array
  • 支持多字符分隔符(如 ", ")。
  • 忽略开头的连续分隔符,避免生成空串。
  • 返回分割后的子串数量。
文件读写
static bool ReadFile(const std::string &filename, std::string *buf)
static bool WriteFile(const std::string &filename, const std::string &buf)

  • ReadFile:以二进制模式打开文件,预分配 buf 大小后一次性读取。
  • WriteFile:以截断模式和二进制模式打开文件,写入全部 buf 内容。
  • 所有操作均进行错误检查并记录日志。
URL 编解码
static std::string UrlEncode(const std::string &url, bool convert_space_to_plus)
static std::string UrlDecode(const std::string &url, bool convert_plus_to_space)
static char HEXTOI(char c)

  • UrlEncode

    • 字母、数字、. - _ ~ 直接保留。
    • convert_space_to_plustrue,空格转为 +
    • 其他字符按字节转为 %XX 格式(XX 为十六进制 ASCII 值)。
  • UrlDecode

    • convert_plus_to_spacetrue+ 转为空格。
    • 遇到 %HH 时,使用 HEXTOI 将十六进制字符转为对应数值。
    • 其他字符直接保留。
  • HEXTOI:将 0-9A-Fa-f 转为对应的 0~15 值。

状态码与 MIME 映射
static std::string StatusDesc(int status)
static std::string ExtMime(const std::string &filename)

  • StatusDesc:查询 _status_msg 获取状态码描述,未找到返回空字符串。
  • ExtMime:根据文件后缀查询 _mime_msg 获取 MIME 类型,默认返回 "application/octet-stream"
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐