J'essaie de soumettre une simple requête HTTP GET dans WebAssembly. À cette fin, j’ai écrit ce programme (copié à partir de site Emscripten avec de légères modifications):
#include <stdio.h>
#include <string.h>
#ifdef __EMSCRIPTEN__
#include <emscripten/fetch.h>
#include <emscripten.h>
#endif
void downloadSucceeded(emscripten_fetch_t *fetch) {
printf("Finished downloading %llu bytes from URL %s.\n", fetch->numBytes, fetch->url);
// The data is now available at fetch->data[0] through fetch->data[fetch->numBytes-1];
emscripten_fetch_close(fetch); // Free data associated with the fetch.
}
void downloadFailed(emscripten_fetch_t *fetch) {
printf("Downloading %s failed, HTTP failure status code: %d.\n", fetch->url, fetch->status);
emscripten_fetch_close(fetch); // Also free data on failure.
}
unsigned int EMSCRIPTEN_KEEPALIVE GetRequest() {
emscripten_fetch_attr_t attr;
emscripten_fetch_attr_init(&attr);
strcpy(attr.requestMethod, "GET");
attr.attributes = EMSCRIPTEN_FETCH_LOAD_TO_MEMORY;
attr.onsuccess = downloadSucceeded;
attr.onerror = downloadFailed;
emscripten_fetch(&attr, "http://google.com");
return 1;
}
Quand je le compile en utilisant $EMSCRIPTEN/emcc main.c -O1 -s MODULARIZE=1 -s WASM=1 -o main.js --emrun -s FETCH=1
j'obtiens l'erreur
ERROR:root:FETCH not yet compatible with wasm (shared.make_fetch_worker is asm.js-specific)
Existe-t-il un moyen d'exécuter des requêtes HTTP à partir de WebAssembly? Si oui, comment puis-je le faire?
Update 1: Le code suivant tente d'envoyer une demande GET
, mais échoue en raison de problèmes liés au CORS.
#include <stdio.h>
#include <string.h>
#ifdef __EMSCRIPTEN__
#include <emscripten/fetch.h>
#include <emscripten.h>
#endif
unsigned int EMSCRIPTEN_KEEPALIVE GetRequest() {
EM_ASM({
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://google.com");
xhr.send();
});
return 1;
}
J'ai récemment rencontré ce problème avec esmcripten corrigé dans: https://github.com/kripken/emscripten/pull/7010
Vous devriez maintenant pouvoir utiliser FETCH = 1 et WASM = 1 ensemble.
Non, vous ne pouvez pas exécuter de requête HTTP à partir de WebAssembly (ni accéder à DOM ou à toute autre API de navigateur). WebAssembly en tant que tel n’a aucun accès à son environnement hôte, il n’a donc aucune fonctionnalité intégrée IO.
Vous pouvez cependant exporter des fonctions de WebAssembly et importer des fonctions de l'environnement hôte. Cela vous permettra de faire des requêtes HTTP indirectement via l'hôte.
Malheureusement, il n’existe aucun moyen de faire une demande CORS à Google.com depuis un site Web autre que Google.com.
Pour des raisons de sécurité, les navigateurs limitent les requêtes HTTP cross-Origin initiées à partir de scripts. Par exemple, XMLHttpRequest et l'API Fetch suivent la stratégie de même origine. Cela signifie qu'une application Web utilisant ces API peut uniquement demander des ressources HTTP à partir de la même origine à partir de laquelle l'application a été chargée, à moins que la réponse de l'autre origine ne comporte les bons en-têtes CORS.
Google n'inclut pas ces en-têtes.
Parce que JavaScript/WebAssembly s'exécute sur la machine du client (pas la vôtre), vous pourriez faire des choses désagréables si cela n'était pas en place, comme faire POST des demandes à www.mybankingwebsite.com/makeTransaction avec les cookies du client.
Si vous voulez diriger le code que vous avez dans la mise à jour 1 vers votre propre site ou l'exécuter sur Node.js, cela devrait fonctionner correctement.