gqlgenでsubscriptionを使う時websocketでハマった
端的にいうと下記のような感じで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{}}))
同じようなハマり方してる人がいるかもしれないので残しておく。