Comment ajouter des en-têtes dans websocket client python
Je suis en train d'envoyer l'id de session (je l'ai eu après l'authentification avec le serveur http) sur une connexion websocket (je suis à l'aide de python client websocket), j'ai besoin de passer comme un en-tête paramètre, dans lequel le serveur (Tornade serveur Websocket) va lire tous les en-têtes et de les faire vérifier.
La question est: comment puis-je ajouter des en-têtes à l'aide de l'un de ces client python Websocket implémentations, je trouve aucun d'eux ne peut faire, ou suis-je à la suite de la mauvaise approche en premier lieu pour l'authentification?
-- Update --, ci-Dessous un modèle de code que j'utilise:
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()
Pouvez-vous ajouter un peu de code à votre question? Il sera bon si vous pouvez ajouter une SSCCE sscce.org
Vérifier ma mise à jour.
Vérifier ma mise à jour.
OriginalL'auteur securecurve | 2013-01-22
Vous devez vous connecter pour publier un commentaire.
Il semble que websocket-client a été mis à jour pour inclure websocket en-têtes depuis que cette question a été posée. Maintenant, vous pouvez simplement passer d'une liste de paramètres d'en-tête comme des chaînes de caractères:
Si vous êtes intéressé par la liste complète des valides en-têtes, voir le websocket RFC6455 document: http://tools.ietf.org/html/rfc6455#section-4.3
GitHub Source: https://github.com/liris/websocket-client/blob/master/websocket.py
Oui, j'ai testé avec succès il. J'ai regardé les modifications apportées à la source depuis votre réponse en janvier, et depuis lors, ils ont fixé le non-être de l'en-tête param, alors j'ai pensé que je voudrais vous laisser une autre réponse ici pour les futurs téléspectateurs. Voir la source de la ligne de 773: github.com/liris/websocket-client/blob/master/websocket.py#L773
Oui, vous avez raison .. +1 pour la mise à jour 🙂
Il semble aussi accepter un dictionnaire au lieu d'une liste de chaînes formatées, de sorte que vous pourriez avoir utilisé
header={'Sec-WebSocket-Protocol': custom_protocol}
. Cela peut rendre plus facile à coder.Vrai, réponse acceptée!
OriginalL'auteur IanTheEngineer
Rien n'est plus amusant que de lire le code source :))
Je singe patché le code source du client Websocket de la bibliothèque pour la rendre capable de recevoir un en-tête comme une normale de paramètre dans l'initialiseur, comme ceci:
Cela peut être fait par l'édition de 3 lignes dans le websocket.py le code source de la bibliothèque:
1 - Ajouter un paramètre d'en-tête:
2 - Ensuite, passez l'.l'en-tête de websocket méthode de connexion, comme un en-tête de paramètre, comme ceci:
En fait j'ai essayé d'importer le WebSocketApp classe, mais il n'a pas de travail, comme l'ensemble de la websocket.py le module est interdépendant, que je me suis retrouvé à l'importation de beaucoup de choses pour le faire fonctionner, monkey patching est plus facile et plus solide dans ce cas.
C'est tout, profiter de l'aide de votre patché bibliothèque avec tous les en-têtes dont vous avez besoin.
Valeur par défaut de l'en-tête argument de WebSocketApp constructeur est source de confusion; en-tête=[] . En fait, il ne devrait pas être une liste, mais un dictionnaire.
OriginalL'auteur securecurve