Python 如果使用HTTP/1.1,模拟S3服务器将暂停

Python 如果使用HTTP/1.1,模拟S3服务器将暂停,python,testing,boto3,awss3transfermanager,Python,Testing,Boto3,Awss3transfermanager,我正在编写一个测试,其中在测试环境中加载一个简单的模拟S3,使用http.server.HTTPServer/http.server.BaseHTTPRequestHandler,以测试涉及Boto的S3Transfer的多部分下载行为 它工作正常,除非我指定服务器使用HTTP/1.1。在这种情况下,它将下载100mb文件的2个8mb部分,然后挂起。我希望模拟服务器使用HTTP/1.1,因为这是真正的S3使用的(我相信) 下面是该测试的简化版本,可以由 pip3 install boto3 py

我正在编写一个测试,其中在测试环境中加载一个简单的模拟S3,使用
http.server.HTTPServer
/
http.server.BaseHTTPRequestHandler
,以测试涉及Boto的S3Transfer的多部分下载行为

它工作正常,除非我指定服务器使用
HTTP/1.1
。在这种情况下,它将下载100mb文件的2个8mb部分,然后挂起。我希望模拟服务器使用
HTTP/1.1
,因为这是真正的S3使用的(我相信)

下面是该测试的简化版本,可以由

pip3 install boto3
python3 test.py    

请注意,
可写
是故意不可查找的:在我的真实代码中,我使用的是一个不可查找的类似文件的对象

是的,
moto
可以用来制作一个模拟S3,我这样做是为了其他测试,但是对于这个特定的测试,我想要“真实”的服务器。涉及到自定义文件对象,希望确保S3Transfer和其他与此问题无关的代码按照我的预期一起工作


如何设置使用HTTP/1.1的模拟S3服务器,并且S3Transfer可以从中下载?

线程逻辑中有一个错误。您当前所做的是在一个单独的线程上提供服务,但您真正想要做的是并发处理多个线程上的请求

这可以通过创建一个非常愚蠢的HTTP服务器来实现,该服务器只是混合了线程功能:

class ThreadingServer(ThreadingMixIn, HTTPServer):
    pass
并从该服务器而不是基本
HTTPServer
提供服务


至于为什么这适用于
HTTP/1.0
,在一个请求得到服务后,连接就关闭了

超级有趣的问题。我怀疑这和它有什么关系,但是你能添加一个内容类型头吗?啊,我怀疑web服务器不是线程安全的,有一个线程正在阻止它。。。但我不确定为什么它能与HTTP/1.0兼容。请参阅可能相关的答案。@erip尝试使用
application/octet-stream
的内容类型,但发生了同样的情况。关于线程不安全,我确实在另一个线程中加载了web服务器,但web服务器在这方面不安全是很奇怪的,即不处理多个并发请求?我想知道这是否与HTTP/1.1的持久性连接有关,但不太清楚如何。问得好,但我认为
HTTPServer
将同步处理请求,直到添加一个mixin。我自己还没有测试过,但是看看几个问题(就像之前发布的一样,这是真的。@erip啊,是的!是的,我意识到现在服务器处于一个单独的线程中并不意味着它可以安全地处理并发请求。我添加了
ThreadingMixIn
,现在它可以工作了。如果你想发布这个答案,我会很高兴的。
class ThreadingServer(ThreadingMixIn, HTTPServer):
    pass