Muduo网络库实现 [十三] - HttpRequest模块

目录

设计思路 

成员设计

模块实现


设计思路 

首先我们要先知道HTTP的请求的流程是什么样子的,不然我们会学的很迷糊。对于HTTP请求如何到来以及去往哪里,我们应该很清楚的知道

HTTP请求在服务器系统中的传递流程是一个多层次的过程:

  1. 客户端发起请求 - 用户在浏览器或应用中发起HTTP请求
  2. 网络传输 - 请求通过网络传输到服务器
  3. 服务器接收 - 服务器的TCP/IP协议栈接收数据包并将其传递给操作系统
  4. 网络库接收 - 在muduo这样的网络库中,数据通过以下路径流动:
    • 操作系统的socket接口接收原始数据
    • 网络库的EventLoop检测到socket可读事件
    • TcpConnection将数据读入其内部Buffer
  5. HTTP解析 - 数据进入HTTP解析层:
    • TcpServer将连接和数据传递给HttpServer
    • HttpServer创建HttpContext对象处理每个连接
    • HttpContext从Buffer中读取数据并进行解析
    • 解析结果存储在HttpRequest对象中
  6. 应用处理 - 最终HttpRequest被传递给用户注册的回调函数进行业务逻辑处理

HttpRequest通常由HttpContext创建和填充,然后传递给处理HTTP请求的回调函数或处理器。它本质上是HTTP请求信息的容器,使服务器能够方便地访问和处理客户端的请求内容。

在整个HTTP处理流程中,HttpRequest的角色是保存从网络层解析出的HTTP请求信息,供应用层使用。

HTTP请求格式

成员设计

HTTP请求中的主要要素包括:

  1. 请求行:
    • 请求方法(GET、POST、PUT、DELETE等)
    • URL,包含:
      • 资源路径
      • 查询参数(键值对形式)
    • 协议版本(如HTTP/1.1)
  2. 请求头部:
    • 多个键值对格式的头部字段
    • 常见的如Content-Type、User-Agent、Host等
  3. 请求正文:
    • 根据Content-Length或Transfer-Encoding确定长度
    • 内容格式由Content-Type决定

首先请求行中,有请求方法,url ,协议版本,而url中又分为资源路径和参数,参数是kv的形式,所以我们需要使用一个map来保存

而请求头部中,都是一些kv格式的属性,我们也是使用一个map来保存

最后就是正文部分,正文部分是交给上层业务逻辑去处理的,我们只需要按照请求头部中的Content-Length提取出来就行了。

那么我们需要保存的就是 : 请求方法,资源路径,参数,协议版本,头部字段,正文 ,当然,由于可能会存在中间的处理过程,比如对请求行的解析,我们会使用正则表达式来进行,我们可以再存储一个 std::smatch 来保存正则提取出来的结果。

由于HttpRequest后续我们是交给 上下文模块来进行设置的,为了方便,我们就直接将成员设置为公有的了,便于直接访问。

同时,对于参数和请求头部,我们可以提供结构,用来插入kv形式的参数和请求头部,以及查询是否有某个参数或者请求头部。

再HttpRequest的头部字段中,有一个很重要的信息就是正文长度,我们可以提供一个接口用来获取正文长度。

最后再提供一个接口用于判断长短连接,长短连接后续我们会用到。

然后如果是短连接的话,我们每次接收完也需要把数据给清除了。所以也需要个接口

模块实现

代码挺简单的,跟着思路走就很容易写出来的

class HttpRequest
{
public:string _method;  //存储请求方法string _path;    //存储资源路径string _version;  //存储协议版本string _body;    //存储正文unordered_map<string, string> _headers;   //存储请求头部unordered_map<string, string> _params;  //存储查询字符串smatch _matches; //资源路径正则提取
private:bool HasHeader(const sting &key) const  //给获取报文长度函数提供的{auto it = _headers.find(key);if(it == _headers.end()){return false;}return it->second;}string GetHeader(const sting &key) const //给获取报文长度函数提供的{auto it = _headers.find(key);if(it == _headers.end()){return "";}return it->second;}public:HttpRequest():_version("HTTP/1.1"){}void clear()//清空类数据{_method.clear();_path.clear();_version("HTTP/1.1");_body.clear();_headers.clear();_params.clear();smatch matches;_matches.swap(matches);}void SetHeader(const string &key, const string &val)//添加请求头部{_headers.insert(key, val);}void SetParam(const string &key, const string &val)//添加查询字符串{_params.insert(key, val);}size_t GetLength()//获取正文长度{bool ret = HasHeader("Content-Length");if(ret == false){return 0;}string len = GetHeader("Content-Length");return stol(len);}//是否是短链接bool Close() const{if(HasHeader("Connection") == true && GetHeader("Connection") == "keep-alive");{return false;}return true;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/75594.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6. RabbitMQ 死信队列的详细操作编写

6. RabbitMQ 死信队列的详细操作编写 文章目录 6. RabbitMQ 死信队列的详细操作编写1. 死信的概念2. 消息 TTL 过期(触发死信队列)3. 队列超过队列的最大长度(触发死信队列)4. 消息被拒(触发死信队列)5. 最后&#xff1a; 1. 死信的概念 先从概念上解释上搞清楚这个定义&#…

如何使用Selenium进行自动化测试?

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 对于很多刚入门的测试新手来说&#xff0c;大家都将自动化测试作为自己职业发展的一个主要阶段。可是&#xff0c;在成为一名合格的自动化测试工程师之前&#…

洛谷题单3-P5724 【深基4.习5】求极差 最大跨度值 最大值和最小值的差-python-流程图重构

题目描述 给出 n n n 和 n n n 个整数 a i a_i ai​&#xff0c;求这 n n n 个整数中的极差是什么。极差的意思是一组数中的最大值减去最小值的差。 输入格式 第一行输入一个正整数 n n n&#xff0c;表示整数个数。 第二行输入 n n n 个整数 a 1 , a 2 … a n a_1,…

STM32智能手表——任务线程部分

RTOS和LVGL我没学过&#xff0c;但是应该能硬啃这个项目例程 ├─Application/User/Tasks # 用于存放任务线程的函数 │ ├─user_TaskInit.c # 初始化任务 │ ├─user_HardwareInitTask.c # 硬件初始化任务 │ ├─user_RunModeTasks.c…

ubuntu22.04LTS设置中文输入法

打开搜狗网址直接下载软件&#xff0c;软件下载完成后&#xff0c;会弹出安装教程说明书。 网址:搜狗输入法linux-首页搜狗输入法for linux—支持全拼、简拼、模糊音、云输入、皮肤、中英混输https://shurufa.sogou.com/linux

SQL Server数据库异常-[SqlException (0x80131904): 执行超时已过期] 操作超时问题及数据库日志已满的解决方案

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;获得2024年博客之星荣誉证书&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开发技术&#xff0c…

php8 ?-> nullsafe 操作符 使用教程

简介 PHP 8 引入了 ?->&#xff08;Nullsafe 操作符&#xff09;&#xff0c;用于简化 null 检查&#xff0c;减少繁琐的 if 语句或 isset() 代码&#xff0c;提高可读性。 ?-> Nullsafe 操作符的作用 在 PHP 7 及以下&#xff0c;访问对象的属性或方法时&#xff0…

WORD+VISIO输出PDF图片提高清晰度的方法

WORDVISIO输出PDF图片提高清晰度的方法 part 1: visio 绘图part 2: word 导出 part 1: visio 绘图 先在visio中把图片和对应的文字调整为适合插入到文章中的尺寸&#xff1b; 在visio中把所有元素进行组合&#xff1b; 把组合后的图片长和宽等比例放缩&#xff0c;如放大10倍…

重要头文件下的函数

1、<cctype> #include<cctype>加入这个头文件就可以调用以下函数&#xff1a; 1、isalpha(x) 判断x是否为字母 isalpha 2、isdigit(x) 判断x是否为数字 isdigit 3、islower(x) 判断x是否为小写字母 islower 4、isupper(x) 判断x是否为大写字母 isupper 5、isa…

基于大模型预测不稳定性心绞痛的多维度研究与应用

目录 一、引言 1.1 研究背景与意义 1.2 研究目的 1.3 国内外研究现状 二、不稳定性心绞痛概述 2.1 定义与分类 2.2 发病机制 2.3 临床表现 三、大模型技术原理与应用基础 3.1 大模型介绍 3.2 在医疗领域的应用现状 3.3 用于不稳定性心绞痛预测的可行性 四、术前预…

第一讲—函数的极限与连续(一)

思维导图 笔记 双曲正弦函数及其反函数

Mac VM 卸载 win10 安装win7系统

卸载 找到相应直接删除&#xff08;移动到废纸篓&#xff09; 可参考&#xff1a;mac如何卸载虚拟机win 下载 win7下载地址

免费送源码:Java+SSM+Android Studio 基于Android Studio游戏搜索app的设计与实现 计算机毕业设计原创定制

摘要 本文旨在探讨基于SSM框架和Android Studio的游戏搜索App的设计与实现。首先&#xff0c;我们详细介绍了SSM框架&#xff0c;这是一种经典的Java Web开发框架&#xff0c;由Spring、SpringMVC和MyBatis三个开源项目整合而成&#xff0c;为开发企业级应用提供了高效、灵活、…

网络安全的现状与防护措施

随着数字化和信息化的迅猛发展&#xff0c;互联网已成为人们日常生活、工作和学习不可或缺的一部分。然而&#xff0c;随着网络技术的普及&#xff0c;网络安全问题也日益突出。近年来&#xff0c;数据泄露、恶意软件、网络攻击等事件层出不穷&#xff0c;给企业和个人带来了巨…

android databinding使用教程

Android DataBinding 是一种可以将 UI 组件与数据源绑定的框架&#xff0c;能够减少 findViewById 的使用&#xff0c;并提高代码的可维护性。下面是 DataBinding 的完整使用教程&#xff1a; 1. 启用 DataBinding 在 build.gradle&#xff08;Module 级别&#xff09;中启用 …

python如何快速删除文件夹中的大量文件

在 Python 中&#xff0c;删除文件夹中的大量小图片文件可以通过使用 os 模块或 shutil 模块来实现。以下是一个示例代码&#xff0c;展示了如何快速删除指定文件夹中的所有文件。如果你只需要删除小图片文件&#xff0c;可以添加额外的逻辑来检查文件大小。 以下是一个示例代…

如何使用 IntelliJ IDEA 开发命令行程序(或 Swing 程序)并手动管理依赖(不使用 pom.xml)

以下是详细步骤&#xff1a; 1. 创建项目 1.1 打开 IntelliJ IDEA。 1.2 在启动界面&#xff0c;点击 Create New Project&#xff08;创建新项目&#xff09;。 1.3 选择 Java&#xff0c;然后点击 Next。 1.4 确保 Project SDK 选择了正确的 JDK 版本&#x…

FastAPI-Cache2: 高效Python缓存库

FastAPI-Cache2是一个强大而灵活的Python缓存库&#xff0c;专为提升应用性能而设计。虽然其名称暗示与FastAPI框架的紧密集成&#xff0c;但实际上它可以在任何Python项目中使用&#xff0c;为开发者提供简单而高效的缓存解决方案。 在现代应用开发中&#xff0c;性能优化至关…

android开发:zxing-android-embedded竖屏扫描功能

Android 点击按钮调用竖屏二维码扫描 提示&#xff1a;zxing-android-embedded插件已过时&#xff0c;建议更换别的。 场景&#xff1a;Home页面上有个扫描按钮&#xff0c;点击后打开摄像头完成扫描功能&#xff0c;扫描时要求竖屏。 方案&#xff1a;使用zxing-android-embe…

指令补充+样式绑定+计算属性+监听器

一、指令补充 1. 指令修饰符 1. 作用: 借助指令修饰符, 可以让指令更加强大 2. 分类: 1> 按键修饰符: 用来检测用户的按键, 配合键盘事件使用. keydown 和 keyup 语法: keydown.enter/v-on:keydown.enter 表示当enter按下的时候触发 keyup.enter/v-on:keyup.enter 表示当…