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 数据在客户端关闭之前不可读的主要内容,如果未能解决你的问题,请参考以下文章

FIN-ACK数据包是从服务器发送的,但客户端在客户端发送FIN-ACK数据包之前发送HTTP请求[关闭]

使用 get/post 的免费云数据存储? [关闭]

客户端通过HTTP协议与服务端交换数据

向 POST 客户端返回 HTTP 200 代码?

使用 HTTP Post 从客户端流式传输数据

Node.js 可写流创建错误文件(更大且不可读)