#ifndef CCWeb_Response_H #define CCWeb_Response_H #pragma once // 检查宏定义 #ifdef Status #undef Status #endif #include "CCRequest.h" #include #include /** * @namespace CTL * @brief 该命名空间包含处理 Web 请求和响应的类和函数。 */ namespace CTL { /** * @class Response * @brief 该类用于处理 HTTP 响应,包括向客户端发送文件、资源和自定义内容。 */ class Response { public: /** * @brief 初始化响应对象。 * * @param Client 客户端套接字。 * @param cors 跨域资源共享 (CORS) 设置,如果不需要 CORS 可以传入 nullptr。 * @param ssl SSL 对象,用于安全连接,如果不需要 SSL 可以传入 nullptr。 */ void Init(const CTL::Socket& Client, CORS* cors, SSL* ssl = nullptr); /** * @brief 向客户端发送文件作为响应。 * * @param Path 文件路径。 * @param Status_t 发送的 HTTP 状态码,默认为 200。 * @return 如果文件发送成功返回 true,否则返回 false。 */ bool ResponseFile(const CTL::String& Path, int Status_t = 200); /** * @brief 向客户端发送资源作为响应。 * * @param Data 资源数据。 * @param Status_t 发送的 HTTP 状态码,默认为 200。 * @return 如果资源发送成功返回 true,否则返回 false。 */ bool Resource(const CCVector& Data, int Status_t = 200); /** * @brief 向客户端发送可下载的文件资源。 * * @param Path 文件路径。 * @param SendBufferSize 发送缓冲区大小,默认为 4096 字节。 * @return 如果文件发送成功返回 true,否则返回 false。 */ bool ResourceDownload(const CTL::String& Path, int SendBufferSize = 4096); /** * @brief 设置响应头信息。 * * @param Key 头信息键。 * @param value 头信息值。 */ void SetHeader(const CTL::String& Key, const CTL::String& value); /** * @brief 向客户端写入字符串数据。 * * @param Data 要发送的数据。 * @return 如果数据发送成功返回 true,否则返回 false。 */ bool Write(const CTL::String& Data); /** * @brief 向客户端发送原始数据。 * * @param buffer 数据缓冲区。 * @param size 缓冲区大小。 * @return 如果数据发送成功返回 true,否则返回 false。 */ bool SendData(const char* buffer, size_t size); /** * @brief 向客户端写入字符向量数据,并设置状态码。 * * @param Data 要发送的数据。 * @param Status_t 发送的 HTTP 状态码。 * @return 如果数据发送成功返回 true,否则返回 false。 */ bool Write(const CCVector& Data, int Status_t); /** * @brief 向客户端写入字符串数据,并设置状态码。 * * @param Data 要发送的数据。 * @param Status_t 发送的 HTTP 状态码。 * @return 如果数据发送成功返回 true,否则返回 false。 */ bool Write(const CTL::String& Data, int Status_t); /** * @brief 处理路由响应。 */ void ResponseRouting(); /** * @brief 写入响应头信息。 * * @param Status_t HTTP 状态码。 * @param ContentType 内容类型。 */ void WriteHeader(int Status_t, const CTL::String& ContentType); /** * @brief 处理范围请求的媒体文件。 * * @param request 请求对象。 * @param path 文件路径。 * @param Content_Type 内容类型,默认为 "-.-"。 */ void RangeMediaFile(Request request, const CTL::String& path, CTL::String Content_Type = "-.-"); /** * @brief 让浏览器重新访问另一个URL。 * * @param url 对象链接。 */ void SendRedirect(const String& url); private: /** * @brief 发送响应头信息。 * * @param Status_t HTTP 状态码。 * @param HeaderFlag HTTP 头 末尾标志。 */ void SendHeader(int Status_t, const CTL::String& HeaderFlag = "OK"); /** * @brief 通过 SSL 发送响应数据。 * * @param ssl SSL 对象。 * @param buffer 数据缓冲区。 * @param size 缓冲区大小。 * @return 如果数据发送成功返回 true,否则返回 false。 */ bool WriteSSLResponse(SSL* ssl, const char* buffer, size_t size); private: /// 文件头信息映射表。 CCMap FileHeaders; /// 自定义响应头信息映射表。 CCMap Headers; /// 客户端套接字。 CTL::Socket Socket; /// CORS 设置。 CORS* CORS_ = nullptr; /// SSL 对象。 SSL* ssl = nullptr; }; } #endif