当前位置: 首页 > article >正文

[项目][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);
    }
}

http://www.kler.cn/a/305833.html

相关文章:

  • 深入理解BERT模型配置:BertConfig类详解
  • Vue 项目打包后环境变量丢失问题(清除缓存),区分.env和.env.*文件
  • 【前端学习指南】Vue computed 计算属性 watch 监听器
  • 以色列支付龙头遭DDoS攻击,各地超市加油站等POS机瘫痪
  • 万字长文分析函数式编程
  • Qt 实现文件监控程序
  • JVM字节码
  • MySQL通过备份恢复的方式搭建主从/重建从库
  • 删除Cookie原理
  • 【Unity】在Unity 3D中使用Spine开发2D动画
  • Java | Leetcode Java题解之第404题左叶子之和
  • SQL中的外键约束
  • 获取某宝拍立淘API接口:深度学习图像实现匹配和检索
  • WebGL系列教程八(GLSL着色器基础语法)
  • Android 13 固定systemUI的状态栏为黑底白字,不能被系统应用或者三方应用修改
  • USB组合设备——鼠标+键盘(两个接口实现)
  • OPENAIGC开发者大赛企业组AI黑马奖 | AIGC数智传媒解决方案
  • iPhone 16即将推出的5项苹果智能功能
  • Computer Vision的学习路线
  • 坐牢第三十八天(Qt)
  • Android SDK和NDK的区别
  • SSH软链接后门从入门到应急响应
  • Redis的常见问题
  • 鸿蒙交互事件开发07——手势竞争问题
  • 速通GPT:《Improving Language Understanding by Generative Pre-Training》全文解读
  • 前端开发的观察者模式