webentwicklung-frage-antwort-db.com.de

Ist es möglich, HTTP-Anforderungen mit WebAssembly zu übermitteln?

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;
}
9
DP_

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.

5
sbc100

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.

3
ColinE

Leider gibt es keine Möglichkeit, eine CORS-Anfrage von einer Website aus außer Google.com an Google.com zu richten.

Von MDN:

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.

0
Sora2455