我正在尝试使用数据向ruby中的简单服务器发送put请求。
curl --request PUT 'http://localhost:2000/api/kill' --data "c=19"
我的服务器实现是:
require 'socket'
server = TCPServer.open(2000)
loop do
socket = server.accept
while(line = socket.gets)
p line
end
socket.close
end
我想从请求中提取数据。目前它只打印以下内容。
"PUT /api/kill HTTP/1.1\r\n"
"User-Agent: curl/7.35.0\r\n"
"Host: localhost:2000\r\n"
"Accept: */*\r\n"
"Content-Length: 4\r\n"
"Content-Type: application/x-www-form-urlencoded\r\n"
"\r\n"
有关如何提取作为数据发送的c = 19的任何帮助
答案 0 :(得分:2)
gets
正在等待换行符。 curl
没有发送一个,c=19
是通过电汇的最后一件事。
此外,您无法使用while line
,因为line
在连接中断之前永远不会为假,并且curl
不会破坏连接,因为它需要响应。< / p>
查看“Detect end of HTTP request body”,了解服务器在请求主体何时结束时应该知道的内容。为了完全符合规范,有几种情况需要考虑,但是检测Content-Length
的大多数时候应该工作的方法并不是非常困难。
不过,我建议你让一个库(例如Rack)负责解析请求,它看起来比它看起来要复杂。
答案 1 :(得分:1)
这有效:
require 'socket'
server = TCPServer.open(2000)
loop do
socket = server.accept
line = ""
until line == "\r\n"
line = socket.readline
if line.match /Content\-Length\:\s(\d+)/
length = $1.to_i
end
end
line = socket.read(length)
socket.puts "The data was: #{line}"
socket.close
end
它使用"\r\n"
来检测标题的结尾,并从“Content-Length”获取正文的长度。然后,它使用该长度通过read
请注意,匹配的curl
请求是:
curl --request PUT 'http://localhost:2000/api/kill' --data "c=19"