Ho un'applicazione browser ecmascript 7 in esecuzione su http://localhost:3000 in un browser Firefox 44.0.2. Sta postando su un server Beego 1.6.0 in esecuzione su https://localdev.net:8443. Il 'localdev.net' si trova nella stessa casella e si risolve con l'indirizzo localhost. Il codice del browser è:CORS preleva da Firefox a Beego Il server si ferma dopo il pre-volo
var serverURL = 'https://localdev.net:8443/v1/user/login'
fetch(serverURL, {
method: 'post',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
mode: 'cors',
cache: 'default',
body: JSON.stringify({username: this.state.username, password: this.state.password})
})
.then(function(response){
if (response.status >= 200 && response.status < 300) {
return Promise.resolve(response)
}
return Promise.reject(new Error(response.statusText))
})
.then(function(data){
console.log('data: ' + data)
})
.catch((err) => console.error(serverURL, err.toString()))
}
Il server beego è configurato per gestire le richieste CORS come segue:
beego.InsertFilter("*", beego.BeforeRouter, cors.Allow(&cors.Options{
AllowOrigins: []string{"*"},
AllowMethods: []string{"*"},
AllowHeaders: []string{"Origin"},
ExposeHeaders: []string{"Content-Length"},
AllowCredentials: true,
}))
Wireshark vede il client che invia un pre-volo opzioni CORS richiesta al server:
OPTIONS /v1/user/login HTTP/1.1\r\n
Host: localdev.imaginout.net:8443\r\n
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:44.0) Gecko/20100101 Firefox/44.0\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n
Accept-Language: en-US,en;q=0.5\r\n
Accept-Encoding: gzip, deflate, br\r\n
Access-Control-Request-Method: POST\r\n
Access-Control-Request-Headers: content-type\r\n
Origin: http://localhost:3000\r\n
Connection: keep-alive\r\n
In risposta, le uscite del server beego:
2016/03/05 12:54:29 [router.go:828][D] | OPTIONS | /v1/user/login | 102.08µs | not match |
anche se il server dice 'non corrisponde', Wireshark registra una risposta:
HTTP/1.1 200 OK\r\n
Access-Control-Allow-Credentials: true\r\n
Access-Control-Allow-Origin: http://localhost:3000\r\n
Access-Control-Expose-Headers: Content-Length\r\n
Server: beegoServer:1.6.0\r\n
Date: Sat, 05 Mar 2016 17:54:29 GMT\r\n
Content-Length: 0\r\n
Content-Type: text/plain; charset=utf-8\r\n
Per me, lo stato 200 con un Access-Control-Allow-Origin impostato per il dominio del app del browser indica che il CORS pre-volo è riuscito, ma la console sviluppatore di Firefox mostra:
"https://localdev.net:8443/v1/user/login" TypeError: NetworkError when attempting to fetch resource.
Quindi l'applicazione e/o Firefox sembra pensare la richiesta non è riuscita. Wireshark mostra che l'app non invia un'altra richiesta al server. Mi aspetto un post.
Ci sono MOLTE domande su CORS, ma i browser/API/server sono molto variabili, quindi non ho trovato una corrispondenza esatta. Scavando in esso, ma ogni aiuto sarebbe apprezzato.
Provato a eseguire la richiesta da Chrome e dà un ulteriore errore nella console di sviluppo: "Il tipo di contenuto del campo di intestazione della richiesta non è consentito da Access-Control-Allow-Headers nella risposta di preflight." Dopo questo errore stampa "TypeError: Failed to get". –
Impostare AllowHeaders su "Origin, Content-Type" nella configurazione di Beego, ma ottenere lo stesso errore. La risposta pre-volo inviata da Beego non contiene un Access-Control-Allow-Headers impostato su "Origin, Content-Type". Sospetto che dovrebbe –