qoobaa-rack 1.0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. data/COPYING +18 -0
  2. data/KNOWN-ISSUES +18 -0
  3. data/RDOX +0 -0
  4. data/README +353 -0
  5. data/Rakefile +164 -0
  6. data/SPEC +164 -0
  7. data/bin/rackup +176 -0
  8. data/contrib/rack_logo.svg +111 -0
  9. data/example/lobster.ru +4 -0
  10. data/example/protectedlobster.rb +14 -0
  11. data/example/protectedlobster.ru +8 -0
  12. data/lib/rack/adapter/camping.rb +22 -0
  13. data/lib/rack/auth/abstract/handler.rb +37 -0
  14. data/lib/rack/auth/abstract/request.rb +37 -0
  15. data/lib/rack/auth/basic.rb +58 -0
  16. data/lib/rack/auth/digest/md5.rb +124 -0
  17. data/lib/rack/auth/digest/nonce.rb +51 -0
  18. data/lib/rack/auth/digest/params.rb +55 -0
  19. data/lib/rack/auth/digest/request.rb +40 -0
  20. data/lib/rack/auth/openid.rb +487 -0
  21. data/lib/rack/builder.rb +63 -0
  22. data/lib/rack/cascade.rb +41 -0
  23. data/lib/rack/chunked.rb +49 -0
  24. data/lib/rack/commonlogger.rb +52 -0
  25. data/lib/rack/conditionalget.rb +47 -0
  26. data/lib/rack/content_length.rb +29 -0
  27. data/lib/rack/content_type.rb +23 -0
  28. data/lib/rack/deflater.rb +96 -0
  29. data/lib/rack/directory.rb +153 -0
  30. data/lib/rack/file.rb +88 -0
  31. data/lib/rack/handler/cgi.rb +61 -0
  32. data/lib/rack/handler/evented_mongrel.rb +8 -0
  33. data/lib/rack/handler/fastcgi.rb +88 -0
  34. data/lib/rack/handler/lsws.rb +60 -0
  35. data/lib/rack/handler/mongrel.rb +87 -0
  36. data/lib/rack/handler/scgi.rb +62 -0
  37. data/lib/rack/handler/swiftiplied_mongrel.rb +8 -0
  38. data/lib/rack/handler/thin.rb +18 -0
  39. data/lib/rack/handler/webrick.rb +71 -0
  40. data/lib/rack/handler.rb +69 -0
  41. data/lib/rack/head.rb +19 -0
  42. data/lib/rack/lint.rb +546 -0
  43. data/lib/rack/lobster.rb +65 -0
  44. data/lib/rack/lock.rb +16 -0
  45. data/lib/rack/methodoverride.rb +27 -0
  46. data/lib/rack/mime.rb +204 -0
  47. data/lib/rack/mock.rb +187 -0
  48. data/lib/rack/recursive.rb +57 -0
  49. data/lib/rack/reloader.rb +107 -0
  50. data/lib/rack/request.rb +248 -0
  51. data/lib/rack/response.rb +183 -0
  52. data/lib/rack/rewindable_input.rb +100 -0
  53. data/lib/rack/session/abstract/id.rb +142 -0
  54. data/lib/rack/session/cookie.rb +91 -0
  55. data/lib/rack/session/memcache.rb +109 -0
  56. data/lib/rack/session/pool.rb +100 -0
  57. data/lib/rack/showexceptions.rb +349 -0
  58. data/lib/rack/showstatus.rb +106 -0
  59. data/lib/rack/static.rb +38 -0
  60. data/lib/rack/urlmap.rb +55 -0
  61. data/lib/rack/utils.rb +528 -0
  62. data/lib/rack.rb +90 -0
  63. data/rack.gemspec +60 -0
  64. data/test/cgi/lighttpd.conf +20 -0
  65. data/test/cgi/test +9 -0
  66. data/test/cgi/test.fcgi +8 -0
  67. data/test/cgi/test.ru +7 -0
  68. data/test/multipart/binary +0 -0
  69. data/test/multipart/empty +10 -0
  70. data/test/multipart/file1.txt +1 -0
  71. data/test/multipart/ie +6 -0
  72. data/test/multipart/nested +10 -0
  73. data/test/multipart/none +9 -0
  74. data/test/multipart/text +10 -0
  75. data/test/spec_rack_auth_basic.rb +73 -0
  76. data/test/spec_rack_auth_digest.rb +226 -0
  77. data/test/spec_rack_auth_openid.rb +84 -0
  78. data/test/spec_rack_builder.rb +84 -0
  79. data/test/spec_rack_camping.rb +51 -0
  80. data/test/spec_rack_cascade.rb +48 -0
  81. data/test/spec_rack_cgi.rb +89 -0
  82. data/test/spec_rack_chunked.rb +62 -0
  83. data/test/spec_rack_commonlogger.rb +61 -0
  84. data/test/spec_rack_conditionalget.rb +41 -0
  85. data/test/spec_rack_content_length.rb +43 -0
  86. data/test/spec_rack_content_type.rb +30 -0
  87. data/test/spec_rack_deflater.rb +127 -0
  88. data/test/spec_rack_directory.rb +61 -0
  89. data/test/spec_rack_fastcgi.rb +89 -0
  90. data/test/spec_rack_file.rb +75 -0
  91. data/test/spec_rack_handler.rb +43 -0
  92. data/test/spec_rack_head.rb +30 -0
  93. data/test/spec_rack_lint.rb +521 -0
  94. data/test/spec_rack_lobster.rb +45 -0
  95. data/test/spec_rack_lock.rb +38 -0
  96. data/test/spec_rack_methodoverride.rb +60 -0
  97. data/test/spec_rack_mock.rb +243 -0
  98. data/test/spec_rack_mongrel.rb +189 -0
  99. data/test/spec_rack_recursive.rb +77 -0
  100. data/test/spec_rack_request.rb +504 -0
  101. data/test/spec_rack_response.rb +218 -0
  102. data/test/spec_rack_rewindable_input.rb +118 -0
  103. data/test/spec_rack_session_cookie.rb +82 -0
  104. data/test/spec_rack_session_memcache.rb +250 -0
  105. data/test/spec_rack_session_pool.rb +172 -0
  106. data/test/spec_rack_showexceptions.rb +21 -0
  107. data/test/spec_rack_showstatus.rb +72 -0
  108. data/test/spec_rack_static.rb +37 -0
  109. data/test/spec_rack_thin.rb +91 -0
  110. data/test/spec_rack_urlmap.rb +185 -0
  111. data/test/spec_rack_utils.rb +467 -0
  112. data/test/spec_rack_webrick.rb +130 -0
  113. data/test/testrequest.rb +57 -0
  114. data/test/unregistered_handler/rack/handler/unregistered.rb +7 -0
  115. data/test/unregistered_handler/rack/handler/unregistered_long_one.rb +7 -0
  116. metadata +276 -0
@@ -0,0 +1,87 @@
1
+ require 'mongrel'
2
+ require 'stringio'
3
+ require 'rack/content_length'
4
+ require 'rack/chunked'
5
+
6
+ module Rack
7
+ module Handler
8
+ class Mongrel < ::Mongrel::HttpHandler
9
+ def self.run(app, options={})
10
+ server = ::Mongrel::HttpServer.new(options[:Host] || '0.0.0.0',
11
+ options[:Port] || 8080)
12
+ # Acts like Rack::URLMap, utilizing Mongrel's own path finding methods.
13
+ # Use is similar to #run, replacing the app argument with a hash of
14
+ # { path=>app, ... } or an instance of Rack::URLMap.
15
+ if options[:map]
16
+ if app.is_a? Hash
17
+ app.each do |path, appl|
18
+ path = '/'+path unless path[0] == ?/
19
+ server.register(path, Rack::Handler::Mongrel.new(appl))
20
+ end
21
+ elsif app.is_a? URLMap
22
+ app.instance_variable_get(:@mapping).each do |(host, path, appl)|
23
+ next if !host.nil? && !options[:Host].nil? && options[:Host] != host
24
+ path = '/'+path unless path[0] == ?/
25
+ server.register(path, Rack::Handler::Mongrel.new(appl))
26
+ end
27
+ else
28
+ raise ArgumentError, "first argument should be a Hash or URLMap"
29
+ end
30
+ else
31
+ server.register('/', Rack::Handler::Mongrel.new(app))
32
+ end
33
+ yield server if block_given?
34
+ server.run.join
35
+ end
36
+
37
+ def initialize(app)
38
+ @app = Rack::Chunked.new(Rack::ContentLength.new(app))
39
+ end
40
+
41
+ def process(request, response)
42
+ env = {}.replace(request.params)
43
+ env.delete "HTTP_CONTENT_TYPE"
44
+ env.delete "HTTP_CONTENT_LENGTH"
45
+
46
+ env["SCRIPT_NAME"] = "" if env["SCRIPT_NAME"] == "/"
47
+
48
+ rack_input = request.body || StringIO.new('')
49
+ rack_input.set_encoding(Encoding::BINARY) if rack_input.respond_to?(:set_encoding)
50
+
51
+ env.update({"rack.version" => [1,0],
52
+ "rack.input" => request.body || StringIO.new(""),
53
+ "rack.errors" => $stderr,
54
+
55
+ "rack.multithread" => true,
56
+ "rack.multiprocess" => false, # ???
57
+ "rack.run_once" => false,
58
+
59
+ "rack.url_scheme" => "http",
60
+ })
61
+ env["QUERY_STRING"] ||= ""
62
+ env.delete "PATH_INFO" if env["PATH_INFO"] == ""
63
+
64
+ status, headers, body = @app.call(env)
65
+
66
+ begin
67
+ response.status = status.to_i
68
+ response.send_status(nil)
69
+
70
+ headers.each { |k, vs|
71
+ vs.split("\n").each { |v|
72
+ response.header[k] = v
73
+ }
74
+ }
75
+ response.send_header
76
+
77
+ body.each { |part|
78
+ response.write part
79
+ response.socket.flush
80
+ }
81
+ ensure
82
+ body.close if body.respond_to? :close
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,62 @@
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
+
36
+ rack_input = StringIO.new(input_body)
37
+ rack_input.set_encoding(Encoding::BINARY) if rack_input.respond_to?(:set_encoding)
38
+
39
+ env.update({"rack.version" => [1,0],
40
+ "rack.input" => rack_input,
41
+ "rack.errors" => $stderr,
42
+ "rack.multithread" => true,
43
+ "rack.multiprocess" => true,
44
+ "rack.run_once" => false,
45
+
46
+ "rack.url_scheme" => ["yes", "on", "1"].include?(env["HTTPS"]) ? "https" : "http"
47
+ })
48
+ status, headers, body = app.call(env)
49
+ begin
50
+ socket.write("Status: #{status}\r\n")
51
+ headers.each do |k, vs|
52
+ vs.split("\n").each { |v| socket.write("#{k}: #{v}\r\n")}
53
+ end
54
+ socket.write("\r\n")
55
+ body.each {|s| socket.write(s)}
56
+ ensure
57
+ body.close if body.respond_to? :close
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,8 @@
1
+ require 'swiftcore/swiftiplied_mongrel'
2
+
3
+ module Rack
4
+ module Handler
5
+ class SwiftipliedMongrel < Handler::Mongrel
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,18 @@
1
+ require "thin"
2
+ require "rack/content_length"
3
+ require "rack/chunked"
4
+
5
+ module Rack
6
+ module Handler
7
+ class Thin
8
+ def self.run(app, options={})
9
+ app = Rack::Chunked.new(Rack::ContentLength.new(app))
10
+ server = ::Thin::Server.new(options[:Host] || '0.0.0.0',
11
+ options[:Port] || 8080,
12
+ app)
13
+ yield server if block_given?
14
+ server.start
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,71 @@
1
+ require 'webrick'
2
+ require 'stringio'
3
+ require 'rack/content_length'
4
+
5
+ module Rack
6
+ module Handler
7
+ class WEBrick < ::WEBrick::HTTPServlet::AbstractServlet
8
+ def self.run(app, options={})
9
+ options[:BindAddress] = options.delete(:Host) if options[:Host]
10
+ server = ::WEBrick::HTTPServer.new(options)
11
+ server.mount "/", Rack::Handler::WEBrick, app
12
+ trap(:INT) { server.shutdown }
13
+ yield server if block_given?
14
+ server.start
15
+ end
16
+
17
+ def initialize(server, app)
18
+ super server
19
+ @app = Rack::ContentLength.new(app)
20
+ end
21
+
22
+ def service(req, res)
23
+ env = req.meta_vars
24
+ env.delete_if { |k, v| v.nil? }
25
+
26
+ rack_input = StringIO.new(req.body.to_s)
27
+ rack_input.set_encoding(Encoding::BINARY) if rack_input.respond_to?(:set_encoding)
28
+
29
+ env.update({"rack.version" => [1,0],
30
+ "rack.input" => rack_input,
31
+ "rack.errors" => $stderr,
32
+
33
+ "rack.multithread" => true,
34
+ "rack.multiprocess" => false,
35
+ "rack.run_once" => false,
36
+
37
+ "rack.url_scheme" => ["yes", "on", "1"].include?(ENV["HTTPS"]) ? "https" : "http"
38
+ })
39
+
40
+ env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"]
41
+ env["QUERY_STRING"] ||= ""
42
+ env["REQUEST_PATH"] ||= "/"
43
+ if env["PATH_INFO"] == ""
44
+ env.delete "PATH_INFO"
45
+ else
46
+ path, n = req.request_uri.path, env["SCRIPT_NAME"].length
47
+ env["PATH_INFO"] = path[n, path.length-n]
48
+ end
49
+
50
+ status, headers, body = @app.call(env)
51
+ begin
52
+ res.status = status.to_i
53
+ headers.each { |k, vs|
54
+ if k.downcase == "set-cookie"
55
+ res.cookies.concat vs.split("\n")
56
+ else
57
+ vs.split("\n").each { |v|
58
+ res[k] = v
59
+ }
60
+ end
61
+ }
62
+ body.each { |part|
63
+ res.body << part
64
+ }
65
+ ensure
66
+ body.close if body.respond_to? :close
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,69 @@
1
+ module Rack
2
+ # *Handlers* connect web servers with Rack.
3
+ #
4
+ # Rack includes Handlers for Mongrel, WEBrick, FastCGI, CGI, SCGI
5
+ # and LiteSpeed.
6
+ #
7
+ # Handlers usually are activated by calling <tt>MyHandler.run(myapp)</tt>.
8
+ # A second optional hash can be passed to include server-specific
9
+ # configuration.
10
+ module Handler
11
+ def self.get(server)
12
+ return unless server
13
+ server = server.to_s
14
+
15
+ if klass = @handlers[server]
16
+ obj = Object
17
+ klass.split("::").each { |x| obj = obj.const_get(x) }
18
+ obj
19
+ else
20
+ try_require('rack/handler', server)
21
+ const_get(server)
22
+ end
23
+ end
24
+
25
+ # Transforms server-name constants to their canonical form as filenames,
26
+ # then tries to require them but silences the LoadError if not found
27
+ #
28
+ # Naming convention:
29
+ #
30
+ # Foo # => 'foo'
31
+ # FooBar # => 'foo_bar.rb'
32
+ # FooBAR # => 'foobar.rb'
33
+ # FOObar # => 'foobar.rb'
34
+ # FOOBAR # => 'foobar.rb'
35
+ # FooBarBaz # => 'foo_bar_baz.rb'
36
+ def self.try_require(prefix, const_name)
37
+ file = const_name.gsub(/^[A-Z]+/) { |pre| pre.downcase }.
38
+ gsub(/[A-Z]+[^A-Z]/, '_\&').downcase
39
+
40
+ require(::File.join(prefix, file))
41
+ rescue LoadError
42
+ end
43
+
44
+ def self.register(server, klass)
45
+ @handlers ||= {}
46
+ @handlers[server] = klass
47
+ end
48
+
49
+ autoload :CGI, "rack/handler/cgi"
50
+ autoload :FastCGI, "rack/handler/fastcgi"
51
+ autoload :Mongrel, "rack/handler/mongrel"
52
+ autoload :EventedMongrel, "rack/handler/evented_mongrel"
53
+ autoload :SwiftipliedMongrel, "rack/handler/swiftiplied_mongrel"
54
+ autoload :WEBrick, "rack/handler/webrick"
55
+ autoload :LSWS, "rack/handler/lsws"
56
+ autoload :SCGI, "rack/handler/scgi"
57
+ autoload :Thin, "rack/handler/thin"
58
+
59
+ register 'cgi', 'Rack::Handler::CGI'
60
+ register 'fastcgi', 'Rack::Handler::FastCGI'
61
+ register 'mongrel', 'Rack::Handler::Mongrel'
62
+ register 'emongrel', 'Rack::Handler::EventedMongrel'
63
+ register 'smongrel', 'Rack::Handler::SwiftipliedMongrel'
64
+ register 'webrick', 'Rack::Handler::WEBrick'
65
+ register 'lsws', 'Rack::Handler::LSWS'
66
+ register 'scgi', 'Rack::Handler::SCGI'
67
+ register 'thin', 'Rack::Handler::Thin'
68
+ end
69
+ end
data/lib/rack/head.rb ADDED
@@ -0,0 +1,19 @@
1
+ module Rack
2
+
3
+ class Head
4
+ def initialize(app)
5
+ @app = app
6
+ end
7
+
8
+ def call(env)
9
+ status, headers, body = @app.call(env)
10
+
11
+ if env["REQUEST_METHOD"] == "HEAD"
12
+ [status, headers, []]
13
+ else
14
+ [status, headers, body]
15
+ end
16
+ end
17
+ end
18
+
19
+ end