仿muduo库实现高并发---请求HttpRequest模块 响应HttpResponse模块

一、功能分析

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;
    }
};
相关推荐
2401_8920709816 小时前
【Linux C++ 日志系统实战】LogFile 日志文件管理核心:滚动策略、线程安全与方法全解析
linux·c++·日志系统·日志滚动
yuzhuanhei17 小时前
Visual Studio 配置C++opencv
c++·学习·visual studio
lwx91485217 小时前
Linux-Shell算术运算
linux·运维·服务器
不爱吃炸鸡柳17 小时前
C++ STL list 超详细解析:从接口使用到模拟实现
开发语言·c++·list
十五年专注C++开发17 小时前
RTTR: 一款MIT 协议开源的 C++ 运行时反射库
开发语言·c++·反射
‎ദ്ദിᵔ.˛.ᵔ₎17 小时前
STL 栈 队列
开发语言·c++
此刻觐神18 小时前
IMX6ULL开发板学习-01(Linux文件目录和目录相关命令)
linux·服务器·学习
2401_8920709818 小时前
【Linux C++ 日志系统实战】高性能文件写入 AppendFile 核心方法解析
linux·c++·日志系统·文件写对象
郭涤生18 小时前
STL vector 扩容机制与自定义内存分配器设计分析
c++·算法
航Hang*18 小时前
第3章:Linux系统安全管理——第2节:部署代理服务
linux·运维·服务器·开发语言·笔记·系统安全