一、功能分析
http请求信息模块:存储Http请求信息要素,提供简单的功能性接口
1、将成员变量设置为私有成员,便于直接访问
2、提供查询字符串,以及头部字段的单个查询和获取,插入功能
3、获取正文长度
4、判断长连接和短链接
二、成员变量
请求方法 资源路径 协议版本 请求正文 资源路径的正则提取数据 头部字段 查询字符

三、成员函数
构造函数

cpp
HttpResquest() : _version("HTTP/1.1")
{
}
插入头部字段

cpp
void SetHeader(const std::string &key, const std::string &val)
{
_headers.insert(std::make_pair(key, val));
}
是否存在头部字段

cpp
bool HasHeader(const std::string &key)
{
auto it = _headers.find(key);
if (it == _headers.end())
{
return false;
}
return true;
}
获取头部字段

cpp
std::string GetHeader(const std::string &key)
{
auto it = _headers.find(key);
if (it == _headers.end())
{
return " ";
}
return it->second;
}
插入查询字符串

cpp
void SetParam(std::string &key, std::string &val)
{
_params.insert(make_pair(key, val));
}
是否有某个指定的查询字符串

cpp
bool HasParam(std::string &key)
{
auto it = _params.find(key);
if (it == _params.end())
{
return false;
}
return true;
}
获取指定的查询字符串

cpp
std::string GetParam(std::string &key)
{
auto it = _params.find(key);
if (it == _params.end())
{
return " ";
}
return it->second;
}
获取正文长度
stol将字符串转化为整数

cpp
size_t ContentLength()
{
bool ret = HasHeader("Content_Length");
if (ret == false)
{
return 0;
}
std::string len = GetHeader("Content_Length");
return std::stol(len);
}
判断是否是短链接

cpp
bool Close()
{
if (HasHeader("Connection") && GetHeader("Connection") == "keep-alive")
{
return false;
}
return true;
}
重置

cpp
void ReSet()
{
_method.clear();
_path.clear();
_version.clear();
}
四、 功能分析
功能:存储Http响应信息要素,提供简单的功能性接口
响应信息要素:
1、响应状态码
2、头部字段
3、响应正文
4、重定向信息
功能性接口
1、为了便于成员的访问,因此将成员设置为公有成员
2、头部字段的新增,查询,获取
3、正文的设置
4、重定向设置
5、长链接短链接
五、成员变量
状态码 重定向标记 正文 重定向目标地址 响应头集合

六、成员函数
构造

cpp
HttpResponse() : _statu(202), _redirect_flag(false)
{
}
HttpResponse(int statu) : _statu(statu), _redirect_flag(false)
{
}
重置

cpp
void Reset()
{
_statu = 202;
_redirect_flag = false;
_body.clear();
_redirect_url.clear();
_headers.clear();
}
插入头部字段

cpp
void SetHeader(const std::string &key, const std::string &val)
{
_headers.insert(std::make_pair(key, val));
}
是否存在该头部字段

cpp
bool HasHeader(const std::string &key)
{
auto it = _headers.find(key);
if (it == _headers.end())
{
return false;
}
return true;
}
获取头部字段的值

cpp
std::string GetHeader(const std::string &key)
{
auto it = _headers.find(key);
if (it == _headers.end())
{
return " ";
}
return it->second;
}
设置是否是短链接

cpp
bool Close()
{
if (HasHeader("Connection") && GetHeader("Connection") == "keep-alive")
{
return false;
}
return true;
}
设置正文

cpp
void SetContent(const std::string &body, const std::string &type)
{
_body = body;
SetHeader("Content-Type", type);
}
设置重定向

cpp
void SetRediret(std::string url, int statu = 302)
{
_statu = statu;
_redirect_flag = true;
_redirect_url = url;
}
七、全部代码
cpp
class HttpResquest
{
public:
std::string _method; // 请求方法
std::string _path; // 资源路径
std::string _version; // 协议版本
std::string _body; // 请求正文
std::smatch _matches; // 资源路径的正则提取数
std::unordered_map<std::string, std::string> _headers; // 头部字段
std::unordered_map<std::string, std::string> _params; // 查询字符串
public:
HttpResquest() : _version("HTTP/1.1")
{
}
void SetHeader(const std::string &key, const std::string &val)
{
_headers.insert(std::make_pair(key, val));
}
bool HasHeader(const std::string &key)
{
auto it = _headers.find(key);
if (it == _headers.end())
{
return false;
}
return true;
}
std::string GetHeader(const std::string &key)
{
auto it = _headers.find(key);
if (it == _headers.end())
{
return " ";
}
return it->second;
}
void SetParam(std::string &key, std::string &val)
{
_params.insert(make_pair(key, val));
}
bool HasParam(std::string &key)
{
auto it = _params.find(key);
if (it == _params.end())
{
return false;
}
return true;
}
std::string GetParam(std::string &key)
{
auto it = _params.find(key);
if (it == _params.end())
{
return " ";
}
return it->second;
}
size_t ContentLength()
{
bool ret = HasHeader("Content_Length");
if (ret == false)
{
return 0;
}
std::string len = GetHeader("Content_Length");
return std::stol(len);
}
bool Close()
{
if (HasHeader("Connection") && GetHeader("Connection") == "keep-alive")
{
return false;
}
return true;
}
void ReSet()
{
_method.clear();
_path.clear();
_version.clear();
}
};
class HttpResponse
{
public:
int _statu;
bool _redirect_flag;
std::string _body;
std::string _redirect_url;
std::unordered_map<std::string, std::string> _headers;
public:
HttpResponse() : _statu(202), _redirect_flag(false)
{
}
HttpResponse(int statu) : _statu(statu), _redirect_flag(false)
{
}
void Reset()
{
_statu = 202;
_redirect_flag = false;
_body.clear();
_redirect_url.clear();
_headers.clear();
}
void SetHeader(const std::string &key, const std::string &val)
{
_headers.insert(std::make_pair(key, val));
}
bool HasHeader(const std::string &key)
{
auto it = _headers.find(key);
if (it == _headers.end())
{
return false;
}
return true;
}
std::string GetHeader(const std::string &key)
{
auto it = _headers.find(key);
if (it == _headers.end())
{
return " ";
}
return it->second;
}
bool Close()
{
if (HasHeader("Connection") && GetHeader("Connection") == "keep-alive")
{
return false;
}
return true;
}
void SetContent(const std::string &body, const std::string &type)
{
_body = body;
SetHeader("Content-Type", type);
}
void SetRediret(std::string url, int statu = 302)
{
_statu = statu;
_redirect_flag = true;
_redirect_url = url;
}
};