一、读取HTTP请求
浏览器与服务器建立好连接之后,会调用readEvent接口来读取从浏览器来的请求数据。
HTTP请求的结束符是"\r\n\r\n",服务器调用readEvent,通过websRead读取缓冲区(内容长度不超过2048字节)。
The webs read handler. This is the primary read event loop. It uses a state machine to track progress while parsing
the HTTP request. Note: we never block as the socket is always in non-blocking mode.
*/
static void readEvent(Webs *wp)
{
WebsBuf *rxbuf;
WebsSocket *sp;
ssize nbytes;
assert(wp);
assert(websValid(wp));
if (!websValid(wp)) {
return;
}
websNoteRequestActivity(wp);
rxbuf = &wp->rxbuf;//缓冲区的数据结构看定义,写得很清楚
if (bufRoom(rxbuf) < (ME_GOAHEAD_LIMIT_BUFFER + 1)) {
//缓冲区不够了增加缓冲区的大小
if (!bufGrow(rxbuf, ME_GOAHEAD_LIMIT_BUFFER + 1)) {
websError(wp, HTTP_CODE_INTERNAL_SERVER_ERROR, "Cannot grow rxbuf");
websPump(wp);
return;
}
}
if ((nbytes = websRead(wp, (char*) rxbuf->endp, ME_GOAHEAD_LIMIT_BUFFER)) > 0) {
//调用socketRead,读HTTP请求.rxbuf->endp是上一次的数据尾,每次读之后接上
wp->lastRead = nbytes;//一次读了多少字节
bufAdjustEnd(rxbuf, nbytes);//读了多少字节,数据的尾指针就加多少字节
bufAddNull(rxbuf);//写字符串结束符
}
if (nbytes > 0 || wp

本文主要探讨Goahead服务器如何读取和解析HTTP请求。在与浏览器建立连接后,通过readEvent接口读取不超过2048字节的请求数据,HTTP请求以'
'为结束符。接着,使用websPump函数处理不同状态机以解析HTTP请求,并通过parseIncoming函数确定请求类型,以便正确响应。
最低0.47元/天 解锁文章
3847

被折叠的 条评论
为什么被折叠?



