-
-
Save oz/2355431 to your computer and use it in GitHub Desktop.
/** | |
* A simple Tofu example to speak JSON. | |
* | |
* Compile: | |
* If you make-installed Tofu, skip the -I/-L flags. If not, export | |
* TOFU=/wherever/you/git-cloned/and/built/Tofu | |
* | |
* $ gcc hello.c -ltofu -ljansson -I$TOFU/include -L$TOFU/src/.libs -o hello | |
* | |
* Run: | |
* $ ./hello | |
* Server started at http://0.0.0.0:8080/ | |
* | |
* Check: | |
* $ curl http://localhost:8080/hello/world | |
* {"hello": "world"} | |
* $ | |
* | |
*/ | |
#include <stdio.h> | |
#include <jansson.h> | |
#include <tofu.h> | |
#define LISTEN_ADDR "0.0.0.0" | |
#define LISTEN_PORT "8080" | |
tofu_rep_t *hello(tofu_req_t *req, void *argp) { | |
tofu_rep_t *rep = tofu_rep_init(); | |
char *reply = NULL; | |
char *param = tofu_param(req, "name"); | |
json_t *obj = json_object(); | |
json_object_set(obj, "hello", json_string(param)); | |
reply = json_dumps(obj, JSON_ENSURE_ASCII); | |
tofu_head(rep, "Content-Type", "text/plain"); | |
tofu_write(rep, reply); | |
tofu_write(rep, "\n"); | |
free(reply); | |
return rep; | |
} | |
int main(int ac, char ** av) { | |
char *opts[] = { LISTEN_ADDR, LISTEN_PORT }; | |
tofu_ctx_t *ctx = tofu_ctx_init(TOFU_EVHTTP, opts); | |
tofu_handle_with(ctx, GET, "/hello/:name", hello, 0x0); | |
fprintf(stdout, "Server started at http://%s:%s/\n", | |
LISTEN_ADDR, LISTEN_PORT); | |
tofu_loop(ctx); | |
return 0; | |
} |
I think this example leaks memory. Shouldn't it free the obj
pointer in hello
?
@francois2metz You're absolutely right! if you plan to use JSON, that's the way to go. In this example however, I simply copied the behavior of the latest Go app @nono built. It's just more obvious here since the Content-Type is in plain sight... Plus for people like my mom, who are not using curl
, having a text/plain
header helps testing in a browser too. :p
@nono Yup. However, Jansson's lib is a little trickier than that, and one would rather play with json_decref
than free
to let the lib do its own GC once the refcount drops to zero. I did not check thoroughly, but I'm quite sure Tofu's HEAD on master leaks memory by itself too (hey there is a PoC-only warning in their README afterall).
Thanks for your remarks. :)
The Content-type should be application/json :)