gpt4 book ai didi

python - 当 WSGI 应用程序在使用环境 ['wsgi.input' 之前响应时发生 TCP 连接重置]

转载 作者:可可西里 更新时间:2023-11-01 02:34:50 26 4
gpt4 key购买 nike

对于我们的网络服务,我编写了一些逻辑来防止 multipart/form-data POST 大于 4mb。

它归结为以下内容(我已经剥离了所有 WebOb 用法并将其简化为普通的 WSGI 代码):

import paste.httpserver

form = """\
<html>
<body>
<form method="post" enctype="multipart/form-data" action="/">
<input type="file" name="photopicker" />
<input type="submit" />
</form>
</body>
</html>
"""

limit = 4 * 1024 * 1024

def upload_app(environ, start_response):
if environ['REQUEST_METHOD'] == 'POST':
if int(environ.get('CONTENT_LENGTH', '0')) > limit:
start_response('400 Ouch', [('content-type', 'text/plain')])
return ["Upload is too big!"]
# elided: consume the file appropriately
start_response('200 OK', [('content-type', 'text/html')])
return [form]

paste.httpserver.serve(upload_app, port=7007)

显示的逻辑在单元测试时工作正常。但是,一旦我尝试将大于 4mb 的实际文件发送到此端点,我就会在客户端收到如下错误:

  • 错误 101 (net::ERR_CONNECTION_RESET):未知错误。 来自 Google Chrome
  • 在加载页面时重置与服务器的连接。 来自 Firefox

使用 Python 内置的 wsgiref HTTP 服务器时会出现同样的错误。

事实:一旦我在响应 HTTP 400 之前添加了 environ['wsgi.input'].read(),连接重置问题就消失了。当然,这不是一个好的修复。它只是显示当您完全使用输入时会发生什么。

我仔细阅读了 HTTP: The Definitive Guide并找到了一些有趣的指南,说明在实现 HTTP 服务器和客户端时谨慎管理 TCP 连接的重要性。它继续讨论如何,而不是close-ing socket,更喜欢做shutdown,这样客户端就有机会使用react并停止向服务器发送更多数据。

也许我遗漏了一些防止此类连接重置的关键实现细节。有人有见解吗?

参见 the gist.

最佳答案

发生这种情况是因为您在未读取输入流的情况下丢弃了它,这迫使它关闭。浏览器已将大部分要发送的文件排队,然后由于服务器强行关闭连接而出现写入错误。

如果不阅读所有输入,我就知道没有办法解决这个问题。

我会推荐一些 Javascript 在发送文件之前测试文件的大小。那么唯一会收到错误的人就是那些忽略客户端检查的人,因为他们没有 Javascript 或因为他们故意尝试恶意。

关于python - 当 WSGI 应用程序在使用环境 ['wsgi.input' 之前响应时发生 TCP 连接重置],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2099752/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com