服务器未完全消耗请求主体时重置连接

时间:2019-10-30 20:12:07

标签: python http flask tcp wsgi

我现在从another SO answerthe uWSGI documentation熟悉了此问题的一般原因,其中指出:

  

如果HTTP请求具有主体(例如,   表单),则必须在应用程序中阅读(使用)它。如果你这样做   不这样做,与您的网络服务器的通讯套接字可能是   崩溃了。

但是,我不知道在TCP级别上到底发生了什么,此问题才发生。不知道此过程的细节,我假设服务器可以简单地丢弃流中剩余的内容,但是显然不是这种情况。

如果我仅消耗应用程序中部分请求主体并最终返回200响应,则Web浏览器将报告连接重置错误。谁重置连接?网络服务器还是客户端?似乎所有数据都已经由客户端发送,但是应用程序还没有耗尽流。当应用程序中的流耗尽时,会触发Web服务器指示其已完成读取吗?

我的应用程序是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 个答案:

答案 0 :(得分:1)

尽管整个链中都有一些缓冲,但是大文件传输要等到接收者消耗掉它们之后才能完成。缓冲区将填满,数据包将被丢弃,直到缓冲区被耗尽。最终,浏览器将放弃尝试发送文件并断开连接的操作。