RFC 6455 Рукопожатие с Python

Я пишу простой веб-сервер для получения данных из запроса POST. Клиент - это двоичный файл, и я мало что знаю об этом.

Всякий раз, когда я использую wscat -l в качестве сервера сокетов, все в порядке, и я могу видеть свои данные. Но когда я запускаю свой код, клиент не отвечает должным образом. Я читал о RFC 6455 и на основе этой темы рукопожатия Python WebSocket (RFC 6455), которую я написал выше код.

import socket
import re
from base64 import b64encode
from hashlib import sha1

GUID = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'

websocket_answer = (
    'HTTP/1.1 101 Switching Protocols',
    'Upgrade: websocket',
    'Connection: Upgrade',
    'Sec-WebSocket-Accept: {key}\r\n\r\n',
)

s = socket.socket()
s.bind(('127.0.0.1', 8000))
s.listen(5)

while True:
    (client, address) = s.accept()
    if not client:
        s.close()
        print('closed')
        break
    text = client.recv(1024)
    print(text)
    key = re.search('[sS]ec-[wW]eb[sS]ocket-[kK]ey:[\s]*(.+?)\\r\\n', text.decode('utf-8'), re.MULTILINE).groups()[0].strip()
    rk = (key + GUID).encode('utf-8')
    response_key = b64encode(sha1(rk).digest())
    response = '\r\n'.join(websocket_answer).format(key=response_key)
    print(response)
    client.send(response.encode('utf-8'))
    print('message sent')
    data = client.recv(1024)
    print('message reseived')
    print(data)
    if not data:
        print('Connection not established or closed')
        break

Вот моя строка необработанных данных от клиента.

b'GET / ws HTTP / 1.1 \ r \ nHost: 127.0.0.1:8000\r\nUpgrade: websocket \ r \ n Соединение: обновление \r\nSec-WebSocket-Key: wkw0oEXOUZEN3HydloWNUA==\r\n Происхождение: http://imac-2.local/ \r\nSec-WebSocket-Version: 13\r\n\r\n'

И это мой ответ:

HTTP / 1.1 101 Коммутационные протоколы Обновление: websocket Соединение: Обновление Sec-WebSocket-Accept: b'4DFG6MSTMvsbG4K1ZZUsG48dVkc='

Если я использую wscat, клиент печатает

Готовы.

И отправка данных мне. Но с моим кодом клиент молчит, и я получаю пустое сообщение.

б ""

Мой push-запрос, который я должен получить, выглядит следующим образом:

Пример push-запроса (зашифрованный AES)

POST /report/push HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
Content-Length: 2379
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip
data = "encripted data"

Мне нужна помощь, которую я могу получить. Это мой первый опыт работы с http, и я тоже новичок в программировании. Спасибо.

0 ответов

Другие вопросы по тегам