2013-12-21 4 views
2

У меня есть следующий код для моего питона сервера, чтобы создать и отправить обратно ответ на рукопожатияПочему подтверждение подключения к websocket не выполняется?

def HandShake(self, request): 
    specificationGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" 
    websocketkey = "" 
    protocol = "" 
    for line in request.split("\n"): 
     if "Sec-WebSocket-Key:" in line: 
      websocketkey = line.split(" ")[1] 
     elif "Sec-WebSocket-Protocol" in line: 
      protocol = line.split(":")[1].strip() 

    print("websocketkey: " + websocketkey + "\n") 
    fullKey = hashlib.sha1(websocketkey.encode("utf-8") + specificationGUID.encode("utf-8")).digest() 
    acceptKey = base64.b64encode(fullKey) 
    print("acceptKey: " + str(acceptKey, "utf-8") + "\n") 
    if protocol != "": 
     handshake = "HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: " + str(acceptKey, "utf-8") + "\r\nSec-WebSocket-Protocol: " + protocol + "\r\n\r\n" 
    else: 
     handshake = "HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: " + str(acceptKey, "utf-8") + "\r\n\r\n" 
    print(handshake) 
    self.request.send(bytes(handshake, "utf-8")) 

Я проверил мой метод вычисления ключа с примером на википедии, поэтому я знаю, что это правильно. Однако каждый раз, когда я пытаюсь подключиться к серверу я получаю после ошибки:

Error during WebSocket handshake: Sec-WebSocket-Accept mismatch 

Я не понимаю, что я делаю неправильно здесь. кто-то видит, что происходит не так?

EDIT: пример вывода из гравюр, печатается исходное сообщение и сфабрикованные рукопожатия

server started, waiting for connections... 
request: 
GET/HTTP/1.1 
Upgrade: websocket 
Connection: Upgrade 
Host: localhost:600 
Origin: http://localhost 
Pragma: no-cache 
Cache-Control: no-cache 
Sec-WebSocket-Key: yLffHPqMU4gIW2WnKq+4BQ== 
Sec-WebSocket-Version: 13 
Sec-WebSocket-Extensions: x-webkit-deflate-frame 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 


websocketkey: yLffHPqMU4gIW2WnKq+4BQ== 

acceptKey: A0eCd19URtkji0OPV162okWsCns= 

HTTP/1.1 101 Switching Protocols 
Upgrade: websocket 
Connection: Upgrade 
Sec-WebSocket-Accept: A0eCd19URtkji0OPV162okWsCns= 
+0

Опубликовать выходные данные ваших вызовов 'print()' в вашем вопросе. –

+0

Я отредактировал op с выходом для печати – WillieWonka

ответ

2

У вас есть ошибка в вашем коде.

for line in request.split("\n"): 
    if "Sec-WebSocket-Key:" in line: 
     websocketkey = line.split(" ")[1] 

То есть возвращение "\r" в вашем Sec-WebSocket-Key.

Evidence:

Нормальный RFC Поведение

Client Key: "yLffHPqMU4gIW2WnKq+4BQ==" 
Server Key: YVjKqlMRxlzzM70LScN9VoCsboI= 

Плохое Поведение

Client Key: "yLffHPqMU4gIW2WnKq+4BQ==\r" 
Server Key: A0eCd19URtkji0OPV162okWsCns= 

Ссылки на AutobahnPython Sec-WebSocket-Key server side validation и AutobahnPython hash calculation.

+0

спасибо, это решило это! – WillieWonka

Смежные вопросы