Python TPCServer 的 rfile.read 阻塞问题

9
我正在编写一个简单的SocketServer.TCPServer请求处理程序(StreamRequestHandler),它将捕获请求,包括标题和消息正文。这是为了伪造一个我们可以用于测试的HTTP服务器。
我没有问题抓取请求行或标题。
如果我尝试从rfile中获取更多内容,超出了实际内容大小,则代码会阻塞。如何获取所有请求正文而不知道其大小?换句话说,我没有Content-Size头信息。
这是我目前的一部分代码:
def _read_request_line(self):
    server.request_line = self.rfile.readline().rstrip('\r\n')

def _read_headers(self):
    headers = []
    for line in self.rfile:
        line = line.rstrip('\r\n')
        if not line:
            break
        parts = line.split(':', 1)
        header = (parts[0].strip(), parts[0].strip())
        headers.append(header)
    server.request_headers = headers

def _read_content(self):
    server.request_content = self.rfile.read()  # blocks

请参阅关于非阻塞套接字的部分。 - Some programmer dude
3
使用HTTP时,可以选择使用Content-Length头(如果有请求正文),或使用分块传输编码。正确编写的客户端必须发送此头文件。请参阅http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.4。 - Keith
为什么不使用SimpleHTTPServer模块? - Keith
1
我不使用SimpleHTTPServer,因为它承担了太多的责任。我需要精确控制返回哪些头部信息。 - Travis Parks
我决定最好的做法是查找 content-length 并在未提供时将其默认值设为零。正如 @Keith 提到的那样,有效的客户端应该提供此值。 - Travis Parks
1个回答

8

Keith的评论是正确的。这是它的样子:

     length = int(self.headers.getheader('content-length'))
     data = self.rfile.read(length)

3
正如他在问题中所说:“换句话说,我没有Content-Size头部。” - Joakim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接