technomancy-rack 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. data/KNOWN-ISSUES +18 -0
  2. data/README +242 -0
  3. data/bin/rackup +183 -0
  4. data/lib/rack.rb +92 -0
  5. data/lib/rack/adapter/camping.rb +22 -0
  6. data/lib/rack/auth/abstract/handler.rb +28 -0
  7. data/lib/rack/auth/abstract/request.rb +37 -0
  8. data/lib/rack/auth/basic.rb +58 -0
  9. data/lib/rack/auth/digest/md5.rb +124 -0
  10. data/lib/rack/auth/digest/nonce.rb +51 -0
  11. data/lib/rack/auth/digest/params.rb +55 -0
  12. data/lib/rack/auth/digest/request.rb +40 -0
  13. data/lib/rack/auth/openid.rb +116 -0
  14. data/lib/rack/builder.rb +56 -0
  15. data/lib/rack/cascade.rb +36 -0
  16. data/lib/rack/commonlogger.rb +56 -0
  17. data/lib/rack/file.rb +112 -0
  18. data/lib/rack/handler/cgi.rb +57 -0
  19. data/lib/rack/handler/fastcgi.rb +83 -0
  20. data/lib/rack/handler/lsws.rb +52 -0
  21. data/lib/rack/handler/mongrel.rb +97 -0
  22. data/lib/rack/handler/scgi.rb +57 -0
  23. data/lib/rack/handler/webrick.rb +57 -0
  24. data/lib/rack/lint.rb +394 -0
  25. data/lib/rack/lobster.rb +65 -0
  26. data/lib/rack/mock.rb +172 -0
  27. data/lib/rack/recursive.rb +57 -0
  28. data/lib/rack/reloader.rb +64 -0
  29. data/lib/rack/request.rb +197 -0
  30. data/lib/rack/response.rb +166 -0
  31. data/lib/rack/session/abstract/id.rb +126 -0
  32. data/lib/rack/session/cookie.rb +71 -0
  33. data/lib/rack/session/memcache.rb +83 -0
  34. data/lib/rack/session/pool.rb +67 -0
  35. data/lib/rack/showexceptions.rb +344 -0
  36. data/lib/rack/showstatus.rb +103 -0
  37. data/lib/rack/static.rb +38 -0
  38. data/lib/rack/urlmap.rb +48 -0
  39. data/lib/rack/utils.rb +256 -0
  40. data/test/spec_rack_auth_basic.rb +69 -0
  41. data/test/spec_rack_auth_digest.rb +169 -0
  42. data/test/spec_rack_builder.rb +50 -0
  43. data/test/spec_rack_camping.rb +47 -0
  44. data/test/spec_rack_cascade.rb +50 -0
  45. data/test/spec_rack_cgi.rb +91 -0
  46. data/test/spec_rack_commonlogger.rb +32 -0
  47. data/test/spec_rack_fastcgi.rb +91 -0
  48. data/test/spec_rack_file.rb +40 -0
  49. data/test/spec_rack_lint.rb +317 -0
  50. data/test/spec_rack_lobster.rb +45 -0
  51. data/test/spec_rack_mock.rb +152 -0
  52. data/test/spec_rack_mongrel.rb +165 -0
  53. data/test/spec_rack_recursive.rb +77 -0
  54. data/test/spec_rack_request.rb +384 -0
  55. data/test/spec_rack_response.rb +167 -0
  56. data/test/spec_rack_session_cookie.rb +49 -0
  57. data/test/spec_rack_session_memcache.rb +100 -0
  58. data/test/spec_rack_session_pool.rb +84 -0
  59. data/test/spec_rack_showexceptions.rb +21 -0
  60. data/test/spec_rack_showstatus.rb +71 -0
  61. data/test/spec_rack_static.rb +37 -0
  62. data/test/spec_rack_urlmap.rb +175 -0
  63. data/test/spec_rack_utils.rb +69 -0
  64. data/test/spec_rack_webrick.rb +106 -0
  65. data/test/testrequest.rb +43 -0
  66. metadata +167 -0
@@ -0,0 +1,37 @@
1
+ require 'test/spec'
2
+
3
+ require 'rack/static'
4
+ require 'rack/mock'
5
+
6
+ class DummyApp
7
+ def call(env)
8
+ [200, {}, "Hello World"]
9
+ end
10
+ end
11
+
12
+ context "Rack::Static" do
13
+ root = File.expand_path(File.dirname(__FILE__))
14
+ OPTIONS = {:urls => ["/cgi"], :root => root}
15
+
16
+ setup do
17
+ @request = Rack::MockRequest.new(Rack::Static.new(DummyApp.new, OPTIONS))
18
+ end
19
+
20
+ specify "serves files" do
21
+ res = @request.get("/cgi/test")
22
+ res.should.be.ok
23
+ res.body.should =~ /ruby/
24
+ end
25
+
26
+ specify "404s if url root is known but it can't find the file" do
27
+ res = @request.get("/cgi/foo")
28
+ res.should.be.not_found
29
+ end
30
+
31
+ specify "calls down the chain if url root is not known" do
32
+ res = @request.get("/something/else")
33
+ res.should.be.ok
34
+ res.body.should == "Hello World"
35
+ end
36
+
37
+ end
@@ -0,0 +1,175 @@
1
+ require 'test/spec'
2
+
3
+ require 'rack/urlmap'
4
+ require 'rack/mock'
5
+
6
+ context "Rack::URLMap" do
7
+ specify "dispatches paths correctly" do
8
+ app = lambda { |env|
9
+ [200, {
10
+ 'X-ScriptName' => env['SCRIPT_NAME'],
11
+ 'X-PathInfo' => env['PATH_INFO'],
12
+ 'Content-Type' => 'text/plain'
13
+ }, [""]]
14
+ }
15
+ map = Rack::URLMap.new({
16
+ 'http://foo.org/bar' => app,
17
+ '/foo' => app,
18
+ '/foo/bar' => app
19
+ })
20
+
21
+ res = Rack::MockRequest.new(map).get("/")
22
+ res.should.be.not_found
23
+
24
+ res = Rack::MockRequest.new(map).get("/qux")
25
+ res.should.be.not_found
26
+
27
+ res = Rack::MockRequest.new(map).get("/foo")
28
+ res.should.be.ok
29
+ res["X-ScriptName"].should.equal "/foo"
30
+ res["X-PathInfo"].should.equal ""
31
+
32
+ res = Rack::MockRequest.new(map).get("/foo/")
33
+ res.should.be.ok
34
+ res["X-ScriptName"].should.equal "/foo"
35
+ res["X-PathInfo"].should.equal "/"
36
+
37
+ res = Rack::MockRequest.new(map).get("/foo/bar")
38
+ res.should.be.ok
39
+ res["X-ScriptName"].should.equal "/foo/bar"
40
+ res["X-PathInfo"].should.equal ""
41
+
42
+ res = Rack::MockRequest.new(map).get("/foo/bar/")
43
+ res.should.be.ok
44
+ res["X-ScriptName"].should.equal "/foo/bar"
45
+ res["X-PathInfo"].should.equal "/"
46
+
47
+ res = Rack::MockRequest.new(map).get("/foo/quux", "SCRIPT_NAME" => "/bleh")
48
+ res.should.be.ok
49
+ res["X-ScriptName"].should.equal "/bleh/foo"
50
+ res["X-PathInfo"].should.equal "/quux"
51
+
52
+ res = Rack::MockRequest.new(map).get("/bar", 'HTTP_HOST' => 'foo.org')
53
+ res.should.be.ok
54
+ res["X-ScriptName"].should.equal "/bar"
55
+ res["X-PathInfo"].should.be.empty
56
+
57
+ res = Rack::MockRequest.new(map).get("/bar/", 'HTTP_HOST' => 'foo.org')
58
+ res.should.be.ok
59
+ res["X-ScriptName"].should.equal "/bar"
60
+ res["X-PathInfo"].should.equal '/'
61
+ end
62
+
63
+
64
+ specify "dispatches hosts correctly" do
65
+ map = Rack::URLMap.new("http://foo.org/" => lambda { |env|
66
+ [200,
67
+ { "Content-Type" => "text/plain",
68
+ "X-Position" => "foo.org",
69
+ "X-Host" => env["HTTP_HOST"] || env["SERVER_NAME"],
70
+ }, [""]]},
71
+ "http://bar.org/" => lambda { |env|
72
+ [200,
73
+ { "Content-Type" => "text/plain",
74
+ "X-Position" => "bar.org",
75
+ "X-Host" => env["HTTP_HOST"] || env["SERVER_NAME"],
76
+ }, [""]]},
77
+ "/" => lambda { |env|
78
+ [200,
79
+ { "Content-Type" => "text/plain",
80
+ "X-Position" => "default.org",
81
+ "X-Host" => env["HTTP_HOST"] || env["SERVER_NAME"],
82
+ }, [""]]}
83
+ )
84
+
85
+ res = Rack::MockRequest.new(map).get("/")
86
+ res.should.be.ok
87
+ res["X-Position"].should.equal "default.org"
88
+
89
+ res = Rack::MockRequest.new(map).get("/", "HTTP_HOST" => "bar.org")
90
+ res.should.be.ok
91
+ res["X-Position"].should.equal "bar.org"
92
+
93
+ res = Rack::MockRequest.new(map).get("/", "HTTP_HOST" => "foo.org")
94
+ res.should.be.ok
95
+ res["X-Position"].should.equal "foo.org"
96
+
97
+ res = Rack::MockRequest.new(map).get("http://foo.org/")
98
+ res.should.be.ok
99
+ res["X-Position"].should.equal "default.org"
100
+
101
+ res = Rack::MockRequest.new(map).get("/", "HTTP_HOST" => "example.org")
102
+ res.should.be.ok
103
+ res["X-Position"].should.equal "default.org"
104
+
105
+ res = Rack::MockRequest.new(map).get("/",
106
+ "HTTP_HOST" => "example.org:9292",
107
+ "SERVER_PORT" => "9292")
108
+ res.should.be.ok
109
+ res["X-Position"].should.equal "default.org"
110
+ end
111
+
112
+ specify "should be nestable" do
113
+ map = Rack::URLMap.new("/foo" =>
114
+ Rack::URLMap.new("/bar" =>
115
+ Rack::URLMap.new("/quux" => lambda { |env|
116
+ [200,
117
+ { "Content-Type" => "text/plain",
118
+ "X-Position" => "/foo/bar/quux",
119
+ "X-PathInfo" => env["PATH_INFO"],
120
+ "X-ScriptName" => env["SCRIPT_NAME"],
121
+ }, [""]]}
122
+ )))
123
+
124
+ res = Rack::MockRequest.new(map).get("/foo/bar")
125
+ res.should.be.not_found
126
+
127
+ res = Rack::MockRequest.new(map).get("/foo/bar/quux")
128
+ res.should.be.ok
129
+ res["X-Position"].should.equal "/foo/bar/quux"
130
+ res["X-PathInfo"].should.equal ""
131
+ res["X-ScriptName"].should.equal "/foo/bar/quux"
132
+ end
133
+
134
+ specify "should route root apps correctly" do
135
+ map = Rack::URLMap.new("/" => lambda { |env|
136
+ [200,
137
+ { "Content-Type" => "text/plain",
138
+ "X-Position" => "root",
139
+ "X-PathInfo" => env["PATH_INFO"],
140
+ "X-ScriptName" => env["SCRIPT_NAME"]
141
+ }, [""]]},
142
+ "/foo" => lambda { |env|
143
+ [200,
144
+ { "Content-Type" => "text/plain",
145
+ "X-Position" => "foo",
146
+ "X-PathInfo" => env["PATH_INFO"],
147
+ "X-ScriptName" => env["SCRIPT_NAME"]
148
+ }, [""]]}
149
+ )
150
+
151
+ res = Rack::MockRequest.new(map).get("/foo/bar")
152
+ res.should.be.ok
153
+ res["X-Position"].should.equal "foo"
154
+ res["X-PathInfo"].should.equal "/bar"
155
+ res["X-ScriptName"].should.equal "/foo"
156
+
157
+ res = Rack::MockRequest.new(map).get("/foo")
158
+ res.should.be.ok
159
+ res["X-Position"].should.equal "foo"
160
+ res["X-PathInfo"].should.equal ""
161
+ res["X-ScriptName"].should.equal "/foo"
162
+
163
+ res = Rack::MockRequest.new(map).get("/bar")
164
+ res.should.be.ok
165
+ res["X-Position"].should.equal "root"
166
+ res["X-PathInfo"].should.equal "/bar"
167
+ res["X-ScriptName"].should.equal ""
168
+
169
+ res = Rack::MockRequest.new(map).get("")
170
+ res.should.be.ok
171
+ res["X-Position"].should.equal "root"
172
+ res["X-PathInfo"].should.equal "/"
173
+ res["X-ScriptName"].should.equal ""
174
+ end
175
+ end
@@ -0,0 +1,69 @@
1
+ require 'rack/utils'
2
+
3
+ context "Rack::Utils" do
4
+ specify "should escape correctly" do
5
+ Rack::Utils.escape("fo<o>bar").should.equal "fo%3Co%3Ebar"
6
+ Rack::Utils.escape("a space").should.equal "a+space"
7
+ Rack::Utils.escape("q1!2\"'w$5&7/z8)?\\").
8
+ should.equal "q1%212%22%27w%245%267%2Fz8%29%3F%5C"
9
+ end
10
+
11
+ specify "should unescape correctly" do
12
+ Rack::Utils.unescape("fo%3Co%3Ebar").should.equal "fo<o>bar"
13
+ Rack::Utils.unescape("a+space").should.equal "a space"
14
+ Rack::Utils.unescape("a%20space").should.equal "a space"
15
+ Rack::Utils.unescape("q1%212%22%27w%245%267%2Fz8%29%3F%5C").
16
+ should.equal "q1!2\"'w$5&7/z8)?\\"
17
+ end
18
+
19
+ specify "should parse queries correctly" do
20
+ Rack::Utils.parse_query("foo=bar").should.equal "foo" => "bar"
21
+ Rack::Utils.parse_query("foo=bar&foo=quux").
22
+ should.equal "foo" => ["bar", "quux"]
23
+ Rack::Utils.parse_query("foo=1&bar=2").
24
+ should.equal "foo" => "1", "bar" => "2"
25
+ Rack::Utils.parse_query("my+weird+field=q1%212%22%27w%245%267%2Fz8%29%3F").
26
+ should.equal "my weird field" => "q1!2\"'w$5&7/z8)?"
27
+ end
28
+
29
+ specify "should create queries correctly" do
30
+ Rack::Utils.build_query("foo" => "bar").should.equal "foo=bar"
31
+ Rack::Utils.build_query("foo" => ["bar", "quux"]).
32
+ should.equal "foo=bar&foo=quux"
33
+ Rack::Utils.build_query("foo" => "1", "bar" => "2").
34
+ should.equal "foo=1&bar=2"
35
+ Rack::Utils.build_query("my weird field" => "q1!2\"'w$5&7/z8)?").
36
+ should.equal "my+weird+field=q1%212%22%27w%245%267%2Fz8%29%3F"
37
+ end
38
+ end
39
+
40
+ context "Rack::Utils::HeaderHash" do
41
+ specify "should capitalize on all accesses" do
42
+ h = Rack::Utils::HeaderHash.new("foo" => "bar")
43
+ h["foo"].should.equal "bar"
44
+ h["Foo"].should.equal "bar"
45
+ h["FOO"].should.equal "bar"
46
+
47
+ h.to_hash.should.equal "Foo" => "bar"
48
+
49
+ h["bar-zzle"] = "quux"
50
+
51
+ h.to_hash.should.equal "Foo" => "bar", "Bar-Zzle" => "quux"
52
+ end
53
+
54
+ specify "should capitalize correctly" do
55
+ h = Rack::Utils::HeaderHash.new
56
+
57
+ h.capitalize("foo").should.equal "Foo"
58
+ h.capitalize("foo-bar").should.equal "Foo-Bar"
59
+ h.capitalize("foo_bar").should.equal "Foo_Bar"
60
+ h.capitalize("foo bar").should.equal "Foo Bar"
61
+ h.capitalize("foo-bar-quux").should.equal "Foo-Bar-Quux"
62
+ h.capitalize("foo-bar-2quux").should.equal "Foo-Bar-2quux"
63
+ end
64
+
65
+ specify "should be converted to real Hash" do
66
+ h = Rack::Utils::HeaderHash.new("foo" => "bar")
67
+ h.to_hash.should.be.instance_of Hash
68
+ end
69
+ end
@@ -0,0 +1,106 @@
1
+ require 'test/spec'
2
+
3
+ require 'rack/handler/webrick'
4
+ require 'rack/lint'
5
+ require 'testrequest'
6
+
7
+ Thread.abort_on_exception = true
8
+
9
+ context "Rack::Handler::WEBrick" do
10
+ include TestRequest::Helpers
11
+
12
+ setup do
13
+ @server = WEBrick::HTTPServer.new(:Host => @host='0.0.0.0',
14
+ :Port => @port=9202,
15
+ :Logger => WEBrick::Log.new(nil, WEBrick::BasicLog::WARN),
16
+ :AccessLog => [])
17
+ @server.mount "/test", Rack::Handler::WEBrick,
18
+ Rack::Lint.new(TestRequest.new)
19
+ Thread.new { @server.start }
20
+ trap(:INT) { @server.shutdown }
21
+ end
22
+
23
+ specify "should respond" do
24
+ lambda {
25
+ GET("/test")
26
+ }.should.not.raise
27
+ end
28
+
29
+ specify "should be a WEBrick" do
30
+ GET("/test")
31
+ status.should.be 200
32
+ response["SERVER_SOFTWARE"].should =~ /WEBrick/
33
+ response["HTTP_VERSION"].should.equal "HTTP/1.1"
34
+ response["SERVER_PROTOCOL"].should.equal "HTTP/1.1"
35
+ response["SERVER_PORT"].should.equal "9202"
36
+ response["SERVER_NAME"].should.equal "0.0.0.0"
37
+ end
38
+
39
+ specify "should have rack headers" do
40
+ GET("/test")
41
+ response["rack.version"].should.equal [0,1]
42
+ response["rack.multithread"].should.be true
43
+ response["rack.multiprocess"].should.be false
44
+ response["rack.run_once"].should.be false
45
+ end
46
+
47
+ specify "should have CGI headers on GET" do
48
+ GET("/test")
49
+ response["REQUEST_METHOD"].should.equal "GET"
50
+ response["SCRIPT_NAME"].should.equal "/test"
51
+ response["REQUEST_PATH"].should.equal "/"
52
+ response["PATH_INFO"].should.be.nil
53
+ response["QUERY_STRING"].should.equal ""
54
+ response["test.postdata"].should.equal ""
55
+
56
+ GET("/test/foo?quux=1")
57
+ response["REQUEST_METHOD"].should.equal "GET"
58
+ response["SCRIPT_NAME"].should.equal "/test"
59
+ response["REQUEST_PATH"].should.equal "/"
60
+ response["PATH_INFO"].should.equal "/foo"
61
+ response["QUERY_STRING"].should.equal "quux=1"
62
+ end
63
+
64
+ specify "should have CGI headers on POST" do
65
+ POST("/test", {"rack-form-data" => "23"}, {'X-test-header' => '42'})
66
+ status.should.equal 200
67
+ response["REQUEST_METHOD"].should.equal "POST"
68
+ response["SCRIPT_NAME"].should.equal "/test"
69
+ response["REQUEST_PATH"].should.equal "/"
70
+ response["QUERY_STRING"].should.equal ""
71
+ response["HTTP_X_TEST_HEADER"].should.equal "42"
72
+ response["test.postdata"].should.equal "rack-form-data=23"
73
+ end
74
+
75
+ specify "should support HTTP auth" do
76
+ GET("/test", {:user => "ruth", :passwd => "secret"})
77
+ response["HTTP_AUTHORIZATION"].should.equal "Basic cnV0aDpzZWNyZXQ="
78
+ end
79
+
80
+ specify "should set status" do
81
+ GET("/test?secret")
82
+ status.should.equal 403
83
+ response["rack.url_scheme"].should.equal "http"
84
+ end
85
+
86
+ specify "should provide a .run" do
87
+ block_ran = false
88
+ catch(:done) {
89
+ Rack::Handler::WEBrick.run(lambda {},
90
+ {:Port => 9210,
91
+ :Logger => WEBrick::Log.new(nil, WEBrick::BasicLog::WARN),
92
+ :AccessLog => []}) { |server|
93
+ block_ran = true
94
+ server.should.be.kind_of WEBrick::HTTPServer
95
+ @s = server
96
+ throw :done
97
+ }
98
+ }
99
+ block_ran.should.be true
100
+ @s.shutdown
101
+ end
102
+
103
+ teardown do
104
+ @server.shutdown
105
+ end
106
+ end
@@ -0,0 +1,43 @@
1
+ require 'yaml'
2
+ require 'net/http'
3
+
4
+ class TestRequest
5
+ def call(env)
6
+ status = env["QUERY_STRING"] =~ /secret/ ? 403 : 200
7
+ env["test.postdata"] = env["rack.input"].read
8
+ [status, {"Content-Type" => "text/yaml"}, [env.to_yaml]]
9
+ end
10
+
11
+ module Helpers
12
+ attr_reader :status, :response
13
+
14
+ def GET(path, header={})
15
+ Net::HTTP.start(@host, @port) { |http|
16
+ user = header.delete(:user)
17
+ passwd = header.delete(:passwd)
18
+
19
+ get = Net::HTTP::Get.new(path, header)
20
+ get.basic_auth user, passwd if user && passwd
21
+ http.request(get) { |response|
22
+ @status = response.code.to_i
23
+ @response = YAML.load(response.body)
24
+ }
25
+ }
26
+ end
27
+
28
+ def POST(path, formdata={}, header={})
29
+ Net::HTTP.start(@host, @port) { |http|
30
+ user = header.delete(:user)
31
+ passwd = header.delete(:passwd)
32
+
33
+ post = Net::HTTP::Post.new(path, header)
34
+ post.form_data = formdata
35
+ post.basic_auth user, passwd if user && passwd
36
+ http.request(post) { |response|
37
+ @status = response.code.to_i
38
+ @response = YAML.load(response.body)
39
+ }
40
+ }
41
+ end
42
+ end
43
+ end
metadata ADDED
@@ -0,0 +1,167 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: technomancy-rack
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.0
5
+ platform: ruby
6
+ authors:
7
+ - Christian Neukirchen
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-05-03 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: test-spec
17
+ version_requirement:
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 0.4.0
23
+ version:
24
+ - !ruby/object:Gem::Dependency
25
+ name: memcache-client
26
+ version_requirement:
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - ">="
30
+ - !ruby/object:Gem::Version
31
+ version: 1.5.0
32
+ version:
33
+ - !ruby/object:Gem::Dependency
34
+ name: camping
35
+ version_requirement:
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 1.5.0
41
+ version:
42
+ description: Rack provides minimal, modular and adaptable interface for developing web applications in Ruby. By wrapping HTTP requests and responses in the simplest way possible, it unifies and distills the API for web servers, web frameworks, and software in between (the so-called middleware) into a single method call. Also see http://rack.rubyforge.org.
43
+ email: chneukirchen@gmail.com
44
+ executables:
45
+ - rackup
46
+ extensions: []
47
+
48
+ extra_rdoc_files:
49
+ - README
50
+ - SPEC
51
+ - RDOX
52
+ - KNOWN-ISSUES
53
+ files:
54
+ - lib/rack.rb
55
+ - lib/rack/commonlogger.rb
56
+ - lib/rack/session/abstract/id.rb
57
+ - lib/rack/session/pool.rb
58
+ - lib/rack/session/memcache.rb
59
+ - lib/rack/session/cookie.rb
60
+ - lib/rack/lint.rb
61
+ - lib/rack/showexceptions.rb
62
+ - lib/rack/mock.rb
63
+ - lib/rack/showstatus.rb
64
+ - lib/rack/handler/lsws.rb
65
+ - lib/rack/handler/fastcgi.rb
66
+ - lib/rack/handler/mongrel.rb
67
+ - lib/rack/handler/cgi.rb
68
+ - lib/rack/handler/scgi.rb
69
+ - lib/rack/handler/webrick.rb
70
+ - lib/rack/urlmap.rb
71
+ - lib/rack/request.rb
72
+ - lib/rack/recursive.rb
73
+ - lib/rack/cascade.rb
74
+ - lib/rack/builder.rb
75
+ - lib/rack/utils.rb
76
+ - lib/rack/lobster.rb
77
+ - lib/rack/auth/abstract/request.rb
78
+ - lib/rack/auth/abstract/handler.rb
79
+ - lib/rack/auth/openid.rb
80
+ - lib/rack/auth/basic.rb
81
+ - lib/rack/auth/digest/md5.rb
82
+ - lib/rack/auth/digest/request.rb
83
+ - lib/rack/auth/digest/nonce.rb
84
+ - lib/rack/auth/digest/params.rb
85
+ - lib/rack/reloader.rb
86
+ - lib/rack/adapter/camping.rb
87
+ - lib/rack/response.rb
88
+ - lib/rack/static.rb
89
+ - lib/rack/file.rb
90
+ - test/spec_rack_static.rb
91
+ - test/spec_rack_session_cookie.rb
92
+ - test/spec_rack_lint.rb
93
+ - test/spec_rack_auth_digest.rb
94
+ - test/spec_rack_request.rb
95
+ - test/testrequest.rb
96
+ - test/spec_rack_auth_basic.rb
97
+ - test/spec_rack_session_memcache.rb
98
+ - test/spec_rack_session_pool.rb
99
+ - test/spec_rack_mock.rb
100
+ - test/spec_rack_urlmap.rb
101
+ - test/spec_rack_cascade.rb
102
+ - test/spec_rack_showstatus.rb
103
+ - test/spec_rack_response.rb
104
+ - test/spec_rack_recursive.rb
105
+ - test/spec_rack_builder.rb
106
+ - test/spec_rack_fastcgi.rb
107
+ - test/spec_rack_file.rb
108
+ - test/spec_rack_cgi.rb
109
+ - test/spec_rack_commonlogger.rb
110
+ - test/spec_rack_mongrel.rb
111
+ - test/spec_rack_webrick.rb
112
+ - test/spec_rack_showexceptions.rb
113
+ - test/spec_rack_lobster.rb
114
+ - test/spec_rack_camping.rb
115
+ - test/spec_rack_utils.rb
116
+ has_rdoc: true
117
+ homepage: http://rack.rubyforge.org
118
+ post_install_message:
119
+ rdoc_options: []
120
+
121
+ require_paths:
122
+ - lib
123
+ required_ruby_version: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: "0"
128
+ version:
129
+ required_rubygems_version: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - ">="
132
+ - !ruby/object:Gem::Version
133
+ version: "0"
134
+ version:
135
+ requirements: []
136
+
137
+ rubyforge_project: rack
138
+ rubygems_version: 1.0.1
139
+ signing_key:
140
+ specification_version: 2
141
+ summary: a modular Ruby webserver interface
142
+ test_files:
143
+ - test/spec_rack_static.rb
144
+ - test/spec_rack_session_cookie.rb
145
+ - test/spec_rack_lint.rb
146
+ - test/spec_rack_auth_digest.rb
147
+ - test/spec_rack_request.rb
148
+ - test/spec_rack_auth_basic.rb
149
+ - test/spec_rack_session_memcache.rb
150
+ - test/spec_rack_session_pool.rb
151
+ - test/spec_rack_mock.rb
152
+ - test/spec_rack_urlmap.rb
153
+ - test/spec_rack_cascade.rb
154
+ - test/spec_rack_showstatus.rb
155
+ - test/spec_rack_response.rb
156
+ - test/spec_rack_recursive.rb
157
+ - test/spec_rack_builder.rb
158
+ - test/spec_rack_fastcgi.rb
159
+ - test/spec_rack_file.rb
160
+ - test/spec_rack_cgi.rb
161
+ - test/spec_rack_commonlogger.rb
162
+ - test/spec_rack_mongrel.rb
163
+ - test/spec_rack_webrick.rb
164
+ - test/spec_rack_showexceptions.rb
165
+ - test/spec_rack_lobster.rb
166
+ - test/spec_rack_camping.rb
167
+ - test/spec_rack_utils.rb