restful项目中怎么引入cesantamongoose

    技术2022-07-11  111

    项目地址

    https://github.com/cesanta/mongoose

    使用的编辑器

    CLion

    项目一

    新建项目umtitled,项目目录如下: 其中mongoose.cpp,和mongoose.h都是我从https://github.com/cesanta/mongoose扒下来的。基本上引入这两个就行了

    内容分别为:

    mongoose.cpp【部分】

    /* * Copyright (c) 2004-2013 Sergey Lyubka * Copyright (c) 2013-2020 Cesanta Software Limited * All rights reserved * * This software is dual-licensed: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. For the terms of this * license, see <http://www.gnu.org/licenses/>. * * You are free to use this software under the terms of the GNU General * Public License, but WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * Alternatively, you can license this software under a commercial * license, as set out in <https://www.cesanta.com/license>. */ #include "../include/mongoose.h" #ifdef MG_MODULE_LINES #line 1 "mongoose/src/mg_internal.h" #endif #ifndef CS_MONGOOSE_SRC_INTERNAL_H_ #define CS_MONGOOSE_SRC_INTERNAL_H_ /* Amalgamated: #include "common/mg_mem.h" */ #ifndef MBUF_REALLOC #define MBUF_REALLOC MG_REALLOC #endif #ifndef MBUF_FREE #define MBUF_FREE MG_FREE #endif #define MG_SET_PTRPTR(_ptr, _v) \ do { \ if (_ptr) *(_ptr) = _v; \ } while (0) #ifndef MG_INTERNAL #define MG_INTERNAL static #endif #ifdef PICOTCP #define NO_LIBC #define MG_DISABLE_PFS #endif /* Amalgamated: #include "common/cs_dbg.h" */ /* Amalgamated: #include "mg_http.h" */ /* Amalgamated: #include "mg_net.h" */ #ifndef MG_CTL_MSG_MESSAGE_SIZE #define MG_CTL_MSG_MESSAGE_SIZE 8192 #endif /* internals that need to be accessible in unit tests */ MG_INTERNAL struct mg_connection *mg_do_connect(struct mg_connection *nc, int proto, union socket_address *sa); MG_INTERNAL int mg_parse_address(const char *str, union socket_address *sa, int *proto, char *host, size_t host_len); MG_INTERNAL void mg_call(struct mg_connection *nc, mg_event_handler_t ev_handler, void *user_data, int ev, void *ev_data); void mg_forward(struct mg_connection *from, struct mg_connection *to); MG_INTERNAL void mg_add_conn(struct mg_mgr *mgr, struct mg_connection *c); MG_INTERNAL void mg_remove_conn(struct mg_connection *c); MG_INTERNAL struct mg_connection *mg_create_connection( struct mg_mgr *mgr, mg_event_handler_t callback, struct mg_add_sock_opts opts); #ifdef _WIN32 /* Retur value is the same as for MultiByteToWideChar. */ int to_wchar(const char *path, wchar_t *wbuf, size_t wbuf_len); #endif struct ctl_msg { mg_event_handler_t callback; char message[MG_CTL_MSG_MESSAGE_SIZE]; }; #if MG_ENABLE_MQTT struct mg_mqtt_message; #define MG_MQTT_ERROR_INCOMPLETE_MSG -1 #define MG_MQTT_ERROR_MALFORMED_MSG -2 MG_INTERNAL int parse_mqtt(struct mbuf *io, struct mg_mqtt_message *mm); #endif /* Forward declarations for testing. */ extern void *(*test_malloc)(size_t size); extern void *(*test_calloc)(size_t count, size_t size); #ifndef MIN #define MIN(a, b) ((a) < (b) ? (a) : (b)) #endif #if MG_ENABLE_HTTP struct mg_serve_http_opts; MG_INTERNAL struct mg_http_proto_data *mg_http_create_proto_data( struct mg_connection *c); /* * Reassemble the content of the buffer (buf, blen) which should be * in the HTTP chunked encoding, by collapsing data chunks to the * beginning of the buffer. * * If chunks get reassembled, modify hm->body to point to the reassembled * body and fire MG_EV_HTTP_CHUNK event. If handler sets MG_F_DELETE_CHUNK * in nc->flags, delete reassembled body from the mbuf. * * Return reassembled body size. */ ***

    mongoose.h【部分】

    /* * Copyright (c) 2004-2013 Sergey Lyubka * Copyright (c) 2013-2020 Cesanta Software Limited * All rights reserved * * This software is dual-licensed: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. For the terms of this * license, see <http://www.gnu.org/licenses/>. * * You are free to use this software under the terms of the GNU General * Public License, but WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * Alternatively, you can license this software under a commercial * license, as set out in <https://www.cesanta.com/license>. */ #ifdef MG_MODULE_LINES #line 1 "mongoose/src/mg_common.h" #endif #ifndef CS_MONGOOSE_SRC_COMMON_H_ #define CS_MONGOOSE_SRC_COMMON_H_ #define MG_VERSION "6.18" /* Local tweaks, applied before any of Mongoose's own headers. */ #ifdef MG_LOCALS #include <mg_locals.h> #endif #endif /* CS_MONGOOSE_SRC_COMMON_H_ */ #ifdef MG_MODULE_LINES #line 1 "common/platform.h" #endif #ifndef CS_COMMON_PLATFORM_H_ #define CS_COMMON_PLATFORM_H_

    main.cpp

    #include <stdio.h> #include <string.h> #include <time.h> #include <iostream> #include "include/mongoose.h" static const char *s_http_port = "8000"; static struct mg_serve_http_opts s_http_server_opts; static void handle_sum_call(struct mg_connection *nc, struct http_message *hm) { char n1[100], n2[100]; double result; /* Get form variables */ mg_get_http_var(&hm->body, "n1", n1, sizeof(n1)); mg_get_http_var(&hm->body, "n2", n2, sizeof(n2)); /* Send headers */ mg_printf(nc, "%s", "HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n"); /* Compute the result and send it back as a JSON object */ result = strtod(n1, NULL) + strtod(n2, NULL); mg_printf_http_chunk(nc, "{ \"result\": %lf }", result); mg_send_http_chunk(nc, "", 0); /* Send empty chunk, the end of response */ } static void ev_handler(struct mg_connection *nc, int ev, void *ev_data) { struct http_message *hm = (struct http_message *) ev_data; switch (ev) { case MG_EV_HTTP_REQUEST: if (mg_vcmp(&hm->uri, "/api/v1/sum") == 0) { handle_sum_call(nc, hm); /* Handle RESTful call */ } else if (mg_vcmp(&hm->uri, "/printcontent") == 0) { printf("-------------------------------%zu", hm->body.len); char buf[100] = {0}; memcpy(buf, hm->body.p, sizeof(buf) - 1 < hm->body.len ? sizeof(buf) - 1 : hm->body.len); printf("aaaaaaaaaaaaaaaaaaaaaaaa%s\n", buf); } else { mg_serve_http(nc, hm, s_http_server_opts); /* Serve static content */ } break; default: break; } } int main(int argc, char *argv[]) { struct mg_mgr mgr; struct mg_connection *nc; struct mg_bind_opts bind_opts; int i; char *cp; const char *err_str; #if MG_ENABLE_SSL const char *ssl_cert = NULL; #endif mg_mgr_init(&mgr, NULL); /* Use current binary directory as document root */ if (argc > 0 && ((cp = strrchr(argv[0], DIRSEP)) != NULL)) { *cp = '\0'; s_http_server_opts.document_root = argv[0]; } /* Process command line options to customize HTTP server */ for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-D") == 0 && i + 1 < argc) { mgr.hexdump_file = argv[++i]; } else if (strcmp(argv[i], "-d") == 0 && i + 1 < argc) { s_http_server_opts.document_root = argv[++i]; } else if (strcmp(argv[i], "-p") == 0 && i + 1 < argc) { s_http_port = argv[++i]; } else if (strcmp(argv[i], "-a") == 0 && i + 1 < argc) { s_http_server_opts.auth_domain = argv[++i]; } else if (strcmp(argv[i], "-P") == 0 && i + 1 < argc) { s_http_server_opts.global_auth_file = argv[++i]; } else if (strcmp(argv[i], "-A") == 0 && i + 1 < argc) { s_http_server_opts.per_directory_auth_file = argv[++i]; } else if (strcmp(argv[i], "-r") == 0 && i + 1 < argc) { s_http_server_opts.url_rewrites = argv[++i]; #if MG_ENABLE_HTTP_CGI } else if (strcmp(argv[i], "-i") == 0 && i + 1 < argc) { s_http_server_opts.cgi_interpreter = argv[++i]; #endif #if MG_ENABLE_SSL } else if (strcmp(argv[i], "-s") == 0 && i + 1 < argc) { ssl_cert = argv[++i]; #endif } else { fprintf(stderr, "Unknown option: [%s]\n", argv[i]); exit(1); } } /* Set HTTP server options */ memset(&bind_opts, 0, sizeof(bind_opts)); bind_opts.error_string = &err_str; #if MG_ENABLE_SSL if (ssl_cert != NULL) { bind_opts.ssl_cert = ssl_cert; } #endif nc = mg_bind_opt(&mgr, s_http_port, ev_handler, bind_opts); if (nc == NULL) { fprintf(stderr, "Error starting server on port %s: %s\n", s_http_port, *bind_opts.error_string); exit(1); } mg_set_protocol_http_websocket(nc); s_http_server_opts.enable_directory_listing = "yes"; printf("Starting RESTful server on port %s, serving %s\n", s_http_port, s_http_server_opts.document_root); for (;;) { mg_mgr_poll(&mgr, 1000); } mg_mgr_free(&mgr); return 0; }

    CMakeLists.txt

    cmake_minimum_required(VERSION 3.16) project(untitled) set(CMAKE_CXX_STANDARD 11) add_executable(untitled main.cpp mongoose.cpp)

    编译&运行

    在CMakeLists.txt同级目录下执行命令:cmake .,make 发现生成一个untiled,执行命令:./untitiled

    测试请求

    Processed: 0.014, SQL: 9