我想在 Ruby 中为开发目的创建一个非常简单的Web服务器(不,我不想使用现成的解决方案)。
下面是代码:
这个想法是从命令行运行这个脚本,提供另一个脚本,该脚本将在其标准输入上接收请求,并在其标准输出上返回完整的响应。
到目前为止还不错,但结果证明这非常脆弱,在第二个请求中会出现错误:
有什么想法可以改进上述代码,使其易于使用吗?
版本:Ubuntu 9.10(2.6.31-20-generic),Ruby 1.8.7(2009年6月12日补丁级别174)[i486-linux]
下面是代码:
#!/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年6月12日补丁级别174)[i486-linux]