CORS / xhr.getRequestHeaders

Salutations,

J'essaie d'utiliser CORS ( http://www.w3.org/TR/2009/WD-cors-20090317/#access-control-allow-methods-header ) pour une application sur Safari, et lorsque j'essaie de lire Les en-têtes de réponse de XMLHTTPRequest, je ne reçois que le Content-Type. Aucun des autres en-têtes assez standard ne se déroule, et je ne peux pas comprendre comment cela fonctionne.

Quelqu'un connaitrait-il comment résoudre ce problème? Cela pourrait-il être un bug WebKit?

modifier

Voici la configuration que j'utilise avec nGinx:

add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers Cache-Control,Pragma,Date; add_header Access-Control-Allow-Methods GET,POST; 

Pour que les en-têtes soient exposés à JS, vous devez définir l'en Access-Control-Expose-Headers tête Access-Control-Expose-Headers dans une liste séparée par une virgule des en-têtes que vous souhaitez exposer.

Malheureusement, cet en-tête est mal pris en charge. Mozilla ne l'a mis en œuvre que dans Firefox 4, Webkit à partir de ce moment ne l' implique toujours pas . Je ne suis pas sûr d'IE8 et plus (google n'a pas trouvé d'utilité utile, et je ne les ai pas pour tester avec moi-même).

(Voir aussi, par exemple, les restrictions du getResponseHeader de XMLHttpRequest ()? )

Avez-vous vérifié que votre serveur émettait effectivement les en-têtes Cache-Control, Pragma et Date? Peut-être configurer une trace Wireshark sur le client pour voir les en-têtes HTTP réels échangés?

J'ai déjà eu la même situation hier. https://stackoverflow.com/users/713326/gijs vous a donné la bonne réponse, mais il y a une autre partie qui est spécifique à nginx que vous devez prendre soin. "Ajouter l'en-tête" ne fonctionne que dans le cas où la réponse d'un service a réussi (200, 204, 301, 302 ou 304). Vous devez faire une compilation personnalisée de nginx pour inclure HttpHeadersMoreModule ( http://wiki.nginx.org/HttpHeadersMoreModule ). Après avoir remplacé add_header par more_set_headers.

Exemple:

  more_set_headers 'Access-Control-Allow-Origin: $http_origin'; more_set_headers 'Access-Control-Allow-Credentials: false'; more_set_headers 'Access-Control-Allow-Methods: GET, POST, OPTIONS, HEAD, PUT, PATCH, DELETE'; more_set_headers 'Access-Control-Allow-Headers:Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Accept,Authorization; more_set_headers 'Access-Control-Expose-Headers: Location'; 

DEMANDE:

 $.ajax({ url: "http://localhost:8079/students/add/", type: "POST", crossDomain: true, data: JSON.stringify(somejson), dataType: "json", success: function (response) { var resp = JSON.parse(response) alert(resp.status); }, error: function (xhr, status) { alert("error"); } }); 

RÉPONSE:

 response = HttpResponse(json.dumps('{"status" : "success"}')) response.__setitem__("Content-type", "application/json") response.__setitem__("Access-Control-Allow-Origin", "*") return response