852 字
4 分钟
Tiny Webserver拆解04 Http连接与处理的头文件
这里定义了各种变量和函数,后面的http_conn.cpp中编写代码时代码量较大,记不住变量和函数干嘛的可以参考一下这个文档
#ifndef HTTPCONNECTION_H#define HTTPCONNECTION_H#include <unistd.h>#include <signal.h>#include <sys/types.h>#include <sys/epoll.h>#include <fcntl.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <assert.h>#include <sys/stat.h>#include <string.h>#include <pthread.h>#include <stdio.h>#include <stdlib.h>#include <sys/mman.h>#include <stdarg.h>#include <errno.h>#include <sys/wait.h>#include <sys/uio.h>#include <map>
#include "../lock/locker.h"#include "../CGImysql/sql_connection_pool.h"#include "../timer/lst_timer.h"#include "../log/log.h"
class http_conn {public: // 设置读取文件的名称 m_real_file 的长度 static const int FILENAME_LEN = 200; // 设置读缓冲区 m_read_buf 大小 static const int READ_BUFFER_SIZE = 2048; // 设置写缓冲区 m_write_buf 大小 static const int WRITE_BUFFER_SIZE = 1024; // 报文的请求方法,本项目只用到 GET 和 POST enum METHOD { GET = 0, POST, HEAD, PUT, DELETE, TRACE, OPTIONS, CONNECT, PATH }; // 主状态机的状态 enum CHECK_STATE { CHECK_STATE_REQUESTLINE = 0, CHECK_STATE_HEADER, CHECK_STATE_CONTENT }; // 报文解析的结果 enum HTTP_CODE { NO_REQUEST, GET_REQUEST, BAD_REQUEST, NO_RESOURCE, FORBIDDEN_REQUEST, FILE_REQUEST, INTERNAL_ERROR, CLOSED_CONNECTION }; // 从状态机的状态 enum LINE_STATUS { LINE_OK=0, LINE_BAD, LINE_OPEN };
public: http_conn() {} ~http_conn() {}
public: // 初始化套接字地址,函数内部会调用私有方法 init // ???别的参数干嘛的 void init(int sockfd, const sockaddr_in& addr, char*, int, int, string user, string passwd, string sqlname); // 关闭 http 连接 void close_conn(bool real_close = true); // ????? void process(); // 读取浏览器端发来的全部数据 bool read_once(); // 相应报文写入函数 bool write(); // ????????获取??地址的函数 sockaddr_in* get_address() { return &m_address; } // 同步线程初始化数据库读取表 void initmysql_result(connection_pool* connPool); // ???????? int timer_flag; // ??????????? int improv;
private: // 初始化方法 void init(); // 从读缓冲区 m_read_buf 读取,并处理请求报文 HTTP_CODE process_read(); // 向写缓冲区 m_write_buf 写入响应报文数据 bool process_write(HTTP_CODE ret); // 主状态机解析报文中的请求行数据 HTTP_CODE parse_request_line(char* text); // 主状态机解析报文中的请求头数据 HTTP_CODE parse_headers(char* text); // 主状态机解析报文中的请求体数据 HTTP_CODE parse_content(char* text); // 生成响应报文 HTTP_CODE do_request();
// m_start_line 是已解析的字符 // get_line 用于将指针向后偏移,指向未处理的字符 char* get_line() { return m_read_buf + m_start_line; };
// 从状态机读取一行,分析是请求报文的哪一部分 LINE_STATUS parse_line();
void unmap(); // 根据响应报文格式,生成对应 8 个部分,以下函数均由 do_request 调用 // ?????这个参数真的可以????? bool add_response(const char* format, ...);
bool add_content(const char* content);
bool add_status_line(int status, const char* title);
bool add_headers(int content_length);
bool add_content_type();
bool add_content_length(int content_length);
bool add_linger();
bool add_blank_line();
public: static int m_epollfd; static int m_user_count; MYSQL* mysql; int m_state; // 读为 0,写为 1
private: int m_sockfd; sockaddr_in m_address;
// 存储读取的请求报文数据 char m_read_buf[READ_BUFFER_SIZE]; // m_read_buf 中读入数据的最后一个字节的下一个位置 int m_read_idx; // m_read_buf 读取的位置 m_checked_idx int m_checked_idx; // m_read_buf 中已经解析的字符个数 int m_start_line;
// 存储发出的响应报文数据 char m_write_buf[WRITE_BUFFER_SIZE]; // 指示 buffer 中的长度 int m_write_idx;
// 主状态机的状态 CHECK_STATE m_check_state; // 请求方法 METHOD m_method;
// 以下为解析请求报文中对应的 6 个变量 // 存储读取文件的名称 char m_read_file[FILENAME_LEN]; char* m_url; char* m_version; char* m_host; int m_content_length; bool m_linger;
char* m_file_address; // 读取服务器上的文件地址 struct stat m_file_stat; struct iovec m_iv[2]; // io 向量机制 iovec int m_iv_count; int cgi; // 是否启用的 POST char* m_string; // 存储请求头数据 int bytes_to_send; // 剩余发送字节数 int bytes_have_send; // 已发送字节数 char* doc_root;
map<string, string> m_users; int m_TRIGMode; int m_close_log;
char sql_user[100]; char sql_passwd[100]; char sql_name[100];};#endif
Tiny Webserver拆解04 Http连接与处理的头文件
https://fuwari.cbba.top/posts/tiny-webserver拆解04-http连接与处理的头文件/