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 "LEJPCB_CONSTRUCTED",
20*1c60b9acSAndroid Build Coastguard Worker "LEJPCB_DESTRUCTED",
21*1c60b9acSAndroid Build Coastguard Worker "LEJPCB_START",
22*1c60b9acSAndroid Build Coastguard Worker "LEJPCB_COMPLETE",
23*1c60b9acSAndroid Build Coastguard Worker "LEJPCB_FAILED",
24*1c60b9acSAndroid Build Coastguard Worker "LEJPCB_PAIR_NAME",
25*1c60b9acSAndroid Build Coastguard Worker "LEJPCB_VAL_TRUE",
26*1c60b9acSAndroid Build Coastguard Worker "LEJPCB_VAL_FALSE",
27*1c60b9acSAndroid Build Coastguard Worker "LEJPCB_VAL_NULL",
28*1c60b9acSAndroid Build Coastguard Worker "LEJPCB_VAL_NUM_INT",
29*1c60b9acSAndroid Build Coastguard Worker "LEJPCB_VAL_NUM_FLOAT",
30*1c60b9acSAndroid Build Coastguard Worker "LEJPCB_VAL_STR_START",
31*1c60b9acSAndroid Build Coastguard Worker "LEJPCB_VAL_STR_CHUNK",
32*1c60b9acSAndroid Build Coastguard Worker "LEJPCB_VAL_STR_END",
33*1c60b9acSAndroid Build Coastguard Worker "LEJPCB_ARRAY_START",
34*1c60b9acSAndroid Build Coastguard Worker "LEJPCB_ARRAY_END",
35*1c60b9acSAndroid Build Coastguard Worker "LEJPCB_OBJECT_START",
36*1c60b9acSAndroid Build Coastguard Worker "LEJPCB_OBJECT_END",
37*1c60b9acSAndroid Build Coastguard Worker "LEJPCB_OBJECT_END_PRE",
38*1c60b9acSAndroid Build Coastguard Worker };
39*1c60b9acSAndroid Build Coastguard Worker
40*1c60b9acSAndroid Build Coastguard Worker static const char * const tok[] = {
41*1c60b9acSAndroid Build Coastguard Worker "dummy___"
42*1c60b9acSAndroid Build Coastguard Worker };
43*1c60b9acSAndroid Build Coastguard Worker
44*1c60b9acSAndroid Build Coastguard Worker static signed char
cb(struct lejp_ctx * ctx,char reason)45*1c60b9acSAndroid Build Coastguard Worker cb(struct lejp_ctx *ctx, char reason)
46*1c60b9acSAndroid Build Coastguard Worker {
47*1c60b9acSAndroid Build Coastguard Worker char buf[1024], *p = buf, *end = &buf[sizeof(buf)];
48*1c60b9acSAndroid Build Coastguard Worker int n;
49*1c60b9acSAndroid Build Coastguard Worker
50*1c60b9acSAndroid Build Coastguard Worker for (n = 0; n < ctx->sp; n++)
51*1c60b9acSAndroid Build Coastguard Worker *p++ = ' ';
52*1c60b9acSAndroid Build Coastguard Worker *p = '\0';
53*1c60b9acSAndroid Build Coastguard Worker
54*1c60b9acSAndroid Build Coastguard Worker if (reason & LEJP_FLAG_CB_IS_VALUE) {
55*1c60b9acSAndroid Build Coastguard Worker p += lws_snprintf(p, lws_ptr_diff_size_t(end, p), " value '%s' ", ctx->buf);
56*1c60b9acSAndroid Build Coastguard Worker if (ctx->ipos) {
57*1c60b9acSAndroid Build Coastguard Worker int n;
58*1c60b9acSAndroid Build Coastguard Worker
59*1c60b9acSAndroid Build Coastguard Worker p += lws_snprintf(p, lws_ptr_diff_size_t(end, p), "(array indexes: ");
60*1c60b9acSAndroid Build Coastguard Worker for (n = 0; n < ctx->ipos; n++)
61*1c60b9acSAndroid Build Coastguard Worker p += lws_snprintf(p, lws_ptr_diff_size_t(end, p), "%d ", ctx->i[n]);
62*1c60b9acSAndroid Build Coastguard Worker p += lws_snprintf(p, lws_ptr_diff_size_t(end, p), ") ");
63*1c60b9acSAndroid Build Coastguard Worker }
64*1c60b9acSAndroid Build Coastguard Worker lwsl_notice("%s (%s)\r\n", buf,
65*1c60b9acSAndroid Build Coastguard Worker reason_names[(unsigned int)
66*1c60b9acSAndroid Build Coastguard Worker (reason) & (LEJP_FLAG_CB_IS_VALUE - 1)]);
67*1c60b9acSAndroid Build Coastguard Worker
68*1c60b9acSAndroid Build Coastguard Worker (void)reason_names; /* NO_LOGS... */
69*1c60b9acSAndroid Build Coastguard Worker return 0;
70*1c60b9acSAndroid Build Coastguard Worker }
71*1c60b9acSAndroid Build Coastguard Worker
72*1c60b9acSAndroid Build Coastguard Worker switch (reason) {
73*1c60b9acSAndroid Build Coastguard Worker case LEJPCB_COMPLETE:
74*1c60b9acSAndroid Build Coastguard Worker lwsl_notice("%sParsing Completed (LEJPCB_COMPLETE)\n", buf);
75*1c60b9acSAndroid Build Coastguard Worker break;
76*1c60b9acSAndroid Build Coastguard Worker case LEJPCB_PAIR_NAME:
77*1c60b9acSAndroid Build Coastguard Worker lwsl_notice("%spath: '%s' (LEJPCB_PAIR_NAME)\n", buf, ctx->path);
78*1c60b9acSAndroid Build Coastguard Worker break;
79*1c60b9acSAndroid Build Coastguard Worker }
80*1c60b9acSAndroid Build Coastguard Worker
81*1c60b9acSAndroid Build Coastguard Worker lwsl_notice("%s%s: path %s match %d statckp %d\r\n", buf, reason_names[(unsigned int)
82*1c60b9acSAndroid Build Coastguard Worker (reason) & (LEJP_FLAG_CB_IS_VALUE - 1)], ctx->path,
83*1c60b9acSAndroid Build Coastguard Worker ctx->path_match, ctx->pst[ctx->pst_sp].ppos);
84*1c60b9acSAndroid Build Coastguard Worker
85*1c60b9acSAndroid Build Coastguard Worker return 0;
86*1c60b9acSAndroid Build Coastguard Worker }
87*1c60b9acSAndroid Build Coastguard Worker
88*1c60b9acSAndroid Build Coastguard Worker int
main(int argc,char * argv[])89*1c60b9acSAndroid Build Coastguard Worker main(int argc, char *argv[])
90*1c60b9acSAndroid Build Coastguard Worker {
91*1c60b9acSAndroid Build Coastguard Worker int fd, n = 1, ret = 1, m = 0;
92*1c60b9acSAndroid Build Coastguard Worker struct lejp_ctx ctx;
93*1c60b9acSAndroid Build Coastguard Worker char buf[128];
94*1c60b9acSAndroid Build Coastguard Worker
95*1c60b9acSAndroid Build Coastguard Worker lws_set_log_level(7, NULL);
96*1c60b9acSAndroid Build Coastguard Worker
97*1c60b9acSAndroid Build Coastguard Worker lwsl_notice("libwebsockets-test-lejp (C) 2017 - 2018 [email protected]\n");
98*1c60b9acSAndroid Build Coastguard Worker lwsl_notice(" usage: cat my.json | libwebsockets-test-lejp\n\n");
99*1c60b9acSAndroid Build Coastguard Worker
100*1c60b9acSAndroid Build Coastguard Worker lejp_construct(&ctx, cb, NULL, tok, LWS_ARRAY_SIZE(tok));
101*1c60b9acSAndroid Build Coastguard Worker
102*1c60b9acSAndroid Build Coastguard Worker fd = 0;
103*1c60b9acSAndroid Build Coastguard Worker
104*1c60b9acSAndroid Build Coastguard Worker while (n > 0) {
105*1c60b9acSAndroid Build Coastguard Worker n = (int)read(fd, buf, sizeof(buf));
106*1c60b9acSAndroid Build Coastguard Worker if (n <= 0)
107*1c60b9acSAndroid Build Coastguard Worker continue;
108*1c60b9acSAndroid Build Coastguard Worker
109*1c60b9acSAndroid Build Coastguard Worker m = lejp_parse(&ctx, (uint8_t *)buf, n);
110*1c60b9acSAndroid Build Coastguard Worker if (m < 0 && m != LEJP_CONTINUE) {
111*1c60b9acSAndroid Build Coastguard Worker lwsl_err("parse failed %d\n", m);
112*1c60b9acSAndroid Build Coastguard Worker goto bail;
113*1c60b9acSAndroid Build Coastguard Worker }
114*1c60b9acSAndroid Build Coastguard Worker }
115*1c60b9acSAndroid Build Coastguard Worker lwsl_notice("okay (%d)\n", m);
116*1c60b9acSAndroid Build Coastguard Worker ret = 0;
117*1c60b9acSAndroid Build Coastguard Worker bail:
118*1c60b9acSAndroid Build Coastguard Worker lejp_destruct(&ctx);
119*1c60b9acSAndroid Build Coastguard Worker
120*1c60b9acSAndroid Build Coastguard Worker return ret;
121*1c60b9acSAndroid Build Coastguard Worker }
122