Я пытаюсь написать очень простой http-сервер на python. Рабочая версия выглядит так:
def run(self, host='localhost',port=8000):
with socket.socket(socket.AF_INET,socket.SOCK_STREAM) as s:
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host,port))
s.listen(1)
while True:
connection, adress = s.accept()
with connection:
data = b''
while True:
recived = connection.recv(1024)
data += recived
if len(recived) < 1024:
break
if data != b'':
handle_request(data,connection)
Это работает, но у меня есть некоторое недопонимание, что происходит.
Как я понимаю, сокет "s" принимает соединение от клиента -> и возвращает новый объект сокета "соединение", из которого я могу прочитать то, что клиент отправляет мне, и отправить ответ. Я читаю данные из соединения, пока клиент не отправит пустую строку b ''. После этой части TCP завершается, и я передаю полученные байты обработчику, который анализирует полученные данные как HTTP.
Вопросы: на данный момент я читаю все данные, которые клиент отправляет мне, но если я хочу ограничить максимальный размер HTTP-запроса, я должен просто сделать что-то вроде этого:
..................................
with connection:
data = b''
request_size_limit=1024*100 # some desired http request max size
while True:
recived = connection.recv(1024)
data += recived
if len(recived) < 1024 or len(data) > request_size_limit:
break
if data != b'':
handle_request(data,connection)
- Если я делаю что-то вроде этого, как я могу сообщить клиенту, что, например, у меня есть максимум 1024 * 1024 свободных байтов ОЗУ, и я не могу обрабатывать запросы больше этого?
- Если клиенты хотят отправить больше этого предела, он должен отправить несколько отдельных запросов, которые будут содержать 1 часть необходимых данных?
- Или, например, для большого запроса POST я должен проанализировать каждое recv (1024), пока я нашел последовательность \ r \ n \ r \ n, проверить длину содержимого и длину содержимого recv () по частям 1024b в некотором файле и продолжить после?