Ich versuche, eine einfache HTTP-GET-Anforderung in WebAssembly zu senden. Zu diesem Zweck habe ich dieses Programm geschrieben (kopiert von Emscripten site mit leichten Modifikationen):
#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;
}
Wenn ich es mit $EMSCRIPTEN/emcc main.c -O1 -s MODULARIZE=1 -s WASM=1 -o main.js --emrun -s FETCH=1
kompiliere, erhalte ich den Fehler
ERROR:root:FETCH not yet compatible with wasm (shared.make_fetch_worker is asm.js-specific)
Gibt es eine Möglichkeit, HTTP-Anforderungen von WebAssembly auszuführen? Wenn ja, wie kann ich das machen?
Update 1: Der folgende Code versucht, eine GET
-Anforderung zu senden, schlägt jedoch aufgrund von CORS-Problemen fehl.
#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;
}
Ich habe dieses Problem kürzlich mit esmcripten überarbeitet, das in folgendem behoben wurde: https://github.com/kripken/emscripten/pull/7010
Sie sollten jetzt FETCH = 1 und WASM = 1 zusammen verwenden können.
Nein, Sie können keine HTTP-Anforderung von WebAssembly ausführen (oder auf DOM oder andere Browser-APIs zugreifen). WebAssembly hat an sich keinen Zugriff auf die Host-Umgebung und verfügt daher über keine integrierten IO - Funktionen.
Sie können jedoch Funktionen aus WebAssembly exportieren und Funktionen aus der Host-Umgebung importieren. Auf diese Weise können Sie HTTP-Anforderungen indirekt über den Host stellen.
Leider gibt es keine Möglichkeit, eine CORS-Anfrage von einer Website aus außer Google.com an Google.com zu richten.
Aus Sicherheitsgründen beschränken Browser Cross-Origin-HTTP-Anforderungen, die innerhalb von Skripts initiiert werden. Beispielsweise folgen XMLHttpRequest und die Fetch-API der Origin-Richtlinie. Dies bedeutet, dass eine Webanwendung, die diese APIs verwendet, nur HTTP-Ressourcen von demselben Origin anfordern kann, aus dem die Anwendung geladen wurde, es sei denn, die Antwort des anderen Origin enthält die richtigen CORS-Header.
Google enthält diese Header nicht.
Da JavaScript/WebAssembly auf dem Client-Computer (nicht auf Ihrem Computer) ausgeführt wird, können Sie böse Dinge tun, wenn dies nicht der Fall ist, z. B. make POST Anfragen an www.mybankingwebsite.com/makeTransaction mit den Cookies des Kunden.
Wenn Sie den Code, den Sie in Update 1 haben, auf Ihre eigene Site verweisen oder ihn unter Node.js ausführen möchten, sollte dies problemlos funktionieren.