Python. Получение http запроса через socket и обработка некоторых header-ов
В целях самообучения пишу HTTP сервер на чистом python и сокетах. Что я сделал:
with client_socket:
loop = asyncio.get_event_loop()
data = await loop.sock_recv(client_socket, 1024)
request_string = data.decode(encoding=settings.ENCODING)
request = Request.from_http(request_string)
endpoint, kwargs = url_resolver.resolve(request.url.path)
# Тут планируется отправка сообщения обратно, но я пока до этого не дошёл
Появилась проблема: Как правильно читать данные клиента? У меня data = await loop.sock_recv(client_socket, 1024) читает первые 1024 байта. Первый вопрос: если запрос будет размером больше 1024 байта (может ли такое случится?), то сервер упустит остаток информации. Но если обернуть в while True
all_data = bytes()
while True:
data = await loop.sock_recv(client_socket, 1024)
if not data:
break
all_data += data
request_string = all_data.decode(encoding=settings.ENCODING)
То алгоритм дальше цикла while не идёт. Как мне быть?
Вопрос второй:
Как обрабатывать хедеры Connection и Transfer-Encoding? Это только те, о которых я знаю. В http раньше сильно не вдавался и не представляю сколько ещё есть подводных камней. Буду рад разъяснению или, хотя бы, ссылке на статью по этому поводу.
P.S.: Я шёл по этому гайду
Ответы (1 шт):
Пустое data будет при разрыве соединения, а оно будет после ответа. Поэтому вычитывать таким образом не стоит.
Нужно вычитывать строки заголовков. Если можно через readline. Заголовки заканчиваются пустой строкой - перевод строки без текста.
На этом моменте нужно найти метод. Если get, то отвечаем, если пост, то смотрим размер контента и его кодировку.
После этого вычитывай через while пока размер сообщения не станет равным заявленному.
Уже после того как прочли заголовки можно посылать ответ. А вычитывание тела запроса передается другой корутине, таску.