07.webserver源码阅读--httpXXX
00.webserver源码阅读--buffer - DavidJIAN - 博客园 (cnblogs.com)
01.webserver源码阅读--BlockQueue - DavidJIAN - 博客园 (cnblogs.com)
02.webserver源码阅读--log - DavidJIAN - 博客园 (cnblogs.com)
03.webserver源码阅读--threadPool - DavidJIAN - 博客园 (cnblogs.com)
04.webserver源码阅读--sqlConnPool - DavidJIAN - 博客园 (cnblogs.com)
05.webserver源码阅读--sqlConnRAII - DavidJIAN - 博客园 (cnblogs.com)
06.webserver源码阅读--timer - DavidJIAN - 博客园 (cnblogs.com)
HTTP
有关HTTP的基础知识:HTTP 消息 - HTTP | MDN (mozilla.org)
httpRequest
这里的类名有点迷惑,httpRequest指的是处理HTTP Request,而不是发起HTTP Request。
成员变量
-
两个枚举:PARSE_STATE、HTTP_CODE
- 分别对应解析到哪个部分以及请求报文解析结果
-
state
- 当前解析到哪个部分(请求行、请求头、请求体)
-
m_method, m_path, m_version
- 对应请求行的
请求方法、请求路径、HTTP版本
- 对应请求行的
-
m_body
- 对应请求体
-
m_header
- 对应请求报文的请求头
-
m_post_data
- 对应post请求数据(如果有的话,应该位于请求头,空行之后)
-
两个静态成员变量
DEFAULT_HTML和DEFAULT_HTML_TAG- 前者是web端默认的页面
- 后者是页面对应的tag
成员函数
-
构造函数
- 调用init函数
-
析构函数
- =default
-
init
- 初始化工作,解析状态为
REQUEST_LINE
- 初始化工作,解析状态为
-
parse
- 一个状态机
- 依次解析HTTP请求报文的三个部分:
请求行、请求头、请求体
-
parse_request_line
- 用正则表达式regex来解析请求行(方法 url 版本)
-
parse_header
- 用正则表达式regex来解析请求头,存储到m_header
- 将解析状态转为
BODY
-
parse_body
- 调用parse_post函数
- 解析状态为
FINISH
-
parse_path
- 将url访问路径解析为具体文件
-
parse_post
- 本项目中的post请求主要是用于用户登录
-
parse_form_urlencoded
-
解析post请求中用
application/x-www-form-urlencoded格式的请求数据(这些数据位于请求体),存储于m_post_data- application/x-www-form-urlencoded:将键值对的参数用&连接起来,如果有空格,将空格转换为+加号;有特殊符号,将特殊符号转换为ASCII HEX值
- %XX:表示特殊符号,用符号对应ASCII码的十六进制表示。详情见百分比编码:https://developer.mozilla.org/zh-CN/docs/Glossary/percent-encoding
-
-
user_verify
- 根据传入的username和passwd进行MySQL验证,注册或者登录
-
conver_hex
- 传入char,转为十六进制
-
path
- 返回请求url
-
method
- 返回请求方法
-
get_post
- 通过传入key,返回对应post data中的value
-
is_keep_alive
- 返回是否为长连接
httpResponse
成员变量
- m_code
- HTTP响应的状态码
- m_is_keep_alive
- 对应Keep-Alive字段和Connection字段,是否为长连接
- m_path
- 文件资源在总路径下的相对路径
- m_src_dir
- 文件资源总路径
-
mm_file
- mm_file_stat
- 文件信息结构
- SUFFIX_TYPE
- 文件后缀与Content-Type字段值的映射。如
.txt对应text/plain.
- 文件后缀与Content-Type字段值的映射。如
- CODE_STATUS
- 状态码 (status code)与状态文本 (status text)的映射。如
200对应OK.
- 状态码 (status code)与状态文本 (status text)的映射。如
- CODE_PATH
- 状态码与应返回对应页面的html文件(路径)。
成员函数
-
构造函数
- 初始化一些成员变量
-
析构函数
- 调用unmap_file函数
-
init
- 根据传入的参数初始化一些成员变量,和构造函数功能差不多
-
make_response
- 返回应答报文的主要函数。主要根据访问url,来判断访问资源是否存在或者是否为目录,若是则返回响应的4XX.html,否则返回对应资源。调用error_html\add state_line\header\content函数
-
unmap_file
- 调用munmap函数,解除文件和内存的映射关系
-
file
- 返回mm_file
-
file_len
- 返回文件大小
-
error_content
- 根据状态码(4XX)来生成错误页面的html,添加到buf
-
code
- 返回状态码
-
add_state_line
- 根据状态码(往buf)添加响应报文的状态行
-
add_header
- 根据成员变量
m_is_keep_alive(往buf)添加响应报文的头部,这里只有Connection和Keep-Alive字段
- 根据成员变量
-
add_content
- 根据访问url来打开对应文件(文件不存在或打开失败,调用error_content函数(传入错误消息,在html中展示))。调用mmap函数
(220条消息) Linux 内存映射函数 mmap()函数详解_yangle4695的博客-CSDN博客_mmap memcpy 耗时
-
error_html
- 根据状态码(4XX)获取对应的文件信息,便于后续写入
-
get_file_type
- 根据访问路径的最后一个逗号后的内容来判断访问的文件的类型
htppConn
这个类是处理HTTP连接的类,主要调用
httpRequest和httpResponse两个类来分别对请求报文解析以及构造响应报文。
成员变量
- 三个静态变量
- et
- et模式或是lt模式
- src_dir
- 资源文件目录路径
- user_cnt
- 连接数量
- et
- fd
- tcp连接的fd
- addr
- tcp连接的地址
- is_close
- 连接是否关闭
- iov_cnt和iov
- 主要用于
集中写writev
- 主要用于
- read_buf和write_buf
- 读写缓冲区
- resp和req
- httpRequest对象和httpResponse对象
成员函数
-
构造函数
- 初始化
-
析构函数
- 调用Close函数
-
init
- 根据传入的sockfd和addr来初始化socket地址成员变量
- 读写缓冲区初始化
-
read
- 从fd(tcp、http连接)读数据,et模式就一直读,读到没有数据为止,而lt模式就读一次
(220条消息) 【服务器编程】EPOLL的LT和ET模式的区别和理解_weilin.jiang的博客-CSDN博客_epoll et lt 区别 csdn
-
write
- 向fd(tcp、http连接)写数据,也是分et和lt模式,writev写,分一次写、多次写
-
Close
- 关闭连接的收尾工作:调用resp的unmap_file函数,接触内存和文件的映射
-
get_fd
- 返回fd,对应该http(tcp)连接
-
get_port
- 返回端口
-
get_ip
- 返回ip
-
get_addr
- 返回地址(sockaddr_in)
-
process
- req.parse:解析请求报文,获取连接信息
- resp.init:根据连接信息初始化
- resp.make_response(write_buf):构造响应报文
- 将write_buf的内容传到iov[0]
- 将resp中请求的文件内容传到iov[1] (如果有的话)
-
to_write_bytes
- 两个iov向量中内容的长度之和,即将要写多少字节的数据
-
is_keep_alive
- 是否为长连接

浙公网安备 33010602011771号