4

Go で gorilla-websocket をいじっていて、基本的な echo の例を実装したので、サーバーのデプロイ後にエラーをログに記録しました。

オリジンが見つかりません Websocket バージョン != 13

オリジンをチェックする関数が常にtrueを返すようにすることで、これを回避する方法を見つけました

var wsUpgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
    CheckOrigin: func(r *http.Request) bool {
        return true
    },
}

しかし、それは正しくありません。したがって、私はその問題を解決する方法を探しています。

更新:問題をもう一度見てみると、実際にはオリジンヘッダーをクライアント実装に追加しようとしているようです。これは、javascript websocket 実装です。

@benjic Imは、同じサーバーでホストされていないが、Chromeを介してローカルで実行されているjavascript html5アプリケーションを介してwebsocketに接続しています

では、どうすればよいのでしょうか。

4

2 に答える 2

5

Gorilla WebSocket ドキュメントを読むCheckOriginと、型のフィールドにnil 値が指定されている場合Upgrader、安全なデフォルトが使用されることがわかります。デフォルトでは、リクエストを許可する前に、着信リクエストのOriginフィールドとHostヘッダー値が等しいことを確認します。ドキュメントは、ブラウザーがクロス オリジンの有効性を強制せず、強制するのはサーバー アプリケーションの責任であることを示しています。これがどのように行われるかは、Gorilla ライブラリのソース コードで正確に確認できます。

ドキュメントとソースは、上記のサンプル コードのファクトリとしてUpgrade機能するパッケージ内の関数を示しています。ファクトリ関数はカスタム バッファ サイズを取り、常に true を返すように CheckOrigin をオーバーライドします。カスタムを作成する代わりに、このファクトリ関数を使用して接続をアップグレードできます。websocketUpgraderHttpHandler

func webSocketHandler(w http.ResponseWriter, r *http.Request) {
    conn, err := websocket.Upgrade(w, r, nil, 1024, 1024)
    defer conn.Close()

    if err != nil {
        http.Error(w, err, http.StatusInternalServerError)
        return
    }

    conn.WriteMessage(websocket.TextMessage, []byte("Hello, world!"))
}
于 2015-10-25T02:59:50.020 に答える