Python:从SimpleHTTPRequestHandler中的rfile读取

时间:2015-05-05 08:56:16

标签: python-2.7 simplehttpserver

在重载SimpleHTTPRequestHandler时,我的函数阻塞在self.rfile.read()上。在阅读之前如何查看rfile中是否有任何数据?或者,是否存在非阻塞读取调用,在没有数据的情况下返回?

2 个答案:

答案 0 :(得分:0)

对于记录,解决方案是仅尝试读取与标头Content-Length中指定的一样多的字节。例如:

contentLength = int(request.headers['Content-Length'])
payload = str(request.rfile.read(contentLength))

答案 1 :(得分:-1)

我刚刚解决了这样的情况。

我非常确定这是什么“陷阱”,它是由所连接的客户端将无限比特流写入套接字的。这通常称为“预连接”,它的发生是因为http / tcp / HttpServer在“块”和缓慢馈送到连接的单个字节之间没有明显的区别。如果您看到响应标头包含Transfer-Encoding: chunked,那么您很可能会发生这种情况。 Google Chrome以这种方式工作,并且是一个很好的测试。如果狐狸和IE正常运行,但当您从同一网站收到响应时Chrome却无法运行,则可能是这种情况。

可能的解决方案:

  1. 在CPython 3.7中,HttpServer具有支持预连接的选项。查看docs中的HttpThreadingServer。
  2. 将请求放入单独的线程中,并在读取操作花费太长时间时使该线程超时。

    这两个都是潜在的痛苦解决方案,但至少它应该使您入门。