Python 将 http post body 扭曲转发到 tcp 端口
Posted
技术标签:
【中文标题】Python 将 http post body 扭曲转发到 tcp 端口【英文标题】:Python twisted forward http post body to tcp port 【发布时间】:2021-10-16 10:47:34 【问题描述】:我有一个在 localhost 的 9999 端口上运行的回显服务器。我正在使用 twisted 开发一个 Web 服务器(我通常是 twisted 和 python 的新手)。客户端将使用带有 HTTP 的分块编码流式传输数据。我希望服务器做的是将此数据发送到端口 9999 并从那里获取响应并作为 http 响应写回。但我什至无法使发送部分工作。这是我到目前为止所做的。
从 twisted.web 导入服务器,资源 从 twisted.internet 导入反应器,端点 从 twisted.internet.protocol 导入协议,工厂 类 Clientp(协议): def __init__(self, req): self.req = 请求 def connectionMade(self): self.transport.writeSequence(self.req.content.read()) 定义数据接收(自我,数据): print ("+得到回复" + str(data)) # 我必须在这里通过 resposne 发送数据 类计数器(资源。资源): isLeaf = 真 numberRequests = 0 def render_POST(self, request): 定义客户端协议(): 返回客户端(请求) 端点=端点。TCP4ClientEndpoint(反应器,“127.0.0.1”,9999) 端点.connect(Factory.forProtocol(clientProtocol)) 返回 server.NOT_DONE_YET endpoints.serverFromString(reactor, "tcp:8000").listen(server.Site(Counter())) 反应堆.run()我无法将帖子内容 (request.content.read()
) 写入 TCP 端点。我收到TypeError("Data must be bytes")
错误。有什么想法
【问题讨论】:
【参考方案1】:def connectionMade(self): self.transport.writeSequence(self.req.content.read())
ITransport.writeSequence 接受一个可迭代的字节。 IRequest.content.read 返回一个字节对象。
您会收到错误 TypeError("Data must be bytes")
,因为在 Python 3 中迭代字节会产生整数。实现抱怨的正是这些整数。
您应该改用ITransport.write。
【讨论】:
感谢您的回答。即使我使用ITransport.write
,echoserver 也不会收到self.req.content.read()
值。代码还有其他问题吗?
由于来自http客户端的请求数据是分块的,它应该被流式传输到回显服务器。这是正确的方法吗?请原谅我,因为我是扭曲的新手
你怎么知道回显服务器没有收到?
我在 echo 服务器上做一个print
。如果我添加self.transport.write('test string'.encode("utf-8")
,它会通过,但不会通过self.transport.write(self.req.content.read())
。如果我不使用分块编码,数据甚至都没有。
我建议您将这些详细信息添加到新问题中。我想这一个答案。 SO 不太适合聊天式交互。以上是关于Python 将 http post body 扭曲转发到 tcp 端口的主要内容,如果未能解决你的问题,请参考以下文章