如何使用ruby和tcpserver读取传入的POST多部分请求

时间:2014-07-09 14:17:05

标签: ruby curl

我创建了一个非常简单的服务器:

#!/bin/ruby

require 'socket'

server = TCPServer.open 2000
puts "Listening on port 2000"

loop {
  client = server.accept

  client.puts "HTTP/1.1 200/OK\r\nContent-type:text/html\r\n\r\n"
  response = "My super slim ruby http server"
  client.puts response

  received = client.recv(1024)
  puts received
  puts "\n"

  client.close
}

到目前为止,它符合我的目的,即打印出可能来自给定客户端的请求。但是,如果我使用以下curl命令来创建请求:

curl -F "data=someData" http://localhost:2000

我的ruby服务器只打印出HTTP标头,但不打印请求的主体。

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:0)

看起来你必须再次调用recv来获取身体:

#!/bin/ruby

require 'socket'

server = TCPServer.open 2000
puts "Listening on port 2000"

loop {
  client = server.accept

  client.puts "HTTP/1.1 200/OK\r\nContent-type:text/html\r\n\r\n"
  response = "My super slim ruby http server"
  client.puts response

  headers = client.recv(1024)
  headers =~ /Content-Length: (\d+)/ # get content length
  body    = $1 ? client.recv($1.to_i) : '' # <- call again to get body if there is one

  puts headers + body

  client.close
}

答案 1 :(得分:0)

感谢bundacia,我最终混合了你发送的内容和其他一些发现,结果就是这样:

#!/bin/ruby

require 'socket'

server = TCPServer.open 2000
puts "Listening on port 2000"

loop {
client = server.accept

client.puts "HTTP/1.1 200/OK\r\nContent-type:text/xml\r\n\r\n"
response = "My super slim ruby http server"
client.puts response

all_data = []
i = 1024
firstrun = "yes"
while i > 0
    partial_data = client.recv(i)
    if (firstrun == "no")
        i = 0
    end
    if (firstrun == "yes")
        partial_data =~ /Content-Length: (\d+)/ # get content length
        length = $1
        if (nil != length && !length.empty?)
            i = length.to_i
            firstrun = "no"
        end
    end

    all_data << partial_data
end

puts all_data.join()

client.close
}