我正在设置一个新的HTTP服务器来执行一个长命令,并将该Shell命令的响应返回给客户端。
我运行Express的v4.17.1。运行此命令时,来自客户端的请求反复超时。 (如果有任何区别,我会使用app.use(cors())。
run(std::vector<Node> &data) {
std::unordered_set<data::value_type> var;
}
当我尝试运行此命令时,浏览器只是超时,因为这只需要很长时间。如果我不能使用102处理,那我就需要另一种解决方案。谢谢!
答案 0 :(得分:1)
我建议您不要使用HTTP102。您可以详细了解原因:https://softwareengineering.stackexchange.com/a/316211/79958
我也强烈建议使用查询参数针对您当前的逻辑。有人可以注入将在服务器上执行的命令。
答案 1 :(得分:1)
“如果我无法使用102处理...”
请勿使用102 Processing
,因为它是专为WebDAV设计的。请检查RFC2518以获取详细信息。
“我想要另一个解决方案”
一旦收到HTTP请求并启动了子进程,您就可以为200 OK
返回GET /dl
,指示:“嘿,客户端,我已经收到您的请求并成功启动了作业”:
app.get("/dl", (req, res) => {
require("child_process").exec("command -url".concat(req.query.url));
res.status(200).end();
});
然后,在子进程中,将执行结果保存在某个位置(在文件中,在DB中等),并将结果映射到查询url:
query url A --> child process result A
query url B --> child process result B
query url C --> child process failed information
在客户端,收到200 OK
请求的GET /dl
后,开始轮询-每5秒(或您需要的任何时间间隔)向服务器发送请求,前一个成功查询网址为参数,尝试在上述映射中获取其结果。会是: