Skip to content

Commit

Permalink
Add SCGI handler, by Jeremy Evans
Browse files Browse the repository at this point in the history
darcs-hash:20080125083628-4fc50-60cf2a8c517965160a8f52d28e305b0211624edc.gz
  • Loading branch information
leahneukirchen committed Jan 25, 2008
1 parent 123cfec commit 4610a60
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 0 deletions.
1 change: 1 addition & 0 deletions README
Expand Up @@ -112,6 +112,7 @@ at my site:

* XXX, 2007: Third public release 0.3.
* LiteSpeed handler, by Adrian Madrid.
* SCGI handler, by Jeremy Evans.
* Pool sessions, by blink.
* OpenID authentication, by blink.
* :Port and :File options for opening FastCGI sockets, by blink.
Expand Down
1 change: 1 addition & 0 deletions lib/rack.rb
Expand Up @@ -84,6 +84,7 @@ module Handler
autoload :Mongrel, "rack/handler/mongrel"
autoload :WEBrick, "rack/handler/webrick"
autoload :LSWS, "rack/handler/lsws"
autoload :SCGI, "rack/handler/scgi"
end
end

57 changes: 57 additions & 0 deletions lib/rack/handler/scgi.rb
@@ -0,0 +1,57 @@
require 'scgi'
require 'stringio'

module Rack
module Handler
class SCGI < ::SCGI::Processor
attr_accessor :app

def self.run(app, options=nil)
new(options.merge(:app=>app,
:host=>options[:Host],
:port=>options[:Port],
:socket=>options[:Socket])).listen
end

def initialize(settings = {})
@app = settings[:app]
@log = Object.new
def @log.info(*args); end
def @log.error(*args); end
super(settings)
end

def process_request(request, input_body, socket)
env = {}.replace(request)
env.delete "HTTP_CONTENT_TYPE"
env.delete "HTTP_CONTENT_LENGTH"
env["REQUEST_PATH"], env["QUERY_STRING"] = env["REQUEST_URI"].split('?', 2)
env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"]
env["PATH_INFO"] = env["REQUEST_PATH"]
env["QUERY_STRING"] ||= ""
env["SCRIPT_NAME"] = ""
env.update({"rack.version" => [0,1],
"rack.input" => StringIO.new(input_body),
"rack.errors" => STDERR,

"rack.multithread" => true,
"rack.multiprocess" => true,
"rack.run_once" => false,

"rack.url_scheme" => ["yes", "on", "1"].include?(env["HTTPS"]) ? "https" : "http"
})
status, headers, body = app.call(env)
begin
socket.write("Status: #{status}\r\n")
headers.each do |k, vs|
vs.each {|v| socket.write("#{k}: #{v}\r\n")}
end
socket.write("\r\n")
body.each {|s| socket.write(s)}
ensure
body.close if body.respond_to? :close
end
end
end
end
end

0 comments on commit 4610a60

Please sign in to comment.