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 шт):

Автор решения: eri

Пустое data будет при разрыве соединения, а оно будет после ответа. Поэтому вычитывать таким образом не стоит.

Нужно вычитывать строки заголовков. Если можно через readline. Заголовки заканчиваются пустой строкой - перевод строки без текста.

На этом моменте нужно найти метод. Если get, то отвечаем, если пост, то смотрим размер контента и его кодировку.

После этого вычитывай через while пока размер сообщения не станет равным заявленному.

Уже после того как прочли заголовки можно посылать ответ. А вычитывание тела запроса передается другой корутине, таску.

→ Ссылка