Distribution_Service/CC_SDK/Include/CCServlet/CCRequest.h

193 lines
5.2 KiB
C
Raw Normal View History

2025-11-11 17:46:19 +08:00
#ifndef CCWeb_Request_H
#define CCWeb_Request_H
#pragma once
#include "CORS.h"
#include "CCNetwork.h"
#include "CCHttpResolver.h"
#include "CCEpoll.h"
#include "CC.h"
#include "CCThread.h"
#include "CCFile.h"
#include "CCObject.h"
#include <CCFIleInStream.h>
#include <CCFileOutStream.h>
#include "CCJSONObject.h"
#include "openssl/ssl.h"
#include "openssl/err.h"
// 定义请求和响应的缓冲区大小以及文件缓冲区的最大值
#define CC_R_BUFFER_SIZE 1
#define CC_S_BUFFER_SIZE 1024
#define File_Buffer_Max 4096
namespace CTL {
// 请求数据结构体用于存储HTTP请求的相关信息
struct RequestData_t{
CTL::String RawData; // 原始请求数据
CTL::String Method; // HTTP方法GET, POST等
CTL::String Path; // 请求路径
CTL::String Version; // HTTP版本
CCMap<CTL::String, CTL::String> Headers; // 请求头信息
CCMap<StdString, StdString> Params; // 请求参数
CTL::String Body; // 请求体内容
CCVector<char> Buffer; // 数据缓冲区
CTL::String Buf; // 临时缓冲区
CCMap<CTL::String, CTL::String> FileHeaders; // 文件头信息
};
/**
* HTTP请求
*/
class Request{
private:
using ReceiveFileCallback = std::function<bool(const CCVector<char>&, size_t)>;
inline static CCMutex File_Mutex_T;
inline static std::atomic_uint8_t IsRun = 0;
inline static int MAX_UPLOAD_FILE_CONCURRENT = 10;
// 客户端套接字
CTL::Socket Client;
// CORS对象指针
CORS* cors = nullptr;
// SSL对象指针
SSL* ssl = nullptr;
// int File_Buffer_Max = 4096;
bool IsFileUploadSize = true;
public:
/**
*
*/
Request() = default;
/**
*
*/
RequestData_t RequestData;
/**
*
* @param key
* @param Body Body中获取参数
* @return
*/
CTL::String GetParameter(const CTL::String& key,bool Body = false);
/**
*
* @param key
* @return
*/
CTL::String GetFileInfo(const CTL::String& key);
/**
*
* @param key
* @return
*/
CTL::String GetHeader(const CTL::String& key);
/**
* JSON对象
* @return JSON对象
*/
CTL::JSONObject GetJson() const;
/**
*
* @param Path
* @return
*/
bool GetMediaFiles(const CTL::String& Path);
/**
*
* @param callback --> bool --> CCVector<char> --> size_t
* @return
*/
bool GetMediaFiles(const ReceiveFileCallback& callback);
/**
*
* @param socket
* @param cors CORS对象指针
* @param ssl SSL对象指针nullptr
*/
void Init(CTL::Socket& socket, CORS* cors, SSL* ssl = nullptr);
/**
*
* @param filePath
* @return
*/
static CTL::String GetFileSuffix(const CTL::String& filePath);
/**
*
* @param str
* @return
*/
static CTL::String GetFileType(const CTL::String& str);
/**
*
* @param path
* @return
*/
static unsigned int GetFileSize(const CTL::String& path);
/**
* URL解码
* @param in
* @return
*/
static CTL::String URL_Decode(const CTL::String& in);
/**
*
* @param in
* @param map
* @return
*/
static CTL::String GetFileDateHeader(CTL::String& in, std::map<CTL::String, CTL::String>& map);
/**
*
* @param input
* @param key
* @param value
*/
static void GetFormData(CTL::String& input, CTL::String& key, CTL::String& value);
/**
*
* @param input
* @return
*/
static CCMap<CTL::String, CTL::String> parseKeyValuePairs(const CTL::String& input);
/**
*
* @param Num
*/
static void SetMaxConcurrentFileUploads(int Num);
/**
*
* @param Size
*/
void SetFileUploadSize(int Size);
private:
static void FileWriting(const CTL::String& path,const CCVector<char>& buffer, size_t size);
};
/**
*
* @param key
* @return
*/
inline CTL::String Request::GetHeader(const CTL::String& key) {
return RequestData.Headers[key];
}
}
#endif