diff --git a/.vscode/settings.json b/.vscode/settings.json index 452fe18..cb7c0d5 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,6 @@ { "clangd.fallbackFlags": [ + "-I${workspaceFolder}/client/build/curl-wasm/include", "-I/usr/share/emscripten/cache/sysroot/include/", "-I/usr/lib/emscripten/system/include" ] diff --git a/client/build.sh b/client/build.sh index f8e2509..13aaafa 100755 --- a/client/build.sh +++ b/client/build.sh @@ -8,19 +8,15 @@ CACERT_FILE="cacert.pem" OUT_FILE="out/libcurl.js" EXPORTED_FUNCS="_main,_perform_request,_copy_bytes" -RUNTIME_METHODS="addFunction,removeFunction" -COMPILER_OPTIONS="-o $OUT_FILE -lcurl -lssl -lcrypto -I $INCLUDE_DIR -L $LIB_DIR" +RUNTIME_METHODS="addFunction,removeFunction,allocate" +COMPILER_OPTIONS="-o $OUT_FILE -lcurl -lssl -lcrypto -lcjson -I $INCLUDE_DIR -L $LIB_DIR" EMSCRIPTEN_OPTIONS="-lwebsocket.js -sWEBSOCKET_URL=wss://debug.ading.dev/ws -sASYNCIFY -sALLOW_TABLE_GROWTH -sEXPORTED_FUNCTIONS=$EXPORTED_FUNCS -sEXPORTED_RUNTIME_METHODS=$RUNTIME_METHODS --preload-file $CACERT_FILE" if [ ! -f $CACERT_FILE ]; then wget "https://curl.se/ca/cacert.pem" -O $CACERT_FILE fi -if [ ! -d $INCLUDE_DIR ]; then - mkdir -p build - tools/openssl.sh - tools/curl.sh -fi +tools/all_deps.sh mkdir -p out COMPILE_CMD="emcc main.c $COMPILER_OPTIONS $EMSCRIPTEN_OPTIONS" diff --git a/client/main.c b/client/main.c index 8fe9cb0..1f4f6f8 100644 --- a/client/main.c +++ b/client/main.c @@ -1,9 +1,11 @@ #include #include -#include #include #include +#include +#include + int write_function(void *data, size_t size, size_t nmemb, void(*data_callback)(char* chunk_ptr, int chunk_size)) { long real_size = size * nmemb; char* chunk = malloc(real_size); @@ -12,8 +14,8 @@ int write_function(void *data, size_t size, size_t nmemb, void(*data_callback)(c free(chunk); return real_size; } - -void perform_request(const char* url, void(*data_callback)(char* chunk_ptr, int chunk_size), void(*end_callback)()) { + +void perform_request(const char* url, const char* json_params, void(*data_callback)(char* chunk_ptr, int chunk_size), void(*end_callback)(int error)) { printf("downloading %s\n", url); CURL *http_handle; @@ -32,13 +34,23 @@ void perform_request(const char* url, void(*data_callback)(char* chunk_ptr, int //callbacks to pass the response data back to js curl_easy_setopt(http_handle, CURLOPT_WRITEFUNCTION, &write_function); curl_easy_setopt(http_handle, CURLOPT_WRITEDATA, data_callback); + + //parse json options + cJSON* json = cJSON_Parse(json_params); + cJSON* item = NULL; + cJSON_ArrayForEach(item, json) { + char* key = item->string; + printf("%s\n", key); + } + cJSON_Delete(json); multi_handle = curl_multi_init(); curl_multi_add_handle(multi_handle, http_handle); - + + CURLMcode mc; do { - CURLMcode mc = curl_multi_perform(multi_handle, &still_running); + mc = curl_multi_perform(multi_handle, &still_running); if(!mc) mc = curl_multi_poll(multi_handle, NULL, 0, 1000, NULL); @@ -58,7 +70,8 @@ void perform_request(const char* url, void(*data_callback)(char* chunk_ptr, int curl_multi_cleanup(multi_handle); curl_global_cleanup(); - (*end_callback)(); + int error = (int) mc; + (*end_callback)(error); } char* copy_bytes(const char* ptr, const int size) { diff --git a/client/main.js b/client/main.js index f02c8dc..ff92473 100644 --- a/client/main.js +++ b/client/main.js @@ -29,17 +29,21 @@ function silence_errs() { } //low level interface with c code -function perform_request(url, js_data_callback, js_end_callback) { +function perform_request(url, params, js_data_callback, js_end_callback) { + let params_str = JSON.stringify(params); let end_callback_ptr; let data_callback_ptr; let url_ptr = allocate_str(url); + let params_ptr = allocate_str(params_str); - let end_callback = () => { + let end_callback = (error) => { Module.removeFunction(end_callback_ptr); Module.removeFunction(data_callback_ptr); _free(url_ptr); + _free(params_ptr); - js_end_callback(); + if (error) console.error("request failed with error code "+error); + js_end_callback(error); } let data_callback = (chunk_ptr, chunk_size) => { @@ -48,9 +52,9 @@ function perform_request(url, js_data_callback, js_end_callback) { js_data_callback(chunk); } - end_callback_ptr = Module.addFunction(end_callback, "v"); + end_callback_ptr = Module.addFunction(end_callback, "vi"); data_callback_ptr = Module.addFunction(data_callback, "vii"); - _perform_request(url_ptr, data_callback_ptr, end_callback_ptr); + _perform_request(url_ptr, params_ptr, data_callback_ptr, end_callback_ptr); } function merge_arrays(arrays) { @@ -64,7 +68,7 @@ function merge_arrays(arrays) { return new_array; } -function libcurl_fetch(url) { +function libcurl_fetch(url, params={}) { return new Promise((resolve, reject) => { let chunks = []; let data_callback = (new_data) => { @@ -75,7 +79,7 @@ function libcurl_fetch(url) { let response_str = new TextDecoder().decode(response_data); resolve(response_str); } - perform_request(url, data_callback, finish_callback); + perform_request(url, params, data_callback, finish_callback); }) } diff --git a/client/tools/all_deps.sh b/client/tools/all_deps.sh index e6439a9..33e53e5 100755 --- a/client/tools/all_deps.sh +++ b/client/tools/all_deps.sh @@ -8,9 +8,15 @@ OPENSSL_PREFIX=$(realpath build/openssl-wasm) CJSON_PREFIX=$(realpath build/cjson-wasm) CURL_PREFIX=$(realpath build/curl-wasm) -tools/openssl.sh -tools/cjson.sh -tools/curl.sh +if [ ! -d $OPENSSL_PREFIX ]; then + tools/openssl.sh +fi +if [ ! -d $CJSON_PREFIX ]; then + tools/cjson.sh +fi +if [ ! -d $CURL_PREFIX ]; then + tools/curl.sh +fi cp -r $OPENSSL_PREFIX/* $CURL_PREFIX cp -r $CJSON_PREFIX/* $CURL_PREFIX \ No newline at end of file diff --git a/client/tools/cjson.sh b/client/tools/cjson.sh index b6505f6..acf7290 100755 --- a/client/tools/cjson.sh +++ b/client/tools/cjson.sh @@ -14,7 +14,10 @@ rm -rf cjson git clone -b master --depth=1 https://github.com/DaveGamble/cJSON cjson cd cjson -emmake make all +sed -i 's/-fstack-protector-strong//' Makefile +sed -i 's/-fstack-protector//' Makefile + +emmake make CC="emcc" static INCLUDE_FILES="cJSON.h cJSON_Utils.h" LIB_FILES="libcjson.a libcjson_utils.a"