2014-07-09 20 views
1

我创建了一个非常简单的服务器:我如何传入POST multipart请求时使用Ruby读取和tcpserver的

#!/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

我的红宝石服务器只打印出HTTP头,而不是请求的主体。

有没有办法做到这一点?

回答

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 
} 
+0

我认为更正确的方法是查看标题,看看身体有多长时间,然后阅读这个数量。用这个改变更新了我的答案。 – bundacia

+0

这已经帮了我很多。但是,我注意到我无法读取比我在第一个client.recv()中读到的更多的字节。所以在这个例子中,主体的调用只能读取1024字节 – user3820846

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 
} 
相关问题