2013-01-22 11 views
8

Próbuję wysłać identyfikator sesji (mam go po uwierzytelnieniu na serwerze http) przez połączenie websocket (używam klienta python websocket), muszę przekazać go jako nagłówek parametr, w którym serwer (serwer Tornado Websocket) odczyta wszystkie nagłówki i sprawi, że zostaną sprawdzone.Jak dodać więcej nagłówków w websocket python client

Pytanie brzmi: w jaki sposób mogę dodać nagłówki do korzystania z jednej z istniejących implementacji Web Pythona dla klienta, uważam, że żaden z nich nie może tego zrobić, czy też podążam niewłaściwym podejściem w pierwszej kolejności do uwierzytelniania?

- Update -, Poniżej szablonu kodu używam:

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

Czy możesz dodać kod do swojego pytania? Będzie dobrze, jeśli możesz dodać SSCCE http://sscce.org/ –

+0

Sprawdź moją aktualizację. – securecurve

Odpowiedz

4

Wygląda na to, że websocket-client został zaktualizowany tak, aby zawierał nagłówki websocket od czasu, gdy zadawano to pytanie. Teraz możesz po prostu przekazać listę parametrów nagłówka jako ciągi:

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

Jeśli są Państwo zainteresowani pełną listę prawidłowych nagłówków, zobacz dokument websocket RFC6455: http://tools.ietf.org/html/rfc6455#section-4.3

GitHub Źródło: https://github.com/liris/websocket-client/blob/master/websocket.py

+0

Ten nie działał, dlatego dodałem modyfikację kodu źródłowego, chyba że sam go przetestowałeś i zadziałało. – securecurve

+0

Tak, pomyślnie przetestowałem to.Spojrzałem na zmiany w źródle od twojej odpowiedzi w styczniu i od tego czasu poprawiono nieistniejący parametr nagłówka, więc pomyślałem, że zostawię alternatywną odpowiedź dla przyszłych widzów. Zobacz wiersz źródłowy 773: https://github.com/liris/websocket-client/blob/master/websocket.py#L773 – IanTheEngineer

+0

Tak, masz rację .. +1 dla aktualizacji :) – securecurve

7

Nic nie jest bardziej zabawny niż czytanie kodu źródłowego :))

ja małpa połatany kodu źródłowego biblioteki klienta Websocket, aby mógł odbierać nagłówek jako normalny parametr inicjalizatora, na przykład:

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

Można to zrobić ne przez edycja 3 linii w kodzie websocket.py biblioteki:

1- parametr dodawać nagłówek:

## 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- Następnie przechodzą self.header do websocket połączenia metody jako parametr nagłówka coś takiego:

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

Właściwie próbowałem zaimportować klasę WebSocketApp, ale to nie działa, ponieważ cały moduł websocket.py jest współzależne, że znalazłem się importem wiele rzeczy, aby to działało łatanie małp jest w tym przypadku łatwiejsze i solidniejsze.

To wszystko, ciesz się za pomocą biblioteki z poprawkami ze wszystkimi potrzebnymi nagłówkami.

+0

Walczę z podobnym tematem jak ty. Czy mogę zapytać, jak sobie z tym poradzić: Kiedy przekazujesz identyfikator sesji (z serwera http) do serwera websocket, zakładam, że po stronie serwera sprawdzany jest ten identyfikator sesji. Jak przechowywać ten identyfikator sesji? w bazie danych? i mam rację zakładając, że zarówno serwer http, jak i serwer websocket muszą korzystać z tej samej puli sesji identyfikatora? – maciekm

+0

Wartość domyślna dla argumentu nagłówka konwertera WebSocketApp jest myląca; header = []. W rzeczywistości nie powinna to być lista, ale słownik. –

Powiązane problemy