include certs in compiled output

This commit is contained in:
ading2210 2024-01-07 19:26:15 -05:00
parent 961ce1c37f
commit 663f31cd6e
4 changed files with 71 additions and 12 deletions

View file

@ -7,16 +7,13 @@ LIB_DIR="build/curl-wasm/lib/"
CACERT_FILE="cacert.pem"
OUT_FILE="out/libcurl.js"
EXPORTED_FUNCS="_main,_perform_request"
EXPORTED_FUNCS="_load_certs,_perform_request"
RUNTIME_METHODS="addFunction,removeFunction,allocate,ALLOC_NORMAL"
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 -sSINGLE_FILE -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
EMSCRIPTEN_OPTIONS="-lwebsocket.js -sWEBSOCKET_URL=wss://debug.ading.dev/ws -sSINGLE_FILE -sASYNCIFY -sALLOW_TABLE_GROWTH -sEXPORTED_FUNCTIONS=$EXPORTED_FUNCS -sEXPORTED_RUNTIME_METHODS=$RUNTIME_METHODS"
tools/all_deps.sh
tools/generate_cert.sh
rm -rf out
mkdir -p out

View file

@ -1,12 +1,13 @@
#include <stdlib.h>
#include <stdio.h>
#include <emscripten.h>
#include <string.h>
#include <emscripten.h>
#include "curl/curl.h"
#include "cjson/cJSON.h"
#include "curl/easy.h"
#include "curl/header.h"
#include "cjson/cJSON.h"
#include "cacert.h"
typedef void(*DataCallback)(char* chunk_ptr, int chunk_size);
typedef void(*EndCallback)(int error, char* response_json);
@ -170,6 +171,8 @@ char* copy_bytes(const char* ptr, const int size) {
return new_ptr;
}
int main() {
printf("emscripten libcurl module loaded\n");
void load_certs() {
FILE *file = fopen("/cacert.pem", "wb");
fwrite(_cacert_pem, 1, _cacert_pem_len, file);
fclose(file);
}

View file

@ -67,6 +67,33 @@ const status_messages = {
511: "Network Authentication Required"
}
//a case insensitive dictionary for request headers
class Headers {
constructor(obj) {
for (let key in obj) {
this[key] = obj[key];
}
return new Proxy(this, this);
}
get(target, prop) {
let keys = Object.keys(this);
for (let key of keys) {
if (key.toLowerCase() === prop.toLowerCase()) {
return this[key];
}
}
}
set(target, prop, value) {
let keys = Object.keys(this);
for (let key of keys) {
if (key.toLowerCase() === prop.toLowerCase()) {
this[key] = value;
}
}
this[prop] = value;
}
}
function is_str(obj) {
return typeof obj === 'string' || obj instanceof String;
}
@ -145,7 +172,7 @@ function create_response(response_data, response_info) {
return response_obj;
}
function libcurl_fetch(url, params={}) {
function create_options(params) {
let body = null;
if (params.body) {
if (is_str(params.body)) {
@ -156,10 +183,22 @@ function libcurl_fetch(url, params={}) {
}
params.body = true;
}
if (!params.headers) params.headers = {};
params.headers = new Headers(params.headers);
if (params.referer) {
if (!params.headers) params.headers = {};
params.headers["Referer"] = params.referer;
}
if (!params.headers["User-Agent"]) {
params.headers["User-Agent"] = navigator.userAgent;
}
return body;
}
function libcurl_fetch(url, params={}) {
let body = create_options(params);
return new Promise((resolve, reject) => {
let chunks = [];
@ -180,6 +219,8 @@ function libcurl_fetch(url, params={}) {
}
async function main() {
console.log("emscripten module loaded");
_load_certs();
console.log(await libcurl_fetch("https://httpbin.org/anything"));
}

18
client/tools/generate_cert.sh Executable file
View file

@ -0,0 +1,18 @@
#!/bin/bash
#export ca certs to a c header file
set -e
CURL_PREFIX=$(realpath build/curl-wasm)
CACERT_FILE="$(realpath build/cacert.pem)"
CACERT_HEADER="$CURL_PREFIX/include/cacert.h"
CACERT_DIR="$(dirname $CACERT_FILE)"
REPLACE_STR="$(echo $CACERT_DIR | tr '/-' '_')"
if [ ! -f $CACERT_FILE ]; then
wget "https://curl.se/ca/cacert.pem" -O $CACERT_FILE
fi
xxd -i $CACERT_FILE > $CACERT_HEADER
sed -i "s/$REPLACE_STR//" $CACERT_HEADER