9495c66374c5c7a671a8b8d4ed42254713c9360a
3 require 'rack/content_length'
8 class SCGI
< ::SCGI::Processor
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
18 def initialize(settings
= {})
19 @app = Rack
::Chunked.new(Rack
::ContentLength.new(settings
[:app]))
21 def @log.info(*args
); end
22 def @log.error(*args
); end
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,
39 "rack.multithread" => true,
40 "rack.multiprocess" => true,
41 "rack.run_once" => false,
43 "rack.url_scheme" => ["yes", "on", "1"].include?(env["HTTPS"]) ? "https" : "http"
45 status
, headers
, body
= app
.call(env)
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")}
52 body
.each
{|s
| socket
.write(s
)}
54 body
.close
if body
.respond_to
? :close