gpt4 book ai didi

ruby - 用 Ruby 编写一个简单的网络服务器

转载 作者:数据小太阳 更新时间:2023-10-29 07:13:14 25 4
gpt4 key购买 nike

我想在 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 patchlevel 174) [i486-linux]

最佳答案

问题似乎出在子脚本中,因为您问题中的父脚本在我的机器上运行(Debian Squeeze,Ruby 1.8.7 补丁级别 249):

我创建了虚拟子脚本 bar.rb:

#!/usr/bin/ruby1.8

s = $stdin.read
$stderr.puts s
print s

然后我运行你的脚本,将路径传递给虚拟脚本:

$ /tmp/foo.rb /tmp/bar.rb

我用 wget 打它:

$ wget localhost:8080/index

并看到虚拟脚本的输出:

GET /index HTTP/1.0^M
User-Agent: Wget/1.12 (linux-gnu)^M
Accept: */*^M
Host: localhost:8080^M
Connection: Keep-Alive^M
^M

我还看到 wget 收到了它发送的内容:

$ cat index
GET /index HTTP/1.0
User-Agent: Wget/1.12 (linux-gnu)
Accept: */*
Host: localhost:8080
Connection: Keep-Alive

无论我用 wget 敲多少次,它都一样。

关于ruby - 用 Ruby 编写一个简单的网络服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2417078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com