• C++-Mongoose(3)-http-server-https-restful


    1.url 结构

    2.http和 http-restful区别在于对于mg_tls_opts的赋值

     

      2.1 http和https 区分


           a) port地址

    static const char *s_http_addr = "http://0.0.0.0:8000";    // HTTP port

    static const char *s_https_addr = "https://0.0.0.0:8443";  // HTTPS port
       

         b)https时 对mg_tls_opts赋值
     

    1. struct mg_tls_opts opts = {
    2. #ifdef TLS_TWOWAY
    3. .ca = mg_str(s_tls_ca),
    4. #endif
    5. .cert = mg_str(s_tls_cert),
    6. .key = mg_str(s_tls_key)};
    7. mg_tls_init(c, &opts);
    8. }

      3个重要变量:
    static const char* s_tls_ca ;
    static const char* s_tls_cert;
    static const char* s_tls_key;

    1. #ifdef TLS_TWOWAY
    2. static const char* s_tls_ca =
    3. "-----BEGIN CERTIFICATE-----\n"
    4. "MIIBqjCCAU+gAwIBAgIUESoOPGqMhf9uarzblVFwzrQweMcwCgYIKoZIzj0EAwIw\n"
    5. "RDELMAkGA1UEBhMCSUUxDzANBgNVBAcMBkR1YmxpbjEQMA4GA1UECgwHQ2VzYW50\n"
    6. "YTESMBAGA1UEAwwJVGVzdCBSb290MCAXDTIwMDUwOTIxNTE0NFoYDzIwNTAwNTA5\n"
    7. "MjE1MTQ0WjBEMQswCQYDVQQGEwJJRTEPMA0GA1UEBwwGRHVibGluMRAwDgYDVQQK\n"
    8. "DAdDZXNhbnRhMRIwEAYDVQQDDAlUZXN0IFJvb3QwWTATBgcqhkjOPQIBBggqhkjO\n"
    9. "PQMBBwNCAAQsq9ECZiSW1xI+CVBP8VDuUehVA166sR2YsnJ5J6gbMQ1dUCH/QvLa\n"
    10. "dBdeU7JlQcH8hN5KEbmM9BnZxMor6ussox0wGzAMBgNVHRMEBTADAQH/MAsGA1Ud\n"
    11. "DwQEAwIBrjAKBggqhkjOPQQDAgNJADBGAiEAnHFsAIwGQQyRL81B04dH6d86Iq0l\n"
    12. "fL8OKzndegxOaB0CIQCPwSIwEGFdURDqCC0CY2dnMrUGY5ZXu3hHCojZGS7zvg==\n"
    13. "-----END CERTIFICATE-----\n";
    14. #endif
    15. static const char* s_tls_cert =
    16. "-----BEGIN CERTIFICATE-----\n"
    17. "MIIBhzCCASygAwIBAgIUbnMoVd8TtWH1T09dANkK2LU6IUswCgYIKoZIzj0EAwIw\n"
    18. "RDELMAkGA1UEBhMCSUUxDzANBgNVBAcMBkR1YmxpbjEQMA4GA1UECgwHQ2VzYW50\n"
    19. "YTESMBAGA1UEAwwJVGVzdCBSb290MB4XDTIwMDUwOTIxNTE0OVoXDTMwMDUwOTIx\n"
    20. "NTE0OVowETEPMA0GA1UEAwwGc2VydmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcD\n"
    21. "QgAEkuBGnInDN6l06zVVQ1VcrOvH5FDu9MC6FwJc2e201P8hEpq0Q/SJS2nkbSuW\n"
    22. "H/wBTTBaeXN2uhlBzMUWK790KKMvMC0wCQYDVR0TBAIwADALBgNVHQ8EBAMCA6gw\n"
    23. "EwYDVR0lBAwwCgYIKwYBBQUHAwEwCgYIKoZIzj0EAwIDSQAwRgIhAPo6xx7LjCdZ\n"
    24. "QY133XvLjAgVFrlucOZHONFVQuDXZsjwAiEAzHBNligA08c5U3SySYcnkhurGg50\n"
    25. "BllCI0eYQ9ggp/o=\n"
    26. "-----END CERTIFICATE-----\n";
    27. static const char* s_tls_key =
    28. "-----BEGIN PRIVATE KEY-----\n"
    29. "MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQglNni0t9Dg9icgG8w\n"
    30. "kbfxWSS+TuNgbtNybIQXcm3NHpmhRANCAASS4EacicM3qXTrNVVDVVys68fkUO70\n"
    31. "wLoXAlzZ7bTU/yESmrRD9IlLaeRtK5Yf/AFNMFp5c3a6GUHMxRYrv3Qo\n"
    32. "-----END PRIVATE KEY-----\n";

       2.2code


       restfulserver_fn函数         

    1. static void restfulserver_fn(struct mg_connection *c, int ev, void *ev_data, void *fn_data)
    2. {
    3. if (ev == MG_EV_ACCEPT && fn_data != NULL) //1.如果收到消息 MG_EV_ACCEPT
    4. {
    5. struct mg_tls_opts opts = //1.1.结构赋值
    6. {
    7. #ifdef TLS_TWOWAY
    8. .ca = mg_str(s_tls_ca),
    9. #endif
    10. .cert = mg_str(s_tls_cert),
    11. .key = mg_str(s_tls_key)
    12. };
    13. mg_tls_init(c, &opts); //1.2放入上下文中
    14. }
    15. if (ev == MG_EV_HTTP_MSG) //2.如果收到消息 MG_EV_HTTP_MSG
    16. {
    17. struct mg_http_message *hm = (struct mg_http_message *) ev_data;
    18. //1.get请求 ,显示
    19. if (mg_http_match_uri(hm, "/api/stats"))
    20. {
    21. // Print some statistics about currently established connections
    22. mg_printf(c, "HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n");
    23. mg_http_printf_chunk(c, "ID PROTO TYPE LOCAL REMOTE\n");
    24. for (struct mg_connection *t = c->mgr->conns; t != NULL; t = t->next)
    25. {
    26. mg_http_printf_chunk(c, "%-3lu %4s %s %M %M\n", t->id,
    27. t->is_udp ? "UDP" : "TCP",
    28. t->is_listening ? "LISTENING"
    29. : t->is_accepted ? "ACCEPTED "
    30. : "CONNECTED",
    31. mg_print_ip, &t->loc, mg_print_ip, &t->rem);
    32. }
    33. mg_http_printf_chunk(c, ""); // Don't forget the last empty chunk
    34. }
    35. //2.post请求 回result
    36. else if (mg_http_match_uri(hm, "/api/f2/*"))
    37. {
    38. mg_http_reply(c, 200, "", "{\"result\": \"%.*s\"}\n", (int) hm->uri.len,
    39. hm->uri.ptr);
    40. }
    41. //3.显示当前目录文件列表
    42. else
    43. {
    44. struct mg_http_serve_opts opts = {.root_dir = s_root_dir};
    45. mg_http_serve_dir(c, ev_data, &opts);
    46. }
    47. }
    48. (void) fn_data;
    49. }


       main 函数

    1. void main()
    2. {
    3. struct mg_mgr mgr; // Event manager
    4. mg_log_set(MG_LL_DEBUG); // Set log level
    5. mg_mgr_init(&mgr); // Initialise event manager
    6. mg_http_listen(&mgr, s_http_addr, restfulserver_fn, NULL); // Create HTTP listener
    7. mg_http_listen(&mgr, s_https_addr, restfulserver_fn, (void*)1); // HTTPS listener
    8. for (;;) mg_mgr_poll(&mgr, 1000); // Infinite event loop
    9. mg_mgr_free(&mgr);
    10. }


     

    2.3测试
     

     启动httpserver 程序
    1.2.1  浏览器访问:http://127.0.0.1:8000:
             将显示exe程序根目录文件列表
    1.2.2  浏览器访问: http://127.0.0.1:8000/api/stats:
             将显示:
            

             
    1.2.3 使用postman: 发送post请求:
              http://127.0.0.1:8000/api/f2/*,
         

  • 相关阅读:
    Qt Design Studio 4.5现已发布
    Rust序列化和反序列化
    C语言-函数
    c++day3
    Three.js添加阴影和简单后期处理
    NCCL源码解析②:Bootstrap网络连接的建立
    Linux 目录管理
    德尔菲技术是什么意思?如何使用?
    【Scala专栏】字符串与集合
    创建多层级行索引,创建多层级行索引的DataFrameMultiIndex.from_product()
  • 原文地址:https://blog.csdn.net/aggie4628/article/details/133738116