1d4afb5ceSopenharmony_ci/* 2d4afb5ceSopenharmony_ci * lws-minimal-http-server-tls 3d4afb5ceSopenharmony_ci * 4d4afb5ceSopenharmony_ci * Written in 2010-2019 by Andy Green <andy@warmcat.com> 5d4afb5ceSopenharmony_ci * 6d4afb5ceSopenharmony_ci * This file is made available under the Creative Commons CC0 1.0 7d4afb5ceSopenharmony_ci * Universal Public Domain Dedication. 8d4afb5ceSopenharmony_ci * 9d4afb5ceSopenharmony_ci * This demonstrates the most minimal http server you can make with lws, 10d4afb5ceSopenharmony_ci * with three extra lines giving it tls (ssl) capabilities, which in 11d4afb5ceSopenharmony_ci * turn allow operation with HTTP/2 if lws was configured for it. 12d4afb5ceSopenharmony_ci * 13d4afb5ceSopenharmony_ci * To keep it simple, it serves stuff from the subdirectory 14d4afb5ceSopenharmony_ci * "./mount-origin" of the directory it was started in. 15d4afb5ceSopenharmony_ci * 16d4afb5ceSopenharmony_ci * You can change that by changing mount.origin below. 17d4afb5ceSopenharmony_ci */ 18d4afb5ceSopenharmony_ci 19d4afb5ceSopenharmony_ci#include <libwebsockets.h> 20d4afb5ceSopenharmony_ci#include <string.h> 21d4afb5ceSopenharmony_ci#include <signal.h> 22d4afb5ceSopenharmony_ci#include <errno.h> 23d4afb5ceSopenharmony_ci 24d4afb5ceSopenharmony_cistatic int interrupted; 25d4afb5ceSopenharmony_ci 26d4afb5ceSopenharmony_ci#if defined(LWS_WITH_PLUGINS) 27d4afb5ceSopenharmony_cistatic const char * const plugin_dirs[] = { 28d4afb5ceSopenharmony_ci LWS_INSTALL_DATADIR"/libwebsockets-test-server/plugins/", 29d4afb5ceSopenharmony_ci NULL 30d4afb5ceSopenharmony_ci}; 31d4afb5ceSopenharmony_ci#endif 32d4afb5ceSopenharmony_ci 33d4afb5ceSopenharmony_cistatic const struct lws_http_mount 34d4afb5ceSopenharmony_ci#if defined(LWS_WITH_SYS_METRICS) 35d4afb5ceSopenharmony_ci mount_metrics = { 36d4afb5ceSopenharmony_ci /* .mount_next */ NULL, /* linked-list "next" */ 37d4afb5ceSopenharmony_ci /* .mountpoint */ "/metrics", /* mountpoint URL */ 38d4afb5ceSopenharmony_ci /* .origin */ "lws-openmetrics", /* serve from dir */ 39d4afb5ceSopenharmony_ci /* .def */ "x", /* default filename */ 40d4afb5ceSopenharmony_ci /* .protocol */ "lws-openmetrics", 41d4afb5ceSopenharmony_ci /* .cgienv */ NULL, 42d4afb5ceSopenharmony_ci /* .extra_mimetypes */ NULL, 43d4afb5ceSopenharmony_ci /* .interpret */ NULL, 44d4afb5ceSopenharmony_ci /* .cgi_timeout */ 0, 45d4afb5ceSopenharmony_ci /* .cache_max_age */ 0, 46d4afb5ceSopenharmony_ci /* .auth_mask */ 0, 47d4afb5ceSopenharmony_ci /* .cache_reusable */ 0, 48d4afb5ceSopenharmony_ci /* .cache_revalidate */ 0, 49d4afb5ceSopenharmony_ci /* .cache_intermediaries */ 0, 50d4afb5ceSopenharmony_ci /* .origin_protocol */ LWSMPRO_CALLBACK, /* bind to callback */ 51d4afb5ceSopenharmony_ci /* .mountpoint_len */ 8, /* char count */ 52d4afb5ceSopenharmony_ci /* .basic_auth_login_file */ NULL, 53d4afb5ceSopenharmony_ci }, 54d4afb5ceSopenharmony_ci#endif 55d4afb5ceSopenharmony_ci mount = { 56d4afb5ceSopenharmony_ci#if defined(LWS_WITH_SYS_METRICS) 57d4afb5ceSopenharmony_ci /* .mount_next */ &mount_metrics, /* linked-list "next" */ 58d4afb5ceSopenharmony_ci#else 59d4afb5ceSopenharmony_ci /* .mount_next */ NULL, /* linked-list "next" */ 60d4afb5ceSopenharmony_ci#endif 61d4afb5ceSopenharmony_ci /* .mountpoint */ "/", /* mountpoint URL */ 62d4afb5ceSopenharmony_ci /* .origin */ "./mount-origin", /* serve from dir */ 63d4afb5ceSopenharmony_ci /* .def */ "index.html", /* default filename */ 64d4afb5ceSopenharmony_ci /* .protocol */ "http-only", 65d4afb5ceSopenharmony_ci /* .cgienv */ NULL, 66d4afb5ceSopenharmony_ci /* .extra_mimetypes */ NULL, 67d4afb5ceSopenharmony_ci /* .interpret */ NULL, 68d4afb5ceSopenharmony_ci /* .cgi_timeout */ 0, 69d4afb5ceSopenharmony_ci /* .cache_max_age */ 0, 70d4afb5ceSopenharmony_ci /* .auth_mask */ 0, 71d4afb5ceSopenharmony_ci /* .cache_reusable */ 0, 72d4afb5ceSopenharmony_ci /* .cache_revalidate */ 0, 73d4afb5ceSopenharmony_ci /* .cache_intermediaries */ 0, 74d4afb5ceSopenharmony_ci /* .origin_protocol */ LWSMPRO_FILE, /* files in a dir */ 75d4afb5ceSopenharmony_ci /* .mountpoint_len */ 1, /* char count */ 76d4afb5ceSopenharmony_ci /* .basic_auth_login_file */ NULL, 77d4afb5ceSopenharmony_ci}; 78d4afb5ceSopenharmony_ci 79d4afb5ceSopenharmony_ci#if !defined(WIN32) 80d4afb5ceSopenharmony_civoid sigint_handler(int sig, siginfo_t *siginfo, void *context) 81d4afb5ceSopenharmony_ci{ 82d4afb5ceSopenharmony_ci pid_t sender_pid = siginfo->si_pid; 83d4afb5ceSopenharmony_ci lwsl_err("%s: sig %d from pid %lu\n", __func__, sig, (unsigned long)sender_pid); 84d4afb5ceSopenharmony_ci interrupted = 1; 85d4afb5ceSopenharmony_ci} 86d4afb5ceSopenharmony_ci#else 87d4afb5ceSopenharmony_civoid sigint_handler(int sig) 88d4afb5ceSopenharmony_ci{ 89d4afb5ceSopenharmony_ci interrupted = 1; 90d4afb5ceSopenharmony_ci} 91d4afb5ceSopenharmony_ci#endif 92d4afb5ceSopenharmony_ci 93d4afb5ceSopenharmony_ciint main(int argc, const char **argv) 94d4afb5ceSopenharmony_ci{ 95d4afb5ceSopenharmony_ci struct lws_context_creation_info info; 96d4afb5ceSopenharmony_ci struct lws_context *context; 97d4afb5ceSopenharmony_ci#if !defined(WIN32) 98d4afb5ceSopenharmony_ci struct sigaction siga; 99d4afb5ceSopenharmony_ci#endif 100d4afb5ceSopenharmony_ci const char *p; 101d4afb5ceSopenharmony_ci int n = 0; 102d4afb5ceSopenharmony_ci 103d4afb5ceSopenharmony_ci#if !defined(WIN32) 104d4afb5ceSopenharmony_ci memset(&siga, 0, sizeof(siga)); 105d4afb5ceSopenharmony_ci siga.sa_sigaction = sigint_handler; 106d4afb5ceSopenharmony_ci siga.sa_flags |= SA_SIGINFO; // get detail info 107d4afb5ceSopenharmony_ci 108d4afb5ceSopenharmony_ci // change signal action, 109d4afb5ceSopenharmony_ci if (sigaction(SIGINT, &siga, NULL) != 0) { 110d4afb5ceSopenharmony_ci printf("error sigaction()"); 111d4afb5ceSopenharmony_ci return errno; 112d4afb5ceSopenharmony_ci } 113d4afb5ceSopenharmony_ci#else 114d4afb5ceSopenharmony_ci signal(SIGINT, sigint_handler); 115d4afb5ceSopenharmony_ci#endif 116d4afb5ceSopenharmony_ci memset(&info, 0, sizeof info); /* otherwise uninitialized garbage */ 117d4afb5ceSopenharmony_ci lws_cmdline_option_handle_builtin(argc, argv, &info); 118d4afb5ceSopenharmony_ci lwsl_user("LWS minimal http server TLS | visit https://localhost:7681\n"); 119d4afb5ceSopenharmony_ci 120d4afb5ceSopenharmony_ci info.port = 7681; 121d4afb5ceSopenharmony_ci if ((p = lws_cmdline_option(argc, argv, "--port"))) 122d4afb5ceSopenharmony_ci info.port = atoi(p); 123d4afb5ceSopenharmony_ci info.mounts = &mount; 124d4afb5ceSopenharmony_ci info.error_document_404 = "/404.html"; 125d4afb5ceSopenharmony_ci info.options = LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT | 126d4afb5ceSopenharmony_ci LWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE; 127d4afb5ceSopenharmony_ci info.ssl_cert_filepath = "localhost-100y.cert"; 128d4afb5ceSopenharmony_ci info.ssl_private_key_filepath = "localhost-100y.key"; 129d4afb5ceSopenharmony_ci info.fo_listen_queue = 32; 130d4afb5ceSopenharmony_ci 131d4afb5ceSopenharmony_ci#if defined(LWS_WITH_PLUGINS) 132d4afb5ceSopenharmony_ci info.plugin_dirs = plugin_dirs; 133d4afb5ceSopenharmony_ci#endif 134d4afb5ceSopenharmony_ci 135d4afb5ceSopenharmony_ci if (lws_cmdline_option(argc, argv, "-h")) 136d4afb5ceSopenharmony_ci info.options |= LWS_SERVER_OPTION_VHOST_UPG_STRICT_HOST_CHECK; 137d4afb5ceSopenharmony_ci 138d4afb5ceSopenharmony_ci context = lws_create_context(&info); 139d4afb5ceSopenharmony_ci if (!context) { 140d4afb5ceSopenharmony_ci lwsl_err("lws init failed\n"); 141d4afb5ceSopenharmony_ci return 1; 142d4afb5ceSopenharmony_ci } 143d4afb5ceSopenharmony_ci 144d4afb5ceSopenharmony_ci while (n >= 0 && !interrupted) 145d4afb5ceSopenharmony_ci n = lws_service(context, 0); 146d4afb5ceSopenharmony_ci 147d4afb5ceSopenharmony_ci lws_context_destroy(context); 148d4afb5ceSopenharmony_ci 149d4afb5ceSopenharmony_ci return 0; 150d4afb5ceSopenharmony_ci} 151