【问题标题】:HTTP POST Data unreadable until client closesHTTP POST 数据在客户端关闭之前不可读
【发布时间】: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.4RFC 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 结束)...

标签: ruby http sockets webserver


【解决方案1】:

通过if line.chomp.length == 0 获取headers 的结尾和client.read() 获取数据,我可以获取数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 2021-02-26
    • 2012-01-13
    • 2019-05-23
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多