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, и я тоже новичок в программировании. Спасибо.