9495c66374c5c7a671a8b8d4ed42254713c9360a
[feedcatcher.git] / vendor / rails / actionpack / lib / action_controller / vendor / rack-1.0 / rack / handler / scgi.rb
1 require 'scgi'
2 require 'stringio'
3 require 'rack/content_length'
4 require 'rack/chunked'
5
6 module Rack
7 module Handler
8 class SCGI < ::SCGI::Processor
9 attr_accessor :app
10
11 def self.run(app, options=nil)
12 new(options.merge(:app=>app,
13 :host=>options[:Host],
14 :port=>options[:Port],
15 :socket=>options[:Socket])).listen
16 end
17
18 def initialize(settings = {})
19 @app = Rack::Chunked.new(Rack::ContentLength.new(settings[:app]))
20 @log = Object.new
21 def @log.info(*args); end
22 def @log.error(*args); end
23 super(settings)
24 end
25
26 def process_request(request, input_body, socket)
27 env = {}.replace(request)
28 env.delete "HTTP_CONTENT_TYPE"
29 env.delete "HTTP_CONTENT_LENGTH"
30 env["REQUEST_PATH"], env["QUERY_STRING"] = env["REQUEST_URI"].split('?', 2)
31 env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"]
32 env["PATH_INFO"] = env["REQUEST_PATH"]
33 env["QUERY_STRING"] ||= ""
34 env["SCRIPT_NAME"] = ""
35 env.update({"rack.version" => [0,1],
36 "rack.input" => StringIO.new(input_body),
37 "rack.errors" => $stderr,
38
39 "rack.multithread" => true,
40 "rack.multiprocess" => true,
41 "rack.run_once" => false,
42
43 "rack.url_scheme" => ["yes", "on", "1"].include?(env["HTTPS"]) ? "https" : "http"
44 })
45 status, headers, body = app.call(env)
46 begin
47 socket.write("Status: #{status}\r\n")
48 headers.each do |k, vs|
49 vs.split("\n").each { |v| socket.write("#{k}: #{v}\r\n")}
50 end
51 socket.write("\r\n")
52 body.each {|s| socket.write(s)}
53 ensure
54 body.close if body.respond_to? :close
55 end
56 end
57 end
58 end
59 end