Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python TPCServer rfile.read块_Python_Httprequest_Tcpserver - Fatal编程技术网

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提到的,有效的客户端应该提供这个值。正如他在问题中所说,“换句话说,我没有内容大小标题。”