title: How to use ruby thin with CGI scripts?
body: <p>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 <a href="http://localhost:3000/&lt;script" rel="nofollow noreferrer">http://localhost:3000/&lt;script</a>> should just execute &lt;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.</p>
  
  <p>Update:</p>
  
  <p>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.</p>
  
  <pre><code>run(lambda do |env|
    require 'rubygems'
    require 'systemu'
    script = env['REQUEST_PATH'][1..-1] + '.rb'
    response = '' 
    err = ''
    systemu(['ruby', script], 'stdout' =&gt; response, 'stderr' =&gt; err, 'env' =&gt; { 
      'foo' =&gt; 'bar' })
    if err.length &gt; 0 
      [ 500, {'Content-Type' =&gt; '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 &lt; 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)
  </code></pre>