mongoose httpserver webcommand

2024-02-25 17:28

本文主要是介绍mongoose httpserver webcommand,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

说明

在mongoose http server的基础上允许在URL栏输入command,返回输出结果
eg:
localhost:8000/command: ls

其中/command:为关键字代表之后的为要执行的命令

main_webcommand.c

// Copyright (c) 2020 Cesanta Software Limited
// All rights reserved#include <signal.h>
#include "mongoose.h"static int s_debug_level = MG_LL_INFO;
static const char *s_root_dir = ".";
static const char *s_listening_address = "http://0.0.0.0:8000";
static const char *s_enable_hexdump = "no";
static const char *s_ssi_pattern = "#.html";
static const char *s_upload_dir = NULL;  // File uploads disabled by default// Handle interrupts, like Ctrl-C
static int s_signo;
static void signal_handler(int signo) {s_signo = signo;
}// Event handler for the listening connection.
// Simply serve static files from `s_root_dir`
static void cb(struct mg_connection *c, int ev, void *ev_data) {if (ev == MG_EV_HTTP_MSG) {struct mg_http_message *hm = ev_data, send_hm; memset(&send_hm, 0, sizeof(send_hm));if (mg_match(hm->uri, mg_str("/upload"), NULL)) {// Serve file uploadif (s_upload_dir == NULL) {mg_http_reply(c, 403, "", "Denied: file upload directory not set\n");} else {struct mg_http_part part;size_t pos = 0, total_bytes = 0, num_files = 0;while ((pos = mg_http_next_multipart(hm->body, pos, &part)) > 0) {char path[MG_PATH_MAX];MG_INFO(("Chunk name: [%.*s] filename: [%.*s] length: %lu bytes",part.name.len, part.name.ptr, part.filename.len,part.filename.ptr, part.body.len));mg_snprintf(path, sizeof(path), "%s/%.*s", s_upload_dir,part.filename.len, part.filename.ptr);if (mg_path_is_sane(path)) {mg_file_write(&mg_fs_posix, path, part.body.ptr, part.body.len);total_bytes += part.body.len;num_files++;} else {MG_ERROR(("Rejecting dangerous path %s", path));}}mg_http_reply(c, 200, "", "Uploaded %lu files, %lu bytes\n", num_files,total_bytes);}} else {// Serve web root directorystruct mg_http_serve_opts opts = {0};opts.root_dir = s_root_dir;opts.ssi_pattern = s_ssi_pattern;if (hm->uri.len > 9 && strncmp("/command:", hm->uri.ptr, 9) == 0){#define URI_SIZE 256char command[URI_SIZE] = {'\0'};mg_url_decode(hm->uri.ptr+9, hm->uri.len-9, command, URI_SIZE, 0);#undef URI_SIZEFILE* o_cmd = popen(command, "r");if (!o_cmd){MG_ERROR(("exec command failed"));mg_http_reply(c, 500, "", "");goto end;}// #define BUFSIZ 10char* out_buf = calloc(1 , BUFSIZ);if (!out_buf){MG_ERROR(("mem failed"));mg_http_reply(c, 503, "", "");goto end;}int n_read = fread(out_buf, 1, BUFSIZ-1, o_cmd);int content_len = 0;if (out_buf[0] != '\0') {mg_http_reply(c, 200, "", "%s", out_buf);content_len += n_read;} else {mg_http_reply(c, 200, "", "you command has no output or command error");}while (!feof(o_cmd)){n_read = fread(out_buf, 1, BUFSIZ-1, o_cmd);out_buf[n_read] = 0;mg_http_write_chunk(c, out_buf, n_read);content_len += n_read;}if (content_len){char cont_len_str[11] = {0};snprintf(cont_len_str, 10, "%d", content_len);mg_http_parse((const char*)c->send.buf, c->send.len, &send_hm);struct mg_str* cl = mg_http_get_header(&send_hm, "Content-Length");memcpy((void*)(cl->ptr), cont_len_str, strlen(cont_len_str));}free(out_buf);end:  // that's okpclose(o_cmd);}else{mg_http_serve_dir(c, hm, &opts);}}// Log requestMG_INFO(("%.*s %.*s %lu -> %.*s %lu", hm->method.len, hm->method.ptr,hm->uri.len, hm->uri.ptr, hm->body.len, 3, c->send.buf + 9,c->send.len));}
}static void usage(const char *prog) {fprintf(stderr,"Mongoose v.%s\n""Usage: %s OPTIONS\n""  -H yes|no - enable traffic hexdump, default: '%s'\n""  -S PAT    - SSI filename pattern, default: '%s'\n""  -d DIR    - directory to serve, default: '%s'\n""  -l ADDR   - listening address, default: '%s'\n""  -u DIR    - file upload directory, default: unset\n""  -v LEVEL  - debug level, from 0 to 4, default: %d\n",MG_VERSION, prog, s_enable_hexdump, s_ssi_pattern, s_root_dir,s_listening_address, s_debug_level);exit(EXIT_FAILURE);
}int main(int argc, char *argv[]) {char path[MG_PATH_MAX] = ".";struct mg_mgr mgr;struct mg_connection *c;int i;// Parse command-line flagsfor (i = 1; i < argc; i++) {if (strcmp(argv[i], "-d") == 0) {s_root_dir = argv[++i];} else if (strcmp(argv[i], "-H") == 0) {s_enable_hexdump = argv[++i];} else if (strcmp(argv[i], "-S") == 0) {s_ssi_pattern = argv[++i];} else if (strcmp(argv[i], "-l") == 0) {s_listening_address = argv[++i];} else if (strcmp(argv[i], "-u") == 0) {s_upload_dir = argv[++i];} else if (strcmp(argv[i], "-v") == 0) {s_debug_level = atoi(argv[++i]);} else {usage(argv[0]);}}// Root directory must not contain double dots. Make it absolute// Do the conversion only if the root dir spec does not contain overridesif (strchr(s_root_dir, ',') == NULL) {realpath(s_root_dir, path);s_root_dir = path;}// Initialise stuffsignal(SIGINT, signal_handler);signal(SIGTERM, signal_handler);mg_log_set(s_debug_level);mg_mgr_init(&mgr);if ((c = mg_http_listen(&mgr, s_listening_address, cb, &mgr)) == NULL) {MG_ERROR(("Cannot listen on %s. Use http://ADDR:PORT or :PORT",s_listening_address));exit(EXIT_FAILURE);}if (mg_casecmp(s_enable_hexdump, "yes") == 0) c->is_hexdumping = 1;// Start infinite event loopMG_INFO(("Mongoose version : v%s", MG_VERSION));MG_INFO(("Listening on     : %s", s_listening_address));MG_INFO(("Web root         : [%s]", s_root_dir));MG_INFO(("Upload dir       : [%s]", s_upload_dir ? s_upload_dir : "unset"));while (s_signo == 0) mg_mgr_poll(&mgr, 1000);mg_mgr_free(&mgr);MG_INFO(("Exiting on signal %d", s_signo));return 0;
}

参考链接:

https://github.com/cesanta/mongoose/blob/master/examples/http-server/main.c

这篇关于mongoose httpserver webcommand的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/746175

相关文章

win7 安装mongoose

1.下载mongodb,解压 2.新建路径,如D:\mongodb,将解压出来的bin目录复制到该目录下 3.在D:\mongodb目录下在新建data目录,在data目录下新建两个目录:db和log。 4.打开命令行,进入目录D:\mongodb\bin;输入mongod.exe --dbpath D:/mongodb/data/db,   可能会提示“waiting for

[js高手之路]Node.js jade mongodb mongoose实现爬虫分离入库与生成静态文件

接着这篇文章[js高手之路]Node.js jade抓取博客所有文章生成静态html文件继续,在这篇文章中实现了采集与静态文件的生成,在实际的采集项目中, 应该是先入库再选择性的生成静态文件。 那么我选择的数据库是mongodb,为什么用这个数据库,因为这个数据库是基于集合,数据的操作基本是json,与dom模块cheerio具有非常大的亲和力,cheerio处理过滤出来的数据,可以直接插入mo

Linux网络-HttpServer的实现

文章目录 前言一、请求报文的解析URL的解析 二、响应报文的发送Content-LenthConten-TypeCookie和Set-CookieCookie的风险 三、尝试发送一个HTML网页404网页Location 重定向 四、浏览器的多次请求行为总结 前言 之前我们简单理解了一下Http协议,本章我们将在LInux下使用Socket编程自主完成一个HttpServe

Mongoose学习笔记

重点记录 关键词 .lean()使返回的数据可操作{new: true}返回更新后的数据 基本操作 (详见 #a2) var Promise = require('bluebird')var mongoose = Promise.promisifyAll(require('mongoose'))// (详见 #b2)// 连接数据库mongoose.connect('127.0.0.1

最新Swoole实战之手撸HttpServer框架课程笔记依赖注入/控制反转代码

<?phprequire_once dirname(dirname(__FILE__)) . "/vendor/autoload.php";class MyDB{private $db;//这里可能是pdo 可能是别的,仅仅为了演示public function __construct($connInfo){//略}public function queryForRows($sql){retu

mongoose的基本操作(二)

1.find查询: obj.find(查询条件,callback);Model.find({},function(error,docs){//若没有向find传递参数,默认的是显示所有文档});Model.find({ "age": 28 }, function (error, docs) {if(error){console.log("error :" + error);}else{conso

mongoose的基本操作(一)

MongoDB是一个开源的NoSQL数据库,相比MySQL那样的关系型数据库,它更显得轻巧、灵活,非常适合在数据规模很大、事务性不强的场合下使用。同时它也是一个对象数据库,没有表、行等概念,也没有固定的模式和结构,所有的数据以文档的形式存储(文档,就是一个关联数组式的对象,它的内部由属性组成,一个属性对应的值可能是一个数、字符串、日期、数组,甚至是一个嵌套的文档。),数据格式就是JSON。介绍了M

【前端29_Mongo】芒果数据库使用及常用操作、Mongoose 对数据的增删改查

文章目录 非关系性数据库:MongoMongo介绍举个栗子:教学常用操作连接数据库查看所有数据库切换数据库展示数据库中的集合展示集合中的所有文档删除集合中的所有文档 Mongoose 插件建立文档结构 Schema操作添加数据删除数据查数据修改数据 非关系性数据库:Mongo Mongo 介绍 是一种非关系性数据库,不像MySQL那样有很多条条框框的约束,想怎么存就怎

Node.js -- mongoose

文章目录 1. 介绍2. mongoose 连接数据库3. 插入文件4. 字段类型5. 字段值验证6. 文档处理6.1 删除文档6.2 更新文档6.3 读取文档 7. 条件控制8. 个性化读取9. 代码模块化 1. 介绍 Mongoose是一个对象文档模型库,官网http://www.mongoosejs.net/ 方便使用代码操作mongodb数据库 mangoose 本身是

apollo/server express,mongoose,resolver chains

apollo/server Get started with Apollo Server - Apollo GraphQL Docs mongoose Mongoose 5.0 中文文档 index2.ts import { ApolloServer } from '@apollo/server';import { expressMiddleware } from '@apollo/ser