1d4afb5ceSopenharmony_ci/*
2d4afb5ceSopenharmony_ci * lws-minimal-ws-server
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 *
11d4afb5ceSopenharmony_ci * To keep it simple, it serves stuff in the subdirectory "./mount-origin" of
12d4afb5ceSopenharmony_ci * the directory it was started in.
13d4afb5ceSopenharmony_ci * You can change that by changing mount.origin.
14d4afb5ceSopenharmony_ci */
15d4afb5ceSopenharmony_ci
16d4afb5ceSopenharmony_ci#include <libwebsockets.h>
17d4afb5ceSopenharmony_ci#include <string.h>
18d4afb5ceSopenharmony_ci#include <signal.h>
19d4afb5ceSopenharmony_ci
20d4afb5ceSopenharmony_ci#define LWS_PLUGIN_STATIC
21d4afb5ceSopenharmony_ci#include "protocol_lws_minimal_pmd_bulk.c"
22d4afb5ceSopenharmony_ci
23d4afb5ceSopenharmony_cistatic struct lws_protocols protocols[] = {
24d4afb5ceSopenharmony_ci	{ "http", lws_callback_http_dummy, 0, 0, 0, NULL, 0 },
25d4afb5ceSopenharmony_ci	LWS_PLUGIN_PROTOCOL_MINIMAL_PMD_BULK,
26d4afb5ceSopenharmony_ci	LWS_PROTOCOL_LIST_TERM
27d4afb5ceSopenharmony_ci};
28d4afb5ceSopenharmony_ci
29d4afb5ceSopenharmony_cistatic int interrupted, options;
30d4afb5ceSopenharmony_ci
31d4afb5ceSopenharmony_ci/* pass pointers to shared vars to the protocol */
32d4afb5ceSopenharmony_ci
33d4afb5ceSopenharmony_cistatic const struct lws_protocol_vhost_options pvo_options = {
34d4afb5ceSopenharmony_ci        NULL,
35d4afb5ceSopenharmony_ci        NULL,
36d4afb5ceSopenharmony_ci        "options",              /* pvo name */
37d4afb5ceSopenharmony_ci        (void *)&options        /* pvo value */
38d4afb5ceSopenharmony_ci};
39d4afb5ceSopenharmony_ci
40d4afb5ceSopenharmony_cistatic const struct lws_protocol_vhost_options pvo_interrupted = {
41d4afb5ceSopenharmony_ci        &pvo_options,
42d4afb5ceSopenharmony_ci        NULL,
43d4afb5ceSopenharmony_ci        "interrupted",          /* pvo name */
44d4afb5ceSopenharmony_ci        (void *)&interrupted    /* pvo value */
45d4afb5ceSopenharmony_ci};
46d4afb5ceSopenharmony_ci
47d4afb5ceSopenharmony_cistatic const struct lws_protocol_vhost_options pvo = {
48d4afb5ceSopenharmony_ci        NULL,           /* "next" pvo linked-list */
49d4afb5ceSopenharmony_ci        &pvo_interrupted,       /* "child" pvo linked-list */
50d4afb5ceSopenharmony_ci        "lws-minimal-pmd-bulk", /* protocol name we belong to on this vhost */
51d4afb5ceSopenharmony_ci        ""              /* ignored */
52d4afb5ceSopenharmony_ci};
53d4afb5ceSopenharmony_ci
54d4afb5ceSopenharmony_cistatic const struct lws_http_mount mount = {
55d4afb5ceSopenharmony_ci	/* .mount_next */		NULL,		/* linked-list "next" */
56d4afb5ceSopenharmony_ci	/* .mountpoint */		"/",		/* mountpoint URL */
57d4afb5ceSopenharmony_ci	/* .origin */			"./mount-origin", /* serve from dir */
58d4afb5ceSopenharmony_ci	/* .def */			"index.html",	/* default filename */
59d4afb5ceSopenharmony_ci	/* .protocol */			NULL,
60d4afb5ceSopenharmony_ci	/* .cgienv */			NULL,
61d4afb5ceSopenharmony_ci	/* .extra_mimetypes */		NULL,
62d4afb5ceSopenharmony_ci	/* .interpret */		NULL,
63d4afb5ceSopenharmony_ci	/* .cgi_timeout */		0,
64d4afb5ceSopenharmony_ci	/* .cache_max_age */		0,
65d4afb5ceSopenharmony_ci	/* .auth_mask */		0,
66d4afb5ceSopenharmony_ci	/* .cache_reusable */		0,
67d4afb5ceSopenharmony_ci	/* .cache_revalidate */		0,
68d4afb5ceSopenharmony_ci	/* .cache_intermediaries */	0,
69d4afb5ceSopenharmony_ci	/* .origin_protocol */		LWSMPRO_FILE,	/* files in a dir */
70d4afb5ceSopenharmony_ci	/* .mountpoint_len */		1,		/* char count */
71d4afb5ceSopenharmony_ci	/* .basic_auth_login_file */	NULL,
72d4afb5ceSopenharmony_ci};
73d4afb5ceSopenharmony_ci
74d4afb5ceSopenharmony_cistatic const struct lws_extension extensions[] = {
75d4afb5ceSopenharmony_ci	{
76d4afb5ceSopenharmony_ci		"permessage-deflate",
77d4afb5ceSopenharmony_ci		lws_extension_callback_pm_deflate,
78d4afb5ceSopenharmony_ci		"permessage-deflate"
79d4afb5ceSopenharmony_ci		 "; client_no_context_takeover"
80d4afb5ceSopenharmony_ci		 "; client_max_window_bits"
81d4afb5ceSopenharmony_ci	},
82d4afb5ceSopenharmony_ci	{ NULL, NULL, NULL /* terminator */ }
83d4afb5ceSopenharmony_ci};
84d4afb5ceSopenharmony_ci
85d4afb5ceSopenharmony_civoid sigint_handler(int sig)
86d4afb5ceSopenharmony_ci{
87d4afb5ceSopenharmony_ci	interrupted = 1;
88d4afb5ceSopenharmony_ci}
89d4afb5ceSopenharmony_ci
90d4afb5ceSopenharmony_ciint main(int argc, const char **argv)
91d4afb5ceSopenharmony_ci{
92d4afb5ceSopenharmony_ci	struct lws_context_creation_info info;
93d4afb5ceSopenharmony_ci	struct lws_context *context;
94d4afb5ceSopenharmony_ci	const char *p;
95d4afb5ceSopenharmony_ci	int n = 0, logs = LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE
96d4afb5ceSopenharmony_ci			/* for LLL_ verbosity above NOTICE to be built into lws,
97d4afb5ceSopenharmony_ci			 * lws must have been configured and built with
98d4afb5ceSopenharmony_ci			 * -DCMAKE_BUILD_TYPE=DEBUG instead of =RELEASE */
99d4afb5ceSopenharmony_ci			/* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */
100d4afb5ceSopenharmony_ci			/* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */
101d4afb5ceSopenharmony_ci			/* | LLL_DEBUG */;
102d4afb5ceSopenharmony_ci
103d4afb5ceSopenharmony_ci	signal(SIGINT, sigint_handler);
104d4afb5ceSopenharmony_ci
105d4afb5ceSopenharmony_ci	if ((p = lws_cmdline_option(argc, argv, "-d")))
106d4afb5ceSopenharmony_ci		logs = atoi(p);
107d4afb5ceSopenharmony_ci
108d4afb5ceSopenharmony_ci	lws_set_log_level(logs, NULL);
109d4afb5ceSopenharmony_ci	lwsl_user("LWS minimal ws server + permessage-deflate | visit http://localhost:7681\n");
110d4afb5ceSopenharmony_ci	lwsl_user("   %s [-n (no exts)] [-c (compressible)] [-b (blob)]\n", argv[0]);
111d4afb5ceSopenharmony_ci
112d4afb5ceSopenharmony_ci	memset(&info, 0, sizeof info); /* otherwise uninitialized garbage */
113d4afb5ceSopenharmony_ci	info.port = 7681;
114d4afb5ceSopenharmony_ci	info.mounts = &mount;
115d4afb5ceSopenharmony_ci	info.protocols = protocols;
116d4afb5ceSopenharmony_ci	info.pvo = &pvo;
117d4afb5ceSopenharmony_ci	info.options =
118d4afb5ceSopenharmony_ci		LWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;
119d4afb5ceSopenharmony_ci
120d4afb5ceSopenharmony_ci	if (!lws_cmdline_option(argc, argv, "-n"))
121d4afb5ceSopenharmony_ci		info.extensions = extensions;
122d4afb5ceSopenharmony_ci
123d4afb5ceSopenharmony_ci	if (lws_cmdline_option(argc, argv, "-c"))
124d4afb5ceSopenharmony_ci		options |= 1; /* send compressible text */
125d4afb5ceSopenharmony_ci
126d4afb5ceSopenharmony_ci	if (lws_cmdline_option(argc, argv, "-b"))
127d4afb5ceSopenharmony_ci		options |= 2; /* send in one giant blob */
128d4afb5ceSopenharmony_ci
129d4afb5ceSopenharmony_ci	info.pt_serv_buf_size = 32 * 1024;
130d4afb5ceSopenharmony_ci
131d4afb5ceSopenharmony_ci	context = lws_create_context(&info);
132d4afb5ceSopenharmony_ci	if (!context) {
133d4afb5ceSopenharmony_ci		lwsl_err("lws init failed\n");
134d4afb5ceSopenharmony_ci		return 1;
135d4afb5ceSopenharmony_ci	}
136d4afb5ceSopenharmony_ci
137d4afb5ceSopenharmony_ci	while (n >= 0 && !interrupted)
138d4afb5ceSopenharmony_ci		n = lws_service(context, 0);
139d4afb5ceSopenharmony_ci
140d4afb5ceSopenharmony_ci	lws_context_destroy(context);
141d4afb5ceSopenharmony_ci
142d4afb5ceSopenharmony_ci	return 0;
143d4afb5ceSopenharmony_ci}
144