12

Websocket接続(Python Websocketクライアントを使用しています)を介してセッションID(httpサーバーに対する認証後に取得しました)を送信しようとしています。サーバー(Tornado Websocketサーバー)のヘッダーパラメーターとして渡す必要がありますすべてのヘッダーを読み取り、それらをチェックします。

問題は、既存のクライアント python Websocket 実装の 1 つを使用してヘッダーを追加するにはどうすればよいかということです。それらのどれもそれを行うことができないか、そもそも認証のために間違ったアプローチに従っているのでしょうか?

-- 更新 --、私が使用するコードのテンプレートの下:

def on_message(ws, message):
    print 'message received ..'
    print message


def on_error(ws, error):
    print 'error happened .. '
    print error


def on_close(ws):
    print "### closed ###"


def on_open(ws):

    print 'Opening Websocket connection to the server ... '

    ## This session_key I got, need to be passed over websocket header isntad of ws.send.
    ws.send(session_key)

if __name__ == "__main__":
    websocket.enableTrace(True)
    ws = websocket.WebSocketApp("ws://localhost:9999/track",
                                on_open = on_open,
                                on_message = on_message,
                                on_error = on_error,
                                on_close = on_close, 
                                )
    ws.on_open = on_open

    ws.run_forever()
4

2 に答える 2

12

この質問が出されてから、websocket-client が更新されて websocket ヘッダーが含まれるようになりました。これで、ヘッダー パラメーターのリストを文字列として簡単に渡すことができます。

custom_protocol = "your_protocol_here"
protocol_str = "Sec-WebSocket-Protocol: " + custom_protocol
ws = websocket.WebSocketApp("ws://localhost:9999/track",
                            on_open = on_open,
                            on_message = on_message,
                            on_error = on_error,
                            on_close = on_close, 
                            header = [protocol_str]
                            )

有効なヘッダーの完全なリストに関心がある場合は、websocket RFC6455 ドキュメントを参照してください: https://www.rfc-editor.org/rfc/rfc6455#section-4.3

GitHub ソース: https://github.com/liris/websocket-client/blob/master/websocket.py

于 2013-10-09T17:37:06.773 に答える
9

ソースコードを読むことほど楽しいことはありません :))

次のように、Websocket クライアント ライブラリのソース コードにモンキー パッチを適用して、イニシャライザで通常のパラメータとしてヘッダーを受信できるようにしました。

ws = websocket.WebSocketApp("ws://localhost:9999/track",
                                on_open    = on_open,
                                on_message = on_message,
                                on_error   = on_error,
                                on_close   = on_close, 
                                header     = {'head1:value1','head2:value2'} 
                                )

これは、ライブラリの websocket.py ソース コードの 3 行を編集することで実行できます。

1- ヘッダー パラメータを追加します。

   ## Line 877
   class WebSocketApp(object):
        """
        Higher level of APIs are provided.
        The interface is like JavaScript WebSocket object.
        """
        def __init__(self, url,
                     on_open = None, on_message = None, on_error = None,
                     on_close = None, keep_running = True, get_mask_key = None, header = None):

self.url = url
        self.on_open = on_open
        self.on_message = on_message
        self.on_error = on_error
        self.on_close = on_close
        self.keep_running = keep_running
        self.get_mask_key = get_mask_key
        self.sock = None
        self.header = header 

2- 次に、次のように、self.header を websocket connect メソッドにヘッダー パラメーターとして渡します。

## Line 732
self.sock.connect(self.url, header = self.header) 

実際に WebSocketApp クラスをインポートしようとしましたが、うまくいきませんでした。websocket.py モジュール全体が相互に依存しているため、機能させるために多くのものをインポートしていることがわかりました。この場合、サルのパッチ適用はより簡単でより確実です。 .

以上で、必要なすべてのヘッダーでパッチを適用したライブラリを使用して楽しんでください。

于 2013-01-23T05:37:04.897 に答える