从ruby

时间:2015-10-29 07:58:15

标签: ruby-on-rails ruby server

我正在尝试使用数据向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的任何帮助

2 个答案:

答案 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"