xref: /aosp_15_r20/external/libwebsockets/test-apps/test-lecp.c (revision 1c60b9aca93fdbc9b5f19b2d2194c91294b22281)
1*1c60b9acSAndroid Build Coastguard Worker /*
2*1c60b9acSAndroid Build Coastguard Worker  * lejp test app
3*1c60b9acSAndroid Build Coastguard Worker  *
4*1c60b9acSAndroid Build Coastguard Worker  * Written in 2010-2019 by Andy Green <[email protected]>
5*1c60b9acSAndroid Build Coastguard Worker  *
6*1c60b9acSAndroid Build Coastguard Worker  * This file is made available under the Creative Commons CC0 1.0
7*1c60b9acSAndroid Build Coastguard Worker  * Universal Public Domain Dedication.
8*1c60b9acSAndroid Build Coastguard Worker  *
9*1c60b9acSAndroid Build Coastguard Worker  * This demonstrates a minimal http server that performs a form GET with a couple
10*1c60b9acSAndroid Build Coastguard Worker  * of parameters.  It dumps the parameters to the console log and redirects
11*1c60b9acSAndroid Build Coastguard Worker  * to another page.
12*1c60b9acSAndroid Build Coastguard Worker  */
13*1c60b9acSAndroid Build Coastguard Worker 
14*1c60b9acSAndroid Build Coastguard Worker #include <libwebsockets.h>
15*1c60b9acSAndroid Build Coastguard Worker #include <string.h>
16*1c60b9acSAndroid Build Coastguard Worker 
17*1c60b9acSAndroid Build Coastguard Worker 
18*1c60b9acSAndroid Build Coastguard Worker static const char * const reason_names[] = {
19*1c60b9acSAndroid Build Coastguard Worker 	"LECPCB_CONSTRUCTED",
20*1c60b9acSAndroid Build Coastguard Worker 	"LECPCB_DESTRUCTED",
21*1c60b9acSAndroid Build Coastguard Worker 	"LECPCB_START",
22*1c60b9acSAndroid Build Coastguard Worker 	"LECPCB_COMPLETE",
23*1c60b9acSAndroid Build Coastguard Worker 	"LECPCB_FAILED",
24*1c60b9acSAndroid Build Coastguard Worker 	"LECPCB_PAIR_NAME",
25*1c60b9acSAndroid Build Coastguard Worker 	"LECPCB_VAL_TRUE",
26*1c60b9acSAndroid Build Coastguard Worker 	"LECPCB_VAL_FALSE",
27*1c60b9acSAndroid Build Coastguard Worker 	"LECPCB_VAL_NULL",
28*1c60b9acSAndroid Build Coastguard Worker 	"LECPCB_VAL_NUM_INT",
29*1c60b9acSAndroid Build Coastguard Worker 	"LECPCB_VAL_RESERVED", /* float in lejp */
30*1c60b9acSAndroid Build Coastguard Worker 	"LECPCB_VAL_STR_START",
31*1c60b9acSAndroid Build Coastguard Worker 	"LECPCB_VAL_STR_CHUNK",
32*1c60b9acSAndroid Build Coastguard Worker 	"LECPCB_VAL_STR_END",
33*1c60b9acSAndroid Build Coastguard Worker 	"LECPCB_ARRAY_START",
34*1c60b9acSAndroid Build Coastguard Worker 	"LECPCB_ARRAY_END",
35*1c60b9acSAndroid Build Coastguard Worker 	"LECPCB_OBJECT_START",
36*1c60b9acSAndroid Build Coastguard Worker 	"LECPCB_OBJECT_END",
37*1c60b9acSAndroid Build Coastguard Worker 	"LECPCB_TAG_START",
38*1c60b9acSAndroid Build Coastguard Worker 	"LECPCB_TAG_END",
39*1c60b9acSAndroid Build Coastguard Worker 	"LECPCB_VAL_NUM_UINT",
40*1c60b9acSAndroid Build Coastguard Worker 	"LECPCB_VAL_UNDEFINED",
41*1c60b9acSAndroid Build Coastguard Worker 	"LECPCB_VAL_FLOAT16",
42*1c60b9acSAndroid Build Coastguard Worker 	"LECPCB_VAL_FLOAT32",
43*1c60b9acSAndroid Build Coastguard Worker 	"LECPCB_VAL_FLOAT64",
44*1c60b9acSAndroid Build Coastguard Worker 	"LECPCB_VAL_SIMPLE",
45*1c60b9acSAndroid Build Coastguard Worker 	"LECPCB_VAL_BLOB_START",
46*1c60b9acSAndroid Build Coastguard Worker 	"LECPCB_VAL_BLOB_CHUNK",
47*1c60b9acSAndroid Build Coastguard Worker 	"LECPCB_VAL_BLOB_END",
48*1c60b9acSAndroid Build Coastguard Worker };
49*1c60b9acSAndroid Build Coastguard Worker 
50*1c60b9acSAndroid Build Coastguard Worker static const char * const tok[] = {
51*1c60b9acSAndroid Build Coastguard Worker 	"dummy___"
52*1c60b9acSAndroid Build Coastguard Worker };
53*1c60b9acSAndroid Build Coastguard Worker 
54*1c60b9acSAndroid Build Coastguard Worker static signed char
cb(struct lecp_ctx * ctx,char reason)55*1c60b9acSAndroid Build Coastguard Worker cb(struct lecp_ctx *ctx, char reason)
56*1c60b9acSAndroid Build Coastguard Worker {
57*1c60b9acSAndroid Build Coastguard Worker 	char buf[1024], *p = buf, *end = &buf[sizeof(buf)];
58*1c60b9acSAndroid Build Coastguard Worker 	int n;
59*1c60b9acSAndroid Build Coastguard Worker 
60*1c60b9acSAndroid Build Coastguard Worker 	for (n = 0; n < ctx->sp; n++)
61*1c60b9acSAndroid Build Coastguard Worker 		*p++ = ' ';
62*1c60b9acSAndroid Build Coastguard Worker 	*p = '\0';
63*1c60b9acSAndroid Build Coastguard Worker 
64*1c60b9acSAndroid Build Coastguard Worker 	lwsl_notice("%s%s: path %s match %d statckp %d\r\n", buf,
65*1c60b9acSAndroid Build Coastguard Worker 			reason_names[(unsigned int)(reason) &
66*1c60b9acSAndroid Build Coastguard Worker 			             (LEJP_FLAG_CB_IS_VALUE - 1)], ctx->path,
67*1c60b9acSAndroid Build Coastguard Worker 			ctx->path_match, ctx->pst[ctx->pst_sp].ppos);
68*1c60b9acSAndroid Build Coastguard Worker 
69*1c60b9acSAndroid Build Coastguard Worker 	if (reason & LECP_FLAG_CB_IS_VALUE) {
70*1c60b9acSAndroid Build Coastguard Worker 
71*1c60b9acSAndroid Build Coastguard Worker 		switch (reason) {
72*1c60b9acSAndroid Build Coastguard Worker 		case LECPCB_VAL_NUM_UINT:
73*1c60b9acSAndroid Build Coastguard Worker 			p += lws_snprintf(p, lws_ptr_diff_size_t(end, p),
74*1c60b9acSAndroid Build Coastguard Worker 					  "   value %llu ",
75*1c60b9acSAndroid Build Coastguard Worker 					  (unsigned long long)ctx->item.u.u64);
76*1c60b9acSAndroid Build Coastguard Worker 			break;
77*1c60b9acSAndroid Build Coastguard Worker 		case LECPCB_VAL_STR_START:
78*1c60b9acSAndroid Build Coastguard Worker 		case LECPCB_VAL_STR_CHUNK:
79*1c60b9acSAndroid Build Coastguard Worker 		case LECPCB_VAL_STR_END:
80*1c60b9acSAndroid Build Coastguard Worker 			p += lws_snprintf(p, lws_ptr_diff_size_t(end, p),
81*1c60b9acSAndroid Build Coastguard Worker 					  "   value '%s' ", ctx->buf);
82*1c60b9acSAndroid Build Coastguard Worker 			break;
83*1c60b9acSAndroid Build Coastguard Worker 
84*1c60b9acSAndroid Build Coastguard Worker 		case LECPCB_VAL_BLOB_START:
85*1c60b9acSAndroid Build Coastguard Worker 		case LECPCB_VAL_BLOB_CHUNK:
86*1c60b9acSAndroid Build Coastguard Worker 		case LECPCB_VAL_BLOB_END:
87*1c60b9acSAndroid Build Coastguard Worker 			if (ctx->npos)
88*1c60b9acSAndroid Build Coastguard Worker 				lwsl_hexdump_notice(ctx->buf, (size_t)ctx->npos);
89*1c60b9acSAndroid Build Coastguard Worker 			break;
90*1c60b9acSAndroid Build Coastguard Worker 
91*1c60b9acSAndroid Build Coastguard Worker 		case LECPCB_VAL_NUM_INT:
92*1c60b9acSAndroid Build Coastguard Worker 			p += lws_snprintf(p, lws_ptr_diff_size_t(end, p),
93*1c60b9acSAndroid Build Coastguard Worker 					  "   value %lld ",
94*1c60b9acSAndroid Build Coastguard Worker 					  (long long)ctx->item.u.i64);
95*1c60b9acSAndroid Build Coastguard Worker 			break;
96*1c60b9acSAndroid Build Coastguard Worker 		case LECPCB_VAL_FLOAT16:
97*1c60b9acSAndroid Build Coastguard Worker 		case LECPCB_VAL_FLOAT32:
98*1c60b9acSAndroid Build Coastguard Worker 		case LECPCB_VAL_FLOAT64:
99*1c60b9acSAndroid Build Coastguard Worker 			break;
100*1c60b9acSAndroid Build Coastguard Worker 
101*1c60b9acSAndroid Build Coastguard Worker 		case LECPCB_VAL_SIMPLE:
102*1c60b9acSAndroid Build Coastguard Worker 			p += lws_snprintf(p, lws_ptr_diff_size_t(end, p),
103*1c60b9acSAndroid Build Coastguard Worker 					  "   simple %llu ",
104*1c60b9acSAndroid Build Coastguard Worker 					  (unsigned long long)ctx->item.u.u64);
105*1c60b9acSAndroid Build Coastguard Worker 			break;
106*1c60b9acSAndroid Build Coastguard Worker 		}
107*1c60b9acSAndroid Build Coastguard Worker 		if (ctx->ipos) {
108*1c60b9acSAndroid Build Coastguard Worker 			int n;
109*1c60b9acSAndroid Build Coastguard Worker 
110*1c60b9acSAndroid Build Coastguard Worker 			p += lws_snprintf(p, lws_ptr_diff_size_t(end, p), "(array indexes: ");
111*1c60b9acSAndroid Build Coastguard Worker 			for (n = 0; n < ctx->ipos; n++)
112*1c60b9acSAndroid Build Coastguard Worker 				p += lws_snprintf(p, lws_ptr_diff_size_t(end, p), "%d ", ctx->i[n]);
113*1c60b9acSAndroid Build Coastguard Worker 			p += lws_snprintf(p, lws_ptr_diff_size_t(end, p), ") ");
114*1c60b9acSAndroid Build Coastguard Worker 		}
115*1c60b9acSAndroid Build Coastguard Worker 
116*1c60b9acSAndroid Build Coastguard Worker 		lwsl_notice("%s \r\n", buf);
117*1c60b9acSAndroid Build Coastguard Worker 
118*1c60b9acSAndroid Build Coastguard Worker 		(void)reason_names; /* NO_LOGS... */
119*1c60b9acSAndroid Build Coastguard Worker 		return 0;
120*1c60b9acSAndroid Build Coastguard Worker 	}
121*1c60b9acSAndroid Build Coastguard Worker 
122*1c60b9acSAndroid Build Coastguard Worker 	switch (reason) {
123*1c60b9acSAndroid Build Coastguard Worker 	case LECPCB_COMPLETE:
124*1c60b9acSAndroid Build Coastguard Worker 		lwsl_notice("%sParsing Completed (LEJPCB_COMPLETE)\n", buf);
125*1c60b9acSAndroid Build Coastguard Worker 		break;
126*1c60b9acSAndroid Build Coastguard Worker 	case LECPCB_PAIR_NAME:
127*1c60b9acSAndroid Build Coastguard Worker 		lwsl_notice("%spath: '%s' (LEJPCB_PAIR_NAME)\n", buf, ctx->path);
128*1c60b9acSAndroid Build Coastguard Worker 		break;
129*1c60b9acSAndroid Build Coastguard Worker 	case LECPCB_TAG_START:
130*1c60b9acSAndroid Build Coastguard Worker 		lwsl_notice("LECPCB_TAG_START: %llu\r\n", (unsigned long long)ctx->item.u.u64);
131*1c60b9acSAndroid Build Coastguard Worker 		return 0;
132*1c60b9acSAndroid Build Coastguard Worker 	}
133*1c60b9acSAndroid Build Coastguard Worker 
134*1c60b9acSAndroid Build Coastguard Worker 	return 0;
135*1c60b9acSAndroid Build Coastguard Worker }
136*1c60b9acSAndroid Build Coastguard Worker 
137*1c60b9acSAndroid Build Coastguard Worker int
main(int argc,char * argv[])138*1c60b9acSAndroid Build Coastguard Worker main(int argc, char *argv[])
139*1c60b9acSAndroid Build Coastguard Worker {
140*1c60b9acSAndroid Build Coastguard Worker 	int fd, n = 1, ret = 1, m = 0;
141*1c60b9acSAndroid Build Coastguard Worker 	struct lecp_ctx ctx;
142*1c60b9acSAndroid Build Coastguard Worker 	char buf[128];
143*1c60b9acSAndroid Build Coastguard Worker 
144*1c60b9acSAndroid Build Coastguard Worker 	lws_set_log_level(7, NULL);
145*1c60b9acSAndroid Build Coastguard Worker 
146*1c60b9acSAndroid Build Coastguard Worker 	lwsl_notice("libwebsockets-test-lecp  (C) 2017 - 2021 [email protected]\n");
147*1c60b9acSAndroid Build Coastguard Worker 	lwsl_notice("  usage: cat my.cbor | libwebsockets-test-lecp\n\n");
148*1c60b9acSAndroid Build Coastguard Worker 
149*1c60b9acSAndroid Build Coastguard Worker 	lecp_construct(&ctx, cb, NULL, tok, LWS_ARRAY_SIZE(tok));
150*1c60b9acSAndroid Build Coastguard Worker 
151*1c60b9acSAndroid Build Coastguard Worker 	fd = 0;
152*1c60b9acSAndroid Build Coastguard Worker 
153*1c60b9acSAndroid Build Coastguard Worker 	while (n > 0) {
154*1c60b9acSAndroid Build Coastguard Worker 		n = (int)read(fd, buf, sizeof(buf));
155*1c60b9acSAndroid Build Coastguard Worker 		if (n <= 0)
156*1c60b9acSAndroid Build Coastguard Worker 			continue;
157*1c60b9acSAndroid Build Coastguard Worker 
158*1c60b9acSAndroid Build Coastguard Worker 		m = lecp_parse(&ctx, (uint8_t *)buf, (size_t)n);
159*1c60b9acSAndroid Build Coastguard Worker 		if (m < 0 && m != LEJP_CONTINUE) {
160*1c60b9acSAndroid Build Coastguard Worker 			lwsl_err("parse failed %d\n", m);
161*1c60b9acSAndroid Build Coastguard Worker 			goto bail;
162*1c60b9acSAndroid Build Coastguard Worker 		}
163*1c60b9acSAndroid Build Coastguard Worker 	}
164*1c60b9acSAndroid Build Coastguard Worker 	lwsl_notice("okay (%d)\n", m);
165*1c60b9acSAndroid Build Coastguard Worker 	ret = 0;
166*1c60b9acSAndroid Build Coastguard Worker bail:
167*1c60b9acSAndroid Build Coastguard Worker 	lecp_destruct(&ctx);
168*1c60b9acSAndroid Build Coastguard Worker 
169*1c60b9acSAndroid Build Coastguard Worker 	return ret;
170*1c60b9acSAndroid Build Coastguard Worker }
171