2017-06-21 1 views
1

demande ++ C ressemble à ceComment configurer des champs d'en-tête personnalisé pour emscripten Fetch API de C++

emscripten_fetch_attr_t attr; 
emscripten_fetch_attr_init(&attr); 
strcpy(attr.requestMethod, "GET"); 

// case 1  
// static std::vector<const char*> custom_headers = {"Token", "00000000", nullptr}; 
// attr.requestHeaders = custom_headers.data(); 

// case 2 
static const char* custom_headers[3] = {"Token", "00000000-0000-0000-0000-000000000000", nullptr}; 
attr.requestHeaders = custom_headers; 

attr.attributes = EMSCRIPTEN_FETCH_LOAD_TO_MEMORY; 
attr.onsuccess = onDownload; 
attr.onerror = onError; 
emscripten_fetch(&attr, "http://localhost:9080/api/session"); 

XHR fonctionne bien, sauf les champs d'en-tête - ils ne sont pas définies dans les deux cas. Doc commentaire de emscripten_fetch_attr_t struct dire:

// Points to an array of strings to pass custom headers to the request. This array takes the form 
// {"key1", "value1", "key2", "value2", "key3", "value3", ..., 0 }; Note especially that the array 
// needs to be terminated with a null pointer. 
const char * const *requestHeaders; 

Emscripten FetchAPI reference et code tests n'a pas exemple d'utilisation requestHeaders.

Comment exactement définir mes propres champs d'en-tête de demande?

Répondre

1

Raison pour laquelle il n'a pas affecté les en-têtes personnalisés est vraiment stupide - il n'a pas valide et testé la mise en œuvre dans la version actuelle encore:

emscripten/1.37.13/system/lib/chercher/emscripten_fetch. cpp: ligne 78

fetch->__attributes.requestHeaders = 0;// TODO:strdup(fetch->__attributes.requestHeaders); 

solution temporaire Comme il suffit d'attribuer simplement à se

fetch->__attributes.requestHeaders = fetch->__attributes.requestHeaders 

Et vous serez en mesure d'utiliser la deuxième cas de ma question:

static const char* custom_headers[3] = {"Token", "00000000-0000-0000-0000-000000000000", nullptr}; 
attr.requestHeaders = custom_headers; 
+0

cela n'a aucun sens. si 'fetch -> __ attributes.requestHeaders' est nul, l'assigner à lui-même va écraser null par null. – mchiasson

+0

mais oui, 'fetch -> __ attributes.requestHeaders' est nul. J'ai essayé de le faire à la place: 'fetch -> __ attributes.requestHeaders = custom_headers', mais ça ne marche toujours pas pour moi. les en-têtes ne passent pas. – mchiasson

+0

@mchiasson la ligne ci-dessus ressemble à 'fetch -> __ attributes.password = fetch -> __ attributes.password? strdup (fetch -> __ attributes.password): 0; // TODO: gratuit'. Vous devriez probablement faire la même vérification sauf que vous avez besoin de 'strdup' personnalisé, parce que les en-têtes sont des chaînes de clé et de valeur terminées par zéro et la fin de tous les en-têtes devrait également être' \ 0'. – Sugar