Se non si desidera sovrascrivere il router (se l'app non è configurata in modo tale da supportarlo o se si desidera configurare CORS in base al percorso per percorso), aggiungere un gestore OPTIONS per gestire la richiesta pre-volo .
Cioè, con Gorilla Mux i tuoi percorsi sembrerebbero:
accounts := router.Path("/accounts").Subrouter()
accounts.Methods("POST").Handler(AccountsCreate)
accounts.Methods("OPTIONS").Handler(AccountsCreatePreFlight)
Nota sopra che oltre al nostro gestore POST, stiamo definendo un gestore del metodo OPTIONS specifico .
E quindi per gestire effettivamente il metodo di preflight OPTIONS, è possibile definire AccountsCreatePreFlight in questo modo:
// Check the origin is valid.
origin := r.Header.Get("Origin")
validOrigin, err := validateOrigin(origin)
if err != nil {
return err
}
// If it is, allow CORS.
if validOrigin {
w.Header().Set("Access-Control-Allow-Origin", origin)
w.Header().Set("Access-Control-Allow-Methods", "POST")
w.Header().Set("Access-Control-Allow-Headers",
"Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
}
Ciò che ha reso davvero tutto questo clic per me (oltre a comprendere effettivamente come funziona CORS) è che il Metodo HTTP di una richiesta di verifica preliminare è diverso dal Metodo HTTP della richiesta effettiva. Per avviare CORS, il browser invia una richiesta di verifica preliminare con OPTIONS del metodo HTTP, che è necessario gestire esplicitamente nel router, quindi, se riceve la risposta appropriata "Access-Control-Allow-Origin": origin
(o "*" per tutti) dall'applicazione, avvia l'effettivo richiesta.
Credo anche che tu possa fare "*" solo per tipi standard di richieste (es: GET), ma per altri dovrai impostare esplicitamente l'origine come faccio sopra.
w.Header().Add("Access-Control-Allow-Methods", "PUT") w.Header().Add("Access-Control-Allow-Headers", "Content-Type")