goahead源码解析(二) 读取HTTP请求

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、读取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
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

同人与野

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值