【问题标题】:Python: reading from rfile in SimpleHTTPRequestHandlerPython:从 SimpleHTTPRequestHandler 中的 rfile 读取
【发布时间】:2015-07-14 21:59:21
【问题描述】:

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

【问题讨论】:

  • 我查看了 socket.py 并注意到一条评论说“我们永远不会在 read() 中留下来自内部缓冲区中新的 recv() 调用的任何剩余数据。” (python2.7 库中的 socket.py:338)。在这种情况下,我可以在哪里检查客户端发送的 http 命令中的任何其他数据? (测试时的极端情况)
  • 你是怎么解决这个问题的?
  • 我还没有。由于这是一个个人项目,因此被搁置了。当我解决这个问题时肯定会更新。

标签: python-2.7 simplehttpserver


【解决方案1】:

为了记录,解决方案是仅尝试读取标头 Content-Length 中指定的字节数。即类似:

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

【讨论】:

  • 不适用于流模式,没有Content-Length
【解决方案2】:

我刚刚解决了一个这样的案例。

我很确定这里的“gottcha”是由您连接的客户端写入您的套接字的无限位流。这通常称为“预连接”,发生这种情况是因为 http/tcp/HttpServer 在“块”和缓慢馈送到连接的单个字节之间没有显着区别。如果您看到响应标头包含Transfer-Encoding: chunked,您就是发生这种情况的候选人。谷歌浏览器以这种方式工作,是一个很好的测试。如果 fire fox 和 IE 工作,但当您从同一网站收到响应时 Chrome 不能工作,那么这可能是发生了什么。

可能的解决方案:

  1. 在 CPython 3.7 中,HttpServer 具有支持预连接的选项。查看docs中的HttpThreadingServer。
  2. 将请求处理放在一个单独的线程中,当读取操作时间过长时使该线程超时。

    这两种方法都可能是痛苦的解决方案,但至少可以帮助您入门。

【讨论】:

    猜你喜欢
    • 2021-07-25
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    相关资源
    最近更新 更多