新手问题 Ruby 如何通过标准输入处理 HTTP 请求

gotnix · 2015年05月06日 · 最后由 doitian 回复于 2015年05月08日 · 2667 次阅读

想法是这样的,写一个小脚本作为 xinetd 服务,通过 http 请求操作系统上的一些文件。通过 xinetd 可以把程序的本地 IO 变成网络 IO,xinetd 监听 tcp scoket 把接收的数据通过标准输入交给 Ruby 脚本,也会把 Ruby 脚本的输出发送给客户端。使用 xinetd 还有一个原因就是这个服务的使用频率不高,不用像独立服务那样一直在后台运行,消耗系统资源。基础代码如下:

require 'webrick'

req = WEBrick::HTTPRequest.new(WEBrick::Config::HTTP)
req.parse(ARGF)

p req.header
p req.body

xinetd 新增一个服务:

service ftp-vum
{
  disable         = no
  socket_type     = stream
  protocol        = tcp
  user            = root
  wait            = no
  server          = /opt/script/ftp_vum.rb
  log_type        = SYSLOG daemon debug
}

监听的端口号在 /etc/services 中定义:

grep -E '\<8023/tcp\>' /etc/services \
  || echo 'ftp-vum         8023/tcp                # comments' > /etc/services

上面的代码和配置已经可以工作了,但是细化的功能不知道怎么做了,比如 GET 获取一个文件内容,PUT 新建一个文件,DELETE 删除一个文件之类的,就是 Web 框架里的 Route,目前试过 Sinatra::Base - 中间件,程序库和模块化应用 ,跑起来还是一个独立服务,求指点: 从 STDIN 收到的 HTTP 请求怎么用路由?

可以去看一下 rack/handler/cgi.rb

自己实现了 handler 就可以直接去运行一个 sinatra 的 app 了

其实本质就是 cgi,估计 rack/handler/cgi 可以拿来直接用 cgi 是通过 ENV 传 HTTP 头,需要自己照着做些修改

需要 登录 后方可回复, 如果你还没有账号请 注册新账号