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_HTMLDEFAULT_HTML_TAG

    • 前者是web端默认的页面
    • 后者是页面对应的tag

成员函数

  • 构造函数

    • 调用init函数
  • 析构函数

    • =default
  • init

    • 初始化工作,解析状态为REQUEST_LINE
  • parse

    • 一个状态机
    • 依次解析HTTP请求报文的三个部分:请求行、请求头、请求体

    (220条消息) 状态机编程_貌似搞手的博客-CSDN博客_开关门状态机编程

  • 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.
  • CODE_STATUS
    • 状态码 (status code)与状态文本 (status text)的映射。如200对应OK.
  • 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连接的类,主要调用httpRequesthttpResponse两个类来分别对请求报文解析以及构造响应报文。

成员变量

  • 三个静态变量
    • et
      • et模式或是lt模式
    • src_dir
      • 资源文件目录路径
    • user_cnt
      • 连接数量
  • 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

    (220条消息) ET和LT的原理和区别_ptgood的博客-CSDN博客_et和lt

  • 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

    • 是否为长连接
posted @ 2023-01-08 16:33  DavidJIAN  阅读(57)  评论(0)    收藏  举报