Distribution_Service/CC_SDK/Include/CCServlet/CCWebServlet.h

158 lines
6.2 KiB
C
Raw Normal View History

2025-11-11 17:46:19 +08:00
#ifndef CCWeb_Servlet_H
#define CCWeb_Servlet_H
#pragma once
#include <CCThreadPool.h>
#include "CCResponse.h"
#include "WebSocket/CCWebSocket.h"
2025-12-03 18:08:23 +08:00
#include "HttpSocketChannel.h"
#include "Socket/CCServerSocket.h"
2025-11-11 17:46:19 +08:00
// 定义 WebServlet 类格式的回调函数宏,用于简化成员函数回调的编写
#define CC_ServletFunClass(Fun) [this](auto && PH1, auto && PH2) { Fun(std::forward<decltype(PH1)>(PH1), std::forward<decltype(PH2)>(PH2)); }
// 定义 WebServlet 普通函数格式的回调函数宏,用于简化普通函数回调的编写
#define CC_ServletFun(Fun) Fun
namespace CTL {
struct StaticResource {
// 资源类型
String Type;
// 资源内容
CCVector<char> Content;
2025-12-03 18:08:23 +08:00
// 资源内容GZip
CCVector<char> ContentGZip;
2025-11-11 17:46:19 +08:00
// 资源名称
String Name;
// 资源路径
String Path;
};
2025-12-03 18:08:23 +08:00
struct Event_Client {
SOCKET fd{};
ByteArray Data{};
};
2025-11-11 17:46:19 +08:00
// WebServlet 类,用于处理网络请求和管理服务器状态
class WebServlet{
public:
// 使用 std::function 定义请求处理函数类型
using RequestFunc = std::function<void(Request& ,Response&)>;
private:
// 网络服务器对象
2025-12-03 18:08:23 +08:00
ServerSocket* server = nullptr;
2025-11-11 17:46:19 +08:00
// 服务器运行标志
bool ServerFlag = true;
2025-12-03 18:08:23 +08:00
EventLoop event_loop_t{};
2025-11-11 17:46:19 +08:00
// 线程池对象,用于处理并发请求
ThreadPool M_S_POOl{};
// 线程池大小配置
size_t M_Pool_Size = 128,M_Pool_Max = 1024;
// 线程池中线程的保活时间
int M_Pool_KeepAliveTime = 1000;
// 静态资源的 URL 映射
CCList<CTL::String> StaticPath;
// 静态资源内容的映射
2025-12-03 18:08:23 +08:00
CTL::Map<CTL::String,StaticResource> StaticResources;
2025-11-11 17:46:19 +08:00
// Web 信号处理函数
RequestFunc WebSignalFun;
// 请求处理函数映射
2025-12-03 18:08:23 +08:00
CTL::Map<std::string,RequestFunc> RequestFun;
2025-11-11 17:46:19 +08:00
// CORS 头对象指针,用于处理跨域请求
CORS* CORS_Header = nullptr;
// SSL 上下文对象指针,用于 HTTPS 连接
2025-12-03 18:08:23 +08:00
CTX_SSL SSL_CTX;
2025-11-11 17:46:19 +08:00
// WebSocket 对象,用于处理 WebSocket 连接
WebSocket m_WebSocket;
// WebSocket 连接标志
bool WebSocketFlag = false;
// 请求超时时间 单位/毫秒
unsigned long TimingTime = 1000;
// 设置请求头缓冲区大小
unsigned int ReadHBuff = 4096;
IPVX IPvx = IPV4;
bool source_map_ = false;
2025-12-03 18:08:23 +08:00
unsigned long CacheTime = 86400 * 7; // 浏览器缓存时间
2025-11-11 17:46:19 +08:00
time_t CacheTime_t = {};
2025-12-03 18:08:23 +08:00
bool GZipFlag = true;
2025-11-11 17:46:19 +08:00
public:
// 构造函数
WebServlet();
// 析构函数
~WebServlet();
// 初始化服务器
2025-12-03 18:08:23 +08:00
bool Init(const InetAddress &address,int Port,bool ChokeUp = true);
2025-11-11 17:46:19 +08:00
// 初始化服务器
bool Init(const String& address,int Port,bool ChokeUp = true);
// 设置 WebSocket 配置
bool SetWebSocket(const WebSocketBind& bind);
// 初始化 SSL 配置
bool InitSSL();
// 加载 SSL 证书
bool LoadSSLCertificate(const CTL::String& CertPath) const;
// 加载 SSL 私钥
bool LoadSSLKey(const CTL::String &KeyPath, const CTL::String &Passwd) const;
// 加载 SSL 客户端验证证书
bool LoadSSLVerify(const CTL::String& CA_Path) const;
// 运行服务器
int Running(bool Ws = false,bool InitStaticFlag = true);
// 停止服务器
void Stop();
// 添加静态资源路径 请填写相对路径
bool AddStaticPath(const CTL::String& Path);
// 设置 WebServlet 请求处理函数
void SetWebServlet(const CTL::String& UrlPath,const RequestFunc& RFunc);
// 设置 WebServlet 普通请求处理函数
void SetWebServletFun(RequestFunc RFunc);
// 设置 CORS 配置
void SetWebCORS(const CORS& cors);
// 获取 WebSocket 对象
WebSocket* GetWebSocket();
// 设置请求超时时间
void SetTimeout(unsigned long MS);
// 设置接收数据头缓冲区大小
void SetReadHeaderBufferSize(unsigned int Size);
// 设置线程池参数
void SetThreadPool(size_t Size,size_t Max,int KeepAliveTime);
// 设置IP类型 必须在Init之前设置
void SetIPType(IPVX IPvx);
// 初始化静态资源
void InitStatic();
// 设置最大文件上传数量
static void SetMaxConcurrentFileUploads(int Num);
// 设置资源调试
void SetSourceMap(bool flag);
// 设置静态资源缓存时间
void SetCacheTime(unsigned long CacheTime);
2025-12-03 18:08:23 +08:00
// 静态资源GZip
void SetGZipFlag(bool Flag);
2025-11-11 17:46:19 +08:00
private:
// 打印消息
2025-12-03 18:08:23 +08:00
static void MessagePrint(const CTL::String& str);
2025-11-11 17:46:19 +08:00
// 检查客户端权限
2025-12-03 18:08:23 +08:00
bool Permission(const HttpSocketChannel* client_channel) const;
2025-11-11 17:46:19 +08:00
// 接受客户端连接
void AcceptingClient();
// 处理客户端请求
2025-12-03 18:08:23 +08:00
void ProcessingClientRequests(ClientSocket* client);
2025-11-11 17:46:19 +08:00
// 处理数据类型
2025-12-03 18:08:23 +08:00
int ProcessingDataType(HttpSocketChannel* client_channel,Request& request);
2025-11-11 17:46:19 +08:00
// 处理请求
2025-12-03 18:08:23 +08:00
void HandleRequest(HttpSocketChannel* client_channel,Request& request);
2025-11-11 17:46:19 +08:00
// 处理路径
CTL::String ProcessPath(const CTL::String& path);
// 初始化目录静态资源
void DirInitStatic(const CTL::String& Path);
// 检查路径是否包含映射后缀
bool hasMapSuffix(const std::string& path);
// 移除路径中的映射后缀
std::string removeMapSuffix(const std::string& path);
// 获取 Application/form-data 类型的数据
2025-12-03 18:08:23 +08:00
static CTL::String GetApp_Form_Data(const HttpSocketChannel* client_channel,Request& HTTPRequests);
2025-11-11 17:46:19 +08:00
// 获取 Multipart/form-data 类型的数据信息
2025-12-03 18:08:23 +08:00
CCMap<CTL::String,CTL::String> GetMultipart_Form_DataInfo(const HttpSocketChannel* client_channel,CTL::String& RecvMessage);
void ErrorHandling(HttpSocketChannel* client_channel,Request& request) const;
static String FormatRequest(const String& str);
2025-11-11 17:46:19 +08:00
};
}
#endif