2013-01-22 7 views
8

Ich versuche Session-ID (ich habe es nach der Authentifizierung gegen HTTP-Server) über eine Websocket-Verbindung (ich benutze Python WebSocket Client), ich muss es als übergeben Ein Header Parameter, wo der Server (Tornado Websocket Server) wird alle Header lesen und sie überprüft bekommen. Die Frage ist: Wie kann ich Header hinzufügen, um eine der vorhandenen Client Python Websocket-Implementierungen zu verwenden, ich finde, dass keine von ihnen das kann, oder folge ich dem falschen Ansatz an erster Stelle für die Authentifizierung?Wie fügt man mehr Header in Websocket Python-Client

- Update -, Unterhalb einer Vorlage des Codes verwende ich:

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() 
+0

Können Sie Ihrer Frage einen Code hinzufügen? Es wird gut sein, wenn Sie ein SSCCE hinzufügen können http://sscce.org/ –

+0

Überprüfen Sie mein Update. – securecurve

Antwort

4

Es scheint, dass Websocket-Client aktualisiert wurde, um Websocket-Header zu enthalten, seit diese Frage gestellt wurde. Jetzt können Sie einfach eine Liste von Header-Parameter als Strings übergeben:

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] 
          ) 

Wenn Sie sich für die vollständige Liste der gültigen Header sind, finden Sie in der websocket RFC6455 Dokument: http://tools.ietf.org/html/rfc6455#section-4.3

GitHub Quelle: https://github.com/liris/websocket-client/blob/master/websocket.py

+0

Dies hat nicht funktioniert, deshalb habe ich die Änderung des Quellcodes hinzugefügt .. es sei denn, Sie haben es selbst getestet und es hat für Sie funktioniert – securecurve

+0

Ja, ich habe es erfolgreich getestet.Ich habe mir die Änderungen an der Quelle seit Ihrer Antwort im Januar angeschaut und seitdem haben sie den nicht vorhandenen Header-Parameter korrigiert, also dachte ich, ich würde hier eine alternative Antwort für zukünftige Zuschauer hinterlassen. Siehe Quellzeile 773: https://github.com/liris/websocket-client/blob/master/websocket.py#L773 – IanTheEngineer

+0

Ja, du hast Recht .. +1 für das Update :) – securecurve

7

Nichts amüsanter als das Lesen des Quellcodes :))

I Affe ist der Quellcode gepatcht der Websocket Client-Bibliothek zu machen, sie in der Lage einen Kopf wie ein normaler Parameter in der Initialisierungsliste, wie dies zu erhalten: Dies kann

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

tun werden ne bearbeite 3 Zeilen in der websocket.py Quellcode der Bibliothek:

1- Add Header-Parameter:

## 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- Dann passieren die self.header WebSocket Methode als Header-Parameter verbinden , wie folgt aus:

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

Eigentlich habe ich versucht, die WebSocketApp Klasse zu importieren, aber es hat nicht funktioniert, da der ganz websocket.py Modul voneinander abhängig ist, dass ich fand ich eine Menge Dinge zu importieren, damit es funktioniert Affepatching ist in diesem Fall einfacher und solider.

Das ist alles, viel Spaß mit Ihrer gepatchten Bibliothek mit allen Überschriften, die Sie brauchen.

+0

Ich kämpfe mit ähnlichen Themen wie Sie. Kann ich Sie fragen, wie Sie mit dieser Situation umgehen: Wenn Sie Sitzungs-ID (von http-Server) zu WebSocket-Server übergeben, nehme ich an, Sie überprüfen auf der Serverseite ist diese Session-ID gültig. Wie speichern Sie diese Sitzungs-ID? in der Datenbank? und ich bin richtig in der Annahme, dass sowohl HTTP-Server und Websocket-Server den gleichen Pool von ID-Sitzung verwenden müssen? – maciekm

+0

Der Standardwert für Header-Argument des WebSocketApp-Konstruktors ist verwirrend; Überschrift = []. Eigentlich sollte es keine Liste sein, sondern ein Wörterbuch. –

Verwandte Themen