一、读取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