2016-07-14 11 views
1

Need OPTIONS Methode kommt aus mobilem Gerät zu akzeptieren, versuchten mehr Möglichkeiten, so und immer seltsames Verhalten zu tun:Wie kann man die OPTIONS-Methode von Mobilgeräten mit Gorilla-Handler zulassen?

, wenn dies versucht, ich 403 vom Client erhalten: (Client sendet OPTIONS vor POST)

import (
    "net/http" 

    "github.com/gorilla/handlers" 
    "github.com/gorilla/mux" 
) 

func main() { 
    r := mux.NewRouter() 
    r.HandleFunc("/users", UserEndpoint) 
    r.HandleFunc("/projects", ProjectEndpoint) 

    methods := handlers.AllowedMethods([]string{"OPTIONS", "DELETE", "GET", "HEAD", "POST"} 

    http.ListenAndServe(":8000", handlers.CORS(methods)(r)) 
} 

wenn ich weglassen die methods:

 http.ListenAndServe(":8000", handlers.CORS()(r)) 

ich werde 403 nicht autorisiert

Auch um spielte mit ihm, entfernt, um die GET Methode:

methods := handlers.AllowedMethods([]string{"OPTIONS"} 

http.ListenAndServe(":8000", handlers.CORS(methods)(r)) 

aber noch eine 200 GET, wenn sie von Rest-Client in Browser (chromes DHC)

versucht bekommen konnte, aber wenn ich entfernen die OPTIONS :

methods := handlers.AllowedMethods([]string{"DELETE", "GET", "HEAD", "POST"} 

http.ListenAndServe(":8000", handlers.CORS(methods)(r)) 

ich 405

Das erste Beispiel basiert auf Gorilla-Handler-Dokumentation

Irgendwelche Ideen zu diesem Thema?

corsOptionMethod   string = "OPTIONS" 
... 

    if r.Method == corsOptionMethod { 
     if ch.ignoreOptions { 
      ch.h.ServeHTTP(w, r) 
      return 
     } 

     if _, ok := r.Header[corsRequestMethodHeader]; !ok { 
      w.WriteHeader(http.StatusBadRequest) 
      return 
     } 

     method := r.Header.Get(corsRequestMethodHeader) 
     if !ch.isMatch(method, ch.allowedMethods) { 
      w.WriteHeader(http.StatusMethodNotAllowed) 
      return 
     } 
... 

So 405 ist http.StatusMethodNotAllowed, so ist es vielleicht nicht CORS-Request-Header:

Dank

Antwort

0

Wenn Sie bei cors.go Optionen aussehen werden besonders behandelt?

Es gibt auch eine IngoreOptions-Methode für die unabhängige Verarbeitung von Optionen: http://www.gorillatoolkit.org/pkg/handlers#IgnoreOptions - vielleicht funktioniert das in Ihrem Fall und Sie können es einfach ignorieren oder Optionen selbständig bearbeiten.

+0

Wird 'OPTIONS' nicht ignoriert und dann in Cors Optionen widersprechen? –

2

Sie müssen wirklich die Anfrage wird verstehen gegeben, aber ich hatte ein ähnliches Problem und es gelöst mit:

handlers.CORS(
     handlers.AllowedOrigins([]string{"*"}), 
     handlers.AllowedMethods([]string{"POST"}), 
     handlers.AllowedHeaders([]string{"Content-Type", "X-Requested-With"}), 
    )(router) 

Die Anfrage ich machen musste (die einen Preflight nachahmt) war:

curl -H "Origin: http://example.com" \ 
-H "Access-Control-Request-Method: POST" \ 
-H "Access-Control-Request-Headers: X-Requested-With" \ 
-X OPTIONS --verbose http://127.0.0.1:8080/products 

Es war wirklich die AllowedHeaders func, die den Unterschied machte. Sobald ich das hinzugefügt habe, verschwand der 403 Fehler.