181 lines
5.6 KiB
C
181 lines
5.6 KiB
C
|
|
#ifndef CCWeb_Response_H
|
|||
|
|
#define CCWeb_Response_H
|
|||
|
|
#pragma once
|
|||
|
|
|
|||
|
|
// 检查宏定义
|
|||
|
|
#ifdef Status
|
|||
|
|
#undef Status
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#include "CCRequest.h"
|
|||
|
|
#include <openssl/ssl.h>
|
|||
|
|
#include <openssl/err.h>
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @namespace CTL
|
|||
|
|
* @brief 该命名空间包含处理 Web 请求和响应的类和函数。
|
|||
|
|
*/
|
|||
|
|
namespace CTL {
|
|||
|
|
/**
|
|||
|
|
* @class Response
|
|||
|
|
* @brief 该类用于处理 HTTP 响应,包括向客户端发送文件、资源和自定义内容。
|
|||
|
|
*/
|
|||
|
|
class Response{
|
|||
|
|
inline static CCMutex Response_Mutex;
|
|||
|
|
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<char>& 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<char>& 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);
|
|||
|
|
/**
|
|||
|
|
* @brief 优化的资源下载
|
|||
|
|
*
|
|||
|
|
* @param Path 路径
|
|||
|
|
* @param SendBufferSize 发送缓冲区大小,默认为 64 * 1024 字节。
|
|||
|
|
*/
|
|||
|
|
bool ResourceDownloadOptimized(const CTL::String &Path, const int SendBufferSize = 64 * 1024);
|
|||
|
|
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。
|
|||
|
|
*/
|
|||
|
|
int WriteSSLResponse(SSL* ssl, const char* buffer, size_t size);
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
/// 文件头信息映射表。
|
|||
|
|
CCMap<CTL::String, CTL::String> FileHeaders;
|
|||
|
|
|
|||
|
|
/// 自定义响应头信息映射表。
|
|||
|
|
CCMap<CTL::String, CTL::String> Headers;
|
|||
|
|
|
|||
|
|
/// 客户端套接字。
|
|||
|
|
CTL::Socket Socket;
|
|||
|
|
|
|||
|
|
/// CORS 设置。
|
|||
|
|
CORS* CORS_ = nullptr;
|
|||
|
|
|
|||
|
|
/// SSL 对象。
|
|||
|
|
SSL* ssl = nullptr;
|
|||
|
|
|
|||
|
|
bool m_status = false;
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
#endif
|