从零手写了高性能C++ TCP服务器,终于搞定了Util工具的实现
·
实现目的
Util 工具类为 HTTP 服务器提供一组无状态的通用静态工具函数,涵盖以下功能:
- 字符串分割:按指定分隔符拆分字符串,用于解析 URL 路径和 HTTP 头部。
- 文件读写:以二进制方式高效读取或写入文件内容,用于响应静态资源请求。
- URL 编解码:处理浏览器请求中的特殊字符转义,避免歧义。
- HTTP 状态码与 MIME 映射:根据状态码获取描述信息,根据文件后缀获取 Content-Type。
- 文件属性判断:判断路径是否为普通文件或目录,用于实现静态资源目录索引。
- 路径安全性校验:防止客户端通过
../等方式访问服务器根目录外的敏感文件。
技术选型
- 容器与基础库:使用 C++ 标准库,避免第三方依赖。
- 文件操作:通过
std::ifstream和std::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_plus为true,空格转为+。 - 其他字符按字节转为
%XX格式(XX 为十六进制 ASCII 值)。
- 字母、数字、
-
UrlDecode
- 若
convert_plus_to_space为true,+转为空格。 - 遇到
%HH时,使用HEXTOI将十六进制字符转为对应数值。 - 其他字符直接保留。
- 若
-
HEXTOI:将
0-9、A-F、a-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"。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)