【发布时间】:2010-03-10 13:10:53
【问题描述】:
我想在 Ruby 中为开发目的创建一个极其简单的 Web 服务器(不,不想使用现成的解决方案)。
代码如下:
#!/usr/bin/ruby
require 'socket'
server = TCPServer.new('127.0.0.1', 8080)
while connection = server.accept
headers = []
length = 0
while line = connection.gets
headers << line
if line =~ /^Content-Length:\s+(\d+)/i
length = $1.to_i
end
break if line == "\r\n"
end
body = connection.readpartial(length)
IO.popen(ARGV[0], 'r+') do |script|
script.print(headers.join + body)
script.close_write
connection.print script.read
end
connection.close
end
想法是从命令行运行此脚本,提供另一个脚本,该脚本将在其标准输入上获取请求,并在其标准输出上返回完整的响应。
到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求中中断并出现错误:
/usr/bin/serve:24:in `write': Broken pipe (Errno::EPIPE)
from /usr/bin/serve:24:in `print'
from /usr/bin/serve:24
from /usr/bin/serve:23:in `popen'
from /usr/bin/serve:23
知道如何改进上述代码以使其易于使用吗?
版本:Ubuntu 9.10(2.6.31-20-generic)、Ruby 1.8.7(2009-06-12 补丁级别 174)[i486-linux]
【问题讨论】:
-
Joó,由于您和我得到的结果如此不同,也许您应该在问题中添加您的 Ruby 和操作系统版本。