Сброс соединения, когда сервер не полностью использует тело запроса - PullRequest
1 голос
/ 30 октября 2019

Теперь я знаком с общей причиной этой проблемы из другого ответа SO и из документации uWSGI , в которой говорится:

ЕслиHTTP-запрос имеет тело (например, запрос POST, сгенерированный формой), вы должны прочитать (использовать) его в своем приложении. Если вы этого не сделаете, сокет связи с вашим веб-сервером может быть засорен.

Однако я не понимаю, что именно происходит на уровне TCP для возникновения этой проблемы. Не зная деталей этого процесса, я бы предположил, что сервер может просто отбросить то, что остается в потоке, но это явно не так.

Если я использую только часть тела запроса в моем приложении и в конечном итоге возвращаюв ответе 200 веб-браузер сообщит об ошибке сброса соединения. Кто сбросил соединение? Веб-сервер или клиент? Кажется, что все данные уже отправлены клиентом, но приложение просто не исчерпало поток. Есть ли что-то, что происходит, когда поток исчерпан в приложении, которое запускает веб-сервер, чтобы показать, что оно завершило чтение?

Мое приложение - Python / Flask, но я видел вопросы по этому поводу из нескольких языков и фреймворков,Например, происходит сбой, если exhaust() не вызывается в потоке запросов:

@app.route('/upload', methods=['POST'])
def handle-upload():
    file = request.stream
    pandas.read_csv(file, nrows=100)
    response = # Do stuff
    file.exhaust()
    return jsonify(response)

1 Ответ

1 голос
/ 30 октября 2019

Несмотря на то, что во всей цепочке имеется некоторая буферизация, передача больших файлов не будет завершена, пока получатель не использует их. Буферы будут заполняться, и пакеты будут отбрасываться до тех пор, пока буферы не будут слиты. В конце концов, браузер перестанет пытаться отправить файл и разорвать соединение.

...