同じようなハマり方してる人がいるかもしれないので残しておく。
端的にいうと下記のような感じでNewDefaultServer
を使っていると
srv := handler.NewDefaultServer(generated.NewExecutableSchema(generated.Config{Resolvers: &graph.Resolver{}}))
ここに書いてある通り下記のコードを足してもunable to upgrade *http.response to websocket websocket: 'Origin' header value not allowed
とか言われてしまう。
srv.AddTransport(&transport.Websocket{
Upgrader: websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool {
// Check against your desired domains here
return r.Host == "example.org"
},
ReadBufferSize: 1024,
WriteBufferSize: 1024,
},
})
理由はNewDefaultServer
内で下記のようなコードが書かれているために
srv.AddTransport(transport.Websocket{
KeepAlivePingInterval: 10 * time.Second,
})
gorilla/websocket内のこのへんでcheckSameOriginが入り落ちる。
checkOrigin := u.CheckOrigin
if checkOrigin == nil {
checkOrigin = checkSameOrigin
}
if !checkOrigin(r) {
return u.returnError(w, r, http.StatusForbidden, "websocket: 'Origin' header value not allowed")
}
https://github.com/gorilla/websocket/blob/b65e62901fc1c0d968042419e74789f6af455eb9/server.go#L146
自分でNewして必要なものだけAddTransportしよう。
srv := handler.New(generated.NewExecutableSchema(generated.Config{Resolvers: &graph.Resolver{}}))