Echo Server
To an Internet Computer app, incoming HTTP requests appear as a Candid blob. This echo server responds to an HTTP request by showing the blob in hex:
The source:
#define WASM_IMPORT(m,n) __attribute__((import_module(m))) __attribute__((import_name(n))); #define WASM_EXPORT(n) asm(n) __attribute__((visibility("default"))) typedef unsigned u32; u32 arg_size(void) WASM_IMPORT("ic0", "msg_arg_data_size"); void arg_copy(void *, u32, u32) WASM_IMPORT("ic0", "msg_arg_data_copy"); void reply_append(void *, u32) WASM_IMPORT("ic0", "msg_reply_data_append"); void reply(void) WASM_IMPORT("ic0", "msg_reply"); char hexdig(u32 i) { return i < 10 ? i + '0' : i + 'a' - 10; } void go() WASM_EXPORT("canister_query http_request"); void go() { enum { max = 16384 }; unsigned char buf[max]; u32 sz = arg_size(); sz = sz > max ? max : sz; arg_copy(buf, 0, sz); char msg[max*2 + 32]; char *p = msg; u32 i; for (i = 0; i < sz; i++) { *p++ = hexdig(buf[i] / 16); *p++ = hexdig(buf[i] % 16); } char hdr[] = "DIDL\x03\x6c\x03" "\xa2\xf5\xed\x88\x04\x01" "\xc6\xa4\xa1\x98\x06\x02" "\x9a\xa1\xb2\xf9\x0c\x7a\x6d" "\x7b\x6d\x6f\x01\x00"; char ftr[] = "\x00\xc8\x00"; reply_append(hdr, sizeof(hdr) - 1); char leb[5]; u32 n = 2*sz; for (i = 0; i < 4; i++) { leb[i] = (n & 127) | 128; n >>= 7; } leb[i] = n; reply_append(leb, 5); reply_append(msg, 2*sz); reply_append(ftr, sizeof(ftr) - 1); reply(); }
To compile:
$ clang --target=wasm32 -c echo.c $ wasm-ld --export-dynamic --allow-undefined --no-entry -o echo.wasm echo.c
To deploy:
$ touch nothing $ echo '{"canisters":{"echo":{"type":"custom","candid":"nothing","wasm":"echo.wasm","build":""}}}' > dfx.json $ dfx deploy