829e7d6bf8c5c140b5b98ae1601e0a819c9c01a6
3 require 'rack/content_length'
7 class WEBrick
< ::WEBrick::HTTPServlet::AbstractServlet
8 def self.run(app
, options
={})
9 server
= ::WEBrick::HTTPServer.new(options
)
10 server
.mount
"/", Rack
::Handler::WEBrick, app
11 trap(:INT) { server
.shutdown
}
12 yield server
if block_given
?
16 def initialize(server
, app
)
18 @app = Rack
::ContentLength.new(app
)
23 env.delete_if
{ |k
, v
| v
.nil? }
25 env.update({"rack.version" => [0,1],
26 "rack.input" => StringIO
.new(req
.body
.to_s
),
27 "rack.errors" => $stderr,
29 "rack.multithread" => true,
30 "rack.multiprocess" => false,
31 "rack.run_once" => false,
33 "rack.url_scheme" => ["yes", "on", "1"].include?(ENV["HTTPS"]) ? "https" : "http"
36 env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"]
37 env["QUERY_STRING"] ||= ""
38 env["REQUEST_PATH"] ||= "/"
39 if env["PATH_INFO"] == ""
40 env.delete
"PATH_INFO"
42 path
, n
= req
.request_uri
.path
, env["SCRIPT_NAME"].length
43 env["PATH_INFO"] = path
[n
, path
.length-n
]
46 status
, headers
, body
= @app.call(env)
48 res
.status
= status
.to_i
49 headers
.each
{ |k
, vs
|
50 if k
.downcase
== "set-cookie"
51 res
.cookies
.concat vs
.split("\n")
53 vs
.split("\n").each
{ |v
|
62 body
.close
if body
.respond_to
? :close