[项目][WebServer][CGI Task]详细讲授

[复制链接]
发表于 2026-1-17 10:52:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

0.CGI步伐紧张干什么?



  • CGI数据处理处罚紧张由外部CGI步伐负责,HttpServer只负责将拿到的参数交给CGI步伐

    • 即:CGI步伐既必要数据处理处罚又必要使命处理处罚,末了将结果转达回HttpServer

  • 本质上就是给一个某个功能的软件,套上了一层壳

    • 分析HttpServer转达的参数
    • 实现某个功能
    • 将结果转达回HttpServer


1.数据处理处罚



  • 数据处理处罚,紧张体现在分析参数
  • 此处举个简单的例子
  1. bool GetQuery(std::string& out)
  2. {
  3.     std::string method = getenv("METHOD");
  4.     bool ret = false;
  5.     if (method == "GET")
  6.     {
  7.         out = getenv("ARG");
  8.         ret = true;
  9.     }
  10.     else if (method == "POST")
  11.     {
  12.         // CGI如何得知需要从标准输入读取多少字节呢?
  13.         int content_length = atoi(getenv("CLENGTH"));
  14.         char ch = 'K';
  15.         while (content_length--)
  16.         {
  17.             read(0, &ch, 1);
  18.             out.push_back(ch);
  19.         }
  20.         ret = true;
  21.     }
  22.     else
  23.     {
  24.         // Do Nothing
  25.     }
  26.     return ret;
  27. }
  28. void CutString(const std::string& in, std::string& out1, std::string& out2, const std::string sep)
  29. {
  30.     auto pos = in.find(sep);
  31.     if(pos != std::string::npos)
  32.     {
  33.         out1 = in.substr(0, pos);
  34.         out2 = in.substr(pos + sep.size());
  35.     }
  36. }
复制代码

2.使命处理处罚



  • 将分析出来的参数,用于使命处理处罚,处理处罚什么使命,就必要看详细场景,写详细代码了
  • 此处以一个浅易盘算器为例
  1. int main()
  2. {
  3.     // 此时子进程标准输出已经重定向,想看打印只能从标准错误输出 #27 // TODO
  4.     std::string queryStr;
  5.     GetQuery(queryStr);
  6.     // Test Code:x=100&y=200
  7.     std::string arg1, arg2;
  8.     CutString(queryStr, arg1, arg2, "&");
  9.     std::string key1, value1, key2, value2;
  10.     CutString(arg1, key1, value1, "=");
  11.     CutString(arg2, key2, value2, "=");
  12.     // 1 -> 数据给父进程
  13.     std::cout << key1 << ":" << value1 << endl;
  14.     std::cout << key2 << ":" << value2 << endl;
  15.     // 2 -> DEBUG,输出到命令行
  16.     std::cerr << "CGI: " << key1 << ":" << value1 << endl;
  17.     std::cerr << "CGI: " << key2 << ":" << value2 << endl;
  18.     int x = atoi(value1.c_str());
  19.     int y = atoi(value2.c_str());
  20.     // 可能想进行某种计算(搜索、登陆等),想进行某种存储(注册)
  21.     std::cout << "<html>";
  22.     std::cout << "<head><meta charset="utf-8"></head>";
  23.     std::cout << "<body>";
  24.     std::cout << "<h3> " << value1 << " + " << value2 << " = " << x + y << "</h3>";
  25.     std::cout << "<h3> " << value1 << " - " << value2 << " = " << x - y << "</h3>";
  26.     std::cout << "<h3> " << value1 << " * " << value2 << " = " << x * y << "</h3>";
  27.     std::cout << "<h3> " << value1 << " / " << value2 << " = " << x / y << "</h3>";
  28.     std::cout << "</body>";
  29.     std::cout << "</html>";
  30.     return 0;
  31. }
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表