[项目][WebServer][解析错误处理]详细讲解

  • 可为每种情况都确实对应一个状态码,当发生错误时,跳转到对应的html页面即可
  • 但是为了代码的复用性,可以将所有的错误情况都归置处理
#define SEP ": "
#define LINE_END "\r\n"
#define WEB_ROOT  "wwwroot"
#define HOME_PAGE "index.html"
#define HTTP_VERSION "HTTP/1.0"
#define PAGE_404 "404.html"

#define OK 200
#define BAD_REQUEST 400
#define NOT_FOUND 404
#define SERVER_ERROR 500

void BuildResponseHelper()
{
    // 此处status_line是干净的,没有内容的
    // 构建状态行
    _response.status_line += HTTP_VERSION;
    _response.status_line += " ";
    _response.status_line += std::to_string(_response.status_code);
    _response.status_line += " ";
    _response.status_line += Util::Code2Desc(_response.status_code);
    _response.status_line += LINE_END;

    // 构建响应正文,可能包括响应报头
    std::string path = WEB_ROOT;
    path += '/';

    switch (_response.status_code)
    {
        case OK:
            BuildOKResponse();
            break;
        case NOT_FOUND:
            path += PAGE_404;
            HandlerError(path);
            break;
        case BAD_REQUEST:  // 暂时先404处理,后面有需要再改
            path += PAGE_404;
            HandlerError(path);
            break;
        case SERVER_ERROR:
            path += PAGE_404;
            HandlerError(path);
            break;
        default:
            break;
    }
}

// 总不能为每一种错误都单独写一个处理函数吧?
// 将所有错误情况归置处理
void HandlerError(std::string page)
{
    // ProcessCgi()中也可能出错,所以此时将cgi置false
    // 这样发送效应的时候就会按非cgi模式发送
    _request.cgi = false;
    // 给用户返回对应的错误页面
    _response.fd = open(page.c_str(), 0, O_RDONLY);
    if (_response.fd > 0)
    {
        struct stat st;
        stat(page.c_str(), &st);
        _response.fSize = st.st_size; // 重置大小,否则send时按正常请求的网页大小发

        std::string line = "Content-Type: text/html";
        line += LINE_END;
        _response.response_header.push_back(line);

        line = "Content-Length: ";
        line += std::to_string(st.st_size);
        line += LINE_END;
        _response.response_header.push_back(line);
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

DieSnowK

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

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

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

打赏作者

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

抵扣说明:

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

余额充值