1. 特殊协议回调函数http_cb
在《mongoose V7.4核心篇之mgr管理用户请求套接字(五)》一文的2.4
小节和《mongoose V7.4源码剖析之读取客户端数据(八)》一文的3.1
小节中,有提到过http_cb()
函数。它是mongoose服务为了实现HTTP(应用层)协议而在源码中实现的一个特殊回调函数,它在创建mongoose监听套接字以及其关联变量c
时候(更多细节请阅读《mongoose V7.4之创建监听端口 (二)》一文的第3
节内容),初始化其成员pfn
,即c->pfn = http_cb()
。
struct mg_connection *mg_http_listen(struct mg_mgr *mgr, const char *url,
mg_event_handler_t fn, void *fn_data) {
struct mg_connection *c = mg_listen(mgr, url, fn, fn_data);
// 初始化监听套接字fd关联的变量c中的成员pfn.
if (c != NULL) c->pfn = http_cb;
return c;
}
函数http_cb()
函数负责的主要任务是解析客户端下发的HTTP报文,包括其请求行、首部和实体这3
个主要部分(更多关于HTTP报文格式的知识请阅读《HTTP协议之报文格式》)。
之后便http_cb()
回调函数便将所有解析的数据存储在struct mg_http_message
数据类型所表示的变量中,这个变量能存储一个完整的HTTP请求/响应报文的所有数据内容信息。
2. 详聊 struct mg_http_message
当你熟悉了HTTP协议的规则以及报文格式表示之后,
struct mg_http_message {
struct mg_str method, uri, query, proto; // Request/response line
struct mg_http_header headers[MG_MAX_HTTP_HEADERS]; // Headers
struct mg_str body; // Body
struct mg_str head; // Request + headers
struct mg_str chunk; // Chunk for chunked encoding, or partial body
struct mg_str message; // Request + headers + body
};
3.