Blog.Valletta.io

日々やってきたことの備忘録的なやつ

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{}}))

同じようなハマり方してる人がいるかもしれないので残しておく。