Warum ist meine Cross-Domain-POST-Anfrage Preflight wird mit einem OPTIONS anfordern?

StackOverflow https://stackoverflow.com/questions/3489631

  •  28-09-2019
  •  | 
  •  

Frage

Nach dem Mozilla Developer Center HTTP Zugriffskontrolle Artikel, Cross-Site-POST Anfragen können „einfache“ sein - das heißt erfordern keine Preflighting -., wenn die Content-Type Anforderung application/x-www-form-urlencoded ist

ich dieses Verhalten in Firefox nicht immer, und ich verstehe überhaupt nicht, warum das so ist. Hier ist mein Setup-Code:

function makeXDomainRequest(url, method, data) {
    var req =
        typeof XDomainRequest !== "undefined" ?
        new XDomainRequest() : new XMLHttpRequest();

    req.open(method || "GET", url, true);

    if (typeof req.onload !== "undefined") {
        req.onload = onResponseLoad;
        req.onerror = onRequestError;
    } else {
        req.onreadystatechange = onRequestStateChange;
    }

    if (data && typeof req.setRequestHeader === "function") {
        req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    } else {
        // no way to set Content-Type req header in IE's XDomainRequest:
        // http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx
    }

    req.send(data || null);
}

function onResponseLoad() {
    alert("Response!\n" + this.responseText);
}

function onRequestError(args) {
    alert("Error!");
}

function onRequestStateChange() {
    if (this.readyState === 4) {
        if (this.status === 200) {
            onResponseLoad.apply(this);
        } else {
            onRequestError.apply(this);
        }
    }
}

Und hier ist der Server mich anzusprechen:

// thanks to http://saltybeagle.com/cors/ for having this demo endpoint:
var URL = "http://ucommbieber.unl.edu/CORS/cors.php";

Wenn ich nun eine einfache POST-Anforderung zu tun - mit Daten als application/x-www-form-urlencoded im Code gesendet oben - Antrag in Firefox Preflight mit einem OPTIONS anfordern. Es ist nicht in Chrome Preflight. Öffnen Sie Fiddler vor diesem Rennen für sich selbst zu sehen:

makeXDomainRequest(URL, "POST", "name=foobar");
// alerts "Response! Hello CORS [...] You sent a POST request. Your name is foobar"

Hier ist die Preflight-OPTIONS-Anforderung in Fiddler (Bekanntmachung des Access-Control-Request-Method: POST Header, obwohl ich einen vermeintlich sicheren Content-Type und keine benutzerdefinierten Header angegeben):

OPTIONS http://ucommbieber.unl.edu/CORS/cors.php HTTP/1.1
Host: ucommbieber.unl.edu
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Origin: http://localhost
Access-Control-Request-Method: POST

Was ist los? Ist das ein Bug in Firefox, oder bin ich etwas falsch? Dank!

War es hilfreich?

Lösung

Es in der Tat erwies sich als Firefox Bug zu sein. Es endete immer für FF4b6 behoben: https://bugzilla.mozilla.org/show_bug.cgi ? id = 588920

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top