0

I've written some ruby CGI scripts (using the Ruby CGI class) that I serve from my production server using lighttpd. I want to test them on my development server using thin. Basically, I want to drop all my CGI scripts in a directory and start thin in that directory. Then, any requests to http://localhost:3000/<script> should just execute <script> in the current directory and return the results. If thin has a built-in way of doing this, I can't find it. I would imagine the Rack config file for this is easy if you know what you're doing, but I don't.

Update:

This rackup file seems to work. I'm not sure if it's the best solution, but it should be fine for a development environment.

run(lambda do |env|
  require 'rubygems'
  require 'systemu'
  script = env['REQUEST_PATH'][1..-1] + '.rb'
  response = '' 
  err = ''
  systemu(['ruby', script], 'stdout' => response, 'stderr' => err, 'env' => { 
    'foo' => 'bar' })
  if err.length > 0 
    [ 500, {'Content-Type' => 'text/plain'}, err ]
  else
    idx = 0
    status = -1
    headers = {}
    while true
      line_end = response.index("\n", idx)
      line = response[idx..line_end].strip
      idx = line_end+1

      if status < 0
        if line =~ /(\d\d\d)/
          status = $1.to_i
        else
          raise "Invalid status line: #{line}"
        end
      elsif line.empty?
        break
      else
        name, value = line.split /: ?/
        headers[name] = value
      end
    end
    content = response[idx..-1]
    [status, headers, content]
  end
end)

1 Answers1

0

I'm a little unclear as to why Rack is necessary at all. If you wrote the script using Ruby's built-in CGI module, you should be able to just tell thin to treat the directory as a cgi-bin,just like the Apache ScriptAlias directive, and Ruby CGI will take care of the rest. If thin can't do this, perhaps lighttpd would be a better solution.

Max Cantor
  • 8,229
  • 7
  • 45
  • 59