• 1.15.C++项目:仿muduo库实现并发服务器之HttpRequest和HttpResponse模块的设计


    一、HttpRequest模块

    在这里插入图片描述

    二、HttpResponse模块

    在这里插入图片描述

    三、实现思想

    (一)功能

    • HttpRequest模块
      存储HTTP请求信息
      接收到一个数据,按照HTTP请求格式进行解析,得到各个关键要素放到Request中
    • HttpResponse模块
      存储HTTP响应信息
      进行业务处理的同时,让使用者向Response中填充响应要素,完毕后,将其组织成HTTP响应格式的数据,发给客户端。

    (二)意义

    • HttpRequest模块
      让HTTP请求的分析更加简单
    • HttpResponse模块
      让HTTP响应的过程变得简单

    四、代码

    • HttpRequest模块
    class HttpRequest {
        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:
            HttpRequest():_version("HTTP/1.1") {}
            void ReSet() {
                _method.clear();
                _path.clear();
                _version = "HTTP/1.1";
                _body.clear();
                std::smatch match;
                _matches.swap(match);
                _headers.clear();
                _params.clear();
            }
            //插入头部字段
            void SetHeader(const std::string &key, const std::string &val) {
                _headers.insert(std::make_pair(key, val));
            }
            //判断是否存在指定头部字段
            bool HasHeader(const std::string &key) const {
                auto it = _headers.find(key);
                if (it == _headers.end()) {
                    return false;
                }
                return true;
            }
            //获取指定头部字段的值
            std::string GetHeader(const std::string &key) const {
                auto it = _headers.find(key);
                if (it == _headers.end()) {
                    return "";
                }
                return it->second;
            }
            //插入查询字符串
            void SetParam(const std::string &key, const std::string &val) {
                _params.insert(std::make_pair(key, val));
            }
            //判断是否有某个指定的查询字符串
            bool HasParam(const std::string &key) const {
                auto it = _params.find(key);
                if (it == _params.end()) {
                    return false;
                }
                return true;
            }
            //获取指定的查询字符串
            std::string GetParam(const std::string &key) const {
                auto it = _params.find(key);
                if (it == _params.end()) {
                    return "";
                }
                return it->second;
            }
            //获取正文长度
            size_t ContentLength() const {
                // Content-Length: 1234\r\n
                bool ret = HasHeader("Content-Length");
                if (ret == false) {
                    return 0;
                }
                std::string clen = GetHeader("Content-Length");
                return std::stol(clen);
            }
            //判断是否是短链接
            bool Close() const {
                // 没有Connection字段,或者有Connection但是值是close,则都是短链接,否则就是长连接
                if (HasHeader("Connection") == true && GetHeader("Connection") == "keep-alive") {
                    return false;
                }
                return true;
            }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • HttpResponse模块
    
    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():_redirect_flag(false), _statu(200) {}
            HttpResponse(int statu):_redirect_flag(false), _statu(statu) {} 
            void ReSet() {
                _statu = 200;
                _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;
            }
            void SetContent(const std::string &body,  const std::string &type = "text/html") {
                _body = body;
                SetHeader("Content-Type", type);
            }
            void SetRedirect(const std::string &url, int statu = 302) {
                _statu = statu;
                _redirect_flag = true;
                _redirect_url = url;
            }
            //判断是否是短链接
            bool Close() {
                // 没有Connection字段,或者有Connection但是值是close,则都是短链接,否则就是长连接
                if (HasHeader("Connection") == true && GetHeader("Connection") == "keep-alive") {
                    return false;
                }
                return true;
            }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
  • 相关阅读:
    期货开户云流程和注意事项
    奇瑞新能源小蚂蚁,一款实用好看的居家小车
    Mall4cloud 微服务商城系统 2.0 发布
    微积分入门书籍(一)
    建设企业运维监控的三大阶段
    nginx 中location和proxy_pass后面跟“/”组合后产生访问情况
    2022年史上最全Java面试题:数据结构+算法+JVM+线程+finalize+GC
    2023 年诺贝尔物理学奖-阿秒光谱学
    有符号数四舍五入的verilog实现
    Calendar日历小程序
  • 原文地址:https://blog.csdn.net/weixin_54447296/article/details/133875777