HTTP POST 数据在客户端关闭之前不可读
Posted
技术标签:
【中文标题】HTTP POST 数据在客户端关闭之前不可读【英文标题】:HTTP POST Data unreadable until client closes 【发布时间】:2022-01-10 05:53:27 【问题描述】:我正在尝试使用套接字在 ruby 中创建一个 Web 服务器进行实验,但在客户端关闭之前,我无法从发布请求中获取有效负载。然后,当客户端关闭时,我无法发回任何数据。
代码:
require "socket"
server = TCPServer.new($HOST, $PORT)
client = server.accept
while true
puts client.gets
#Prints all headers and request but I don't see the actual payload (key=value) until the client disconnects.
end
【问题讨论】:
这绝对不是读取 HTTP 请求的正确方法,尤其是正文。有关如何正确确定 HTTP 消息结尾的规则,请参阅 RFC 2616 Section 4.4 和 RFC 7230 Section 3.3.3。你必须先读入HTTP headers,停止读入并分析headers 以了解HTTP body 的格式,然后读入body,可以有几种不同的格式,每种格式都有不同的格式和终止方式. 在网上搜索ruby http server
,你会发现几篇关于如何在Ruby中实现HTTP服务器的有用文章。
@RemyLebeau 我已经有单独的代码,我只是使用了 while true 语句来确保我正在阅读所有内容。
您展示的while
循环没有正确读取HTTP 消息,甚至没有关闭。查看past answers I have posted,其中包含有关此问题的伪代码(尽管它们中的大多数都用于解析 HTTP 响应,但只需要稍作调整即可解析 HTTP 请求)
有效负载很可能不会以 EOL(行尾)标记结束,因此 gets
可能会挂起,直到客户端关闭连接然后返回存在的可用数据(即使它不会以 EOL 结束)...
【参考方案1】:
通过if line.chomp.length == 0
获取headers 的结尾和client.read()
获取数据,我可以获取数据。
【讨论】:
以上是关于HTTP POST 数据在客户端关闭之前不可读的主要内容,如果未能解决你的问题,请参考以下文章