Python TPCServer rfile.read块
我正在编写一个简单的Python TPCServer rfile.read块,python,httprequest,tcpserver,Python,Httprequest,Tcpserver,我正在编写一个简单的SocketServer.TCPServer请求处理程序(StreamRequestHandler),它将捕获请求以及头和消息体。这是为了伪造一个我们可以用来测试的HTTP服务器 我很容易抓取请求行或标题 如果我试图从rfile中获取比现有文件更多的内容,代码就会阻塞。如何在不知道请求正文大小的情况下获取所有请求正文?换句话说,我没有内容大小标题 以下是我现在拥有的一个片段: def _read_request_line(self): server.request_l
SocketServer.TCPServer
请求处理程序(StreamRequestHandler
),它将捕获请求以及头和消息体。这是为了伪造一个我们可以用来测试的HTTP服务器
我很容易抓取请求行或标题
如果我试图从rfile
中获取比现有文件更多的内容,代码就会阻塞。如何在不知道请求正文大小的情况下获取所有请求正文?换句话说,我没有内容大小
标题
以下是我现在拥有的一个片段:
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
基思的评论是正确的。这是它的样子
length = int(self.headers.getheader('content-length'))
data = self.rfile.read(length)
请参阅关于的部分。对于HTTP,可以选择使用内容长度头(如果有正文),也可以使用分块传输编码。正确编写的客户端必须发送此标头。明白为什么不使用SimpleHTTPServer模块了吗?我不使用SimpleHTTPServer,因为它承担了太多的责任。我需要精确地控制返回的标题。我决定最好的方法是查找
内容长度
,如果没有提供,则默认值为零。正如@Keith提到的,有效的客户端应该提供这个值。正如他在问题中所说,“换句话说,我没有内容大小标题。”