edgar-rack 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (138) hide show
  1. data/COPYING +18 -0
  2. data/KNOWN-ISSUES +21 -0
  3. data/README +401 -0
  4. data/Rakefile +101 -0
  5. data/SPEC +171 -0
  6. data/bin/rackup +4 -0
  7. data/contrib/rack_logo.svg +111 -0
  8. data/example/lobster.ru +4 -0
  9. data/example/protectedlobster.rb +14 -0
  10. data/example/protectedlobster.ru +8 -0
  11. data/lib/rack.rb +81 -0
  12. data/lib/rack/auth/abstract/handler.rb +37 -0
  13. data/lib/rack/auth/abstract/request.rb +43 -0
  14. data/lib/rack/auth/basic.rb +58 -0
  15. data/lib/rack/auth/digest/md5.rb +124 -0
  16. data/lib/rack/auth/digest/nonce.rb +51 -0
  17. data/lib/rack/auth/digest/params.rb +53 -0
  18. data/lib/rack/auth/digest/request.rb +40 -0
  19. data/lib/rack/builder.rb +80 -0
  20. data/lib/rack/cascade.rb +41 -0
  21. data/lib/rack/chunked.rb +52 -0
  22. data/lib/rack/commonlogger.rb +49 -0
  23. data/lib/rack/conditionalget.rb +63 -0
  24. data/lib/rack/config.rb +15 -0
  25. data/lib/rack/content_length.rb +29 -0
  26. data/lib/rack/content_type.rb +23 -0
  27. data/lib/rack/deflater.rb +96 -0
  28. data/lib/rack/directory.rb +157 -0
  29. data/lib/rack/etag.rb +59 -0
  30. data/lib/rack/file.rb +118 -0
  31. data/lib/rack/handler.rb +88 -0
  32. data/lib/rack/handler/cgi.rb +61 -0
  33. data/lib/rack/handler/evented_mongrel.rb +8 -0
  34. data/lib/rack/handler/fastcgi.rb +90 -0
  35. data/lib/rack/handler/lsws.rb +61 -0
  36. data/lib/rack/handler/mongrel.rb +90 -0
  37. data/lib/rack/handler/scgi.rb +59 -0
  38. data/lib/rack/handler/swiftiplied_mongrel.rb +8 -0
  39. data/lib/rack/handler/thin.rb +17 -0
  40. data/lib/rack/handler/webrick.rb +73 -0
  41. data/lib/rack/head.rb +19 -0
  42. data/lib/rack/lint.rb +567 -0
  43. data/lib/rack/lobster.rb +65 -0
  44. data/lib/rack/lock.rb +44 -0
  45. data/lib/rack/logger.rb +18 -0
  46. data/lib/rack/methodoverride.rb +27 -0
  47. data/lib/rack/mime.rb +210 -0
  48. data/lib/rack/mock.rb +185 -0
  49. data/lib/rack/nulllogger.rb +18 -0
  50. data/lib/rack/recursive.rb +61 -0
  51. data/lib/rack/reloader.rb +109 -0
  52. data/lib/rack/request.rb +307 -0
  53. data/lib/rack/response.rb +151 -0
  54. data/lib/rack/rewindable_input.rb +104 -0
  55. data/lib/rack/runtime.rb +27 -0
  56. data/lib/rack/sendfile.rb +139 -0
  57. data/lib/rack/server.rb +289 -0
  58. data/lib/rack/session/abstract/id.rb +348 -0
  59. data/lib/rack/session/cookie.rb +152 -0
  60. data/lib/rack/session/memcache.rb +93 -0
  61. data/lib/rack/session/pool.rb +79 -0
  62. data/lib/rack/showexceptions.rb +378 -0
  63. data/lib/rack/showstatus.rb +113 -0
  64. data/lib/rack/static.rb +53 -0
  65. data/lib/rack/urlmap.rb +55 -0
  66. data/lib/rack/utils.rb +698 -0
  67. data/rack.gemspec +39 -0
  68. data/test/cgi/lighttpd.conf +25 -0
  69. data/test/cgi/rackup_stub.rb +6 -0
  70. data/test/cgi/sample_rackup.ru +5 -0
  71. data/test/cgi/test +9 -0
  72. data/test/cgi/test.fcgi +8 -0
  73. data/test/cgi/test.ru +5 -0
  74. data/test/gemloader.rb +6 -0
  75. data/test/multipart/bad_robots +259 -0
  76. data/test/multipart/binary +0 -0
  77. data/test/multipart/empty +10 -0
  78. data/test/multipart/fail_16384_nofile +814 -0
  79. data/test/multipart/file1.txt +1 -0
  80. data/test/multipart/filename_and_modification_param +7 -0
  81. data/test/multipart/filename_with_escaped_quotes +6 -0
  82. data/test/multipart/filename_with_escaped_quotes_and_modification_param +7 -0
  83. data/test/multipart/filename_with_percent_escaped_quotes +6 -0
  84. data/test/multipart/filename_with_unescaped_quotes +6 -0
  85. data/test/multipart/ie +6 -0
  86. data/test/multipart/nested +10 -0
  87. data/test/multipart/none +9 -0
  88. data/test/multipart/semicolon +6 -0
  89. data/test/multipart/text +15 -0
  90. data/test/rackup/config.ru +31 -0
  91. data/test/spec_auth_basic.rb +70 -0
  92. data/test/spec_auth_digest.rb +241 -0
  93. data/test/spec_builder.rb +123 -0
  94. data/test/spec_cascade.rb +45 -0
  95. data/test/spec_cgi.rb +102 -0
  96. data/test/spec_chunked.rb +60 -0
  97. data/test/spec_commonlogger.rb +56 -0
  98. data/test/spec_conditionalget.rb +86 -0
  99. data/test/spec_config.rb +23 -0
  100. data/test/spec_content_length.rb +36 -0
  101. data/test/spec_content_type.rb +29 -0
  102. data/test/spec_deflater.rb +125 -0
  103. data/test/spec_directory.rb +57 -0
  104. data/test/spec_etag.rb +75 -0
  105. data/test/spec_fastcgi.rb +107 -0
  106. data/test/spec_file.rb +92 -0
  107. data/test/spec_handler.rb +49 -0
  108. data/test/spec_head.rb +30 -0
  109. data/test/spec_lint.rb +515 -0
  110. data/test/spec_lobster.rb +43 -0
  111. data/test/spec_lock.rb +142 -0
  112. data/test/spec_logger.rb +28 -0
  113. data/test/spec_methodoverride.rb +58 -0
  114. data/test/spec_mock.rb +241 -0
  115. data/test/spec_mongrel.rb +182 -0
  116. data/test/spec_nulllogger.rb +12 -0
  117. data/test/spec_recursive.rb +69 -0
  118. data/test/spec_request.rb +774 -0
  119. data/test/spec_response.rb +245 -0
  120. data/test/spec_rewindable_input.rb +118 -0
  121. data/test/spec_runtime.rb +39 -0
  122. data/test/spec_sendfile.rb +83 -0
  123. data/test/spec_server.rb +8 -0
  124. data/test/spec_session_abstract_id.rb +43 -0
  125. data/test/spec_session_cookie.rb +171 -0
  126. data/test/spec_session_memcache.rb +289 -0
  127. data/test/spec_session_pool.rb +200 -0
  128. data/test/spec_showexceptions.rb +87 -0
  129. data/test/spec_showstatus.rb +79 -0
  130. data/test/spec_static.rb +48 -0
  131. data/test/spec_thin.rb +86 -0
  132. data/test/spec_urlmap.rb +213 -0
  133. data/test/spec_utils.rb +678 -0
  134. data/test/spec_webrick.rb +141 -0
  135. data/test/testrequest.rb +78 -0
  136. data/test/unregistered_handler/rack/handler/unregistered.rb +7 -0
  137. data/test/unregistered_handler/rack/handler/unregistered_long_one.rb +7 -0
  138. metadata +329 -0
@@ -0,0 +1,141 @@
1
+ require 'rack/mock'
2
+ require File.expand_path('../testrequest', __FILE__)
3
+
4
+ Thread.abort_on_exception = true
5
+
6
+ describe Rack::Handler::WEBrick do
7
+ extend TestRequest::Helpers
8
+
9
+ @server = WEBrick::HTTPServer.new(:Host => @host='0.0.0.0',
10
+ :Port => @port=9202,
11
+ :Logger => WEBrick::Log.new(nil, WEBrick::BasicLog::WARN),
12
+ :AccessLog => [])
13
+ @server.mount "/test", Rack::Handler::WEBrick,
14
+ Rack::Lint.new(TestRequest.new)
15
+ Thread.new { @server.start }
16
+ trap(:INT) { @server.shutdown }
17
+
18
+ should "respond" do
19
+ lambda {
20
+ GET("/test")
21
+ }.should.not.raise
22
+ end
23
+
24
+ should "be a WEBrick" do
25
+ GET("/test")
26
+ status.should.equal 200
27
+ response["SERVER_SOFTWARE"].should =~ /WEBrick/
28
+ response["HTTP_VERSION"].should.equal "HTTP/1.1"
29
+ response["SERVER_PROTOCOL"].should.equal "HTTP/1.1"
30
+ response["SERVER_PORT"].should.equal "9202"
31
+ response["SERVER_NAME"].should.equal "0.0.0.0"
32
+ end
33
+
34
+ should "have rack headers" do
35
+ GET("/test")
36
+ response["rack.version"].should.equal [1,1]
37
+ response["rack.multithread"].should.be.true
38
+ response["rack.multiprocess"].should.be.false
39
+ response["rack.run_once"].should.be.false
40
+ end
41
+
42
+ should "have CGI headers on GET" do
43
+ GET("/test")
44
+ response["REQUEST_METHOD"].should.equal "GET"
45
+ response["SCRIPT_NAME"].should.equal "/test"
46
+ response["REQUEST_PATH"].should.equal "/test"
47
+ response["PATH_INFO"].should.be.equal ""
48
+ response["QUERY_STRING"].should.equal ""
49
+ response["test.postdata"].should.equal ""
50
+
51
+ GET("/test/foo?quux=1")
52
+ response["REQUEST_METHOD"].should.equal "GET"
53
+ response["SCRIPT_NAME"].should.equal "/test"
54
+ response["REQUEST_PATH"].should.equal "/test/foo"
55
+ response["PATH_INFO"].should.equal "/foo"
56
+ response["QUERY_STRING"].should.equal "quux=1"
57
+
58
+ GET("/test/foo%25encoding?quux=1")
59
+ response["REQUEST_METHOD"].should.equal "GET"
60
+ response["SCRIPT_NAME"].should.equal "/test"
61
+ response["REQUEST_PATH"].should.equal "/test/foo%25encoding"
62
+ response["PATH_INFO"].should.equal "/foo%25encoding"
63
+ response["QUERY_STRING"].should.equal "quux=1"
64
+ end
65
+
66
+ should "have CGI headers on POST" do
67
+ POST("/test", {"rack-form-data" => "23"}, {'X-test-header' => '42'})
68
+ status.should.equal 200
69
+ response["REQUEST_METHOD"].should.equal "POST"
70
+ response["SCRIPT_NAME"].should.equal "/test"
71
+ response["REQUEST_PATH"].should.equal "/test"
72
+ response["PATH_INFO"].should.equal ""
73
+ response["QUERY_STRING"].should.equal ""
74
+ response["HTTP_X_TEST_HEADER"].should.equal "42"
75
+ response["test.postdata"].should.equal "rack-form-data=23"
76
+ end
77
+
78
+ should "support HTTP auth" do
79
+ GET("/test", {:user => "ruth", :passwd => "secret"})
80
+ response["HTTP_AUTHORIZATION"].should.equal "Basic cnV0aDpzZWNyZXQ="
81
+ end
82
+
83
+ should "set status" do
84
+ GET("/test?secret")
85
+ status.should.equal 403
86
+ response["rack.url_scheme"].should.equal "http"
87
+ end
88
+
89
+ should "correctly set cookies" do
90
+ @server.mount "/cookie-test", Rack::Handler::WEBrick,
91
+ Rack::Lint.new(lambda { |req|
92
+ res = Rack::Response.new
93
+ res.set_cookie "one", "1"
94
+ res.set_cookie "two", "2"
95
+ res.finish
96
+ })
97
+
98
+ Net::HTTP.start(@host, @port) { |http|
99
+ res = http.get("/cookie-test")
100
+ res.code.to_i.should.equal 200
101
+ res.get_fields("set-cookie").should.equal ["one=1", "two=2"]
102
+ }
103
+ end
104
+
105
+ should "provide a .run" do
106
+ block_ran = false
107
+ catch(:done) {
108
+ Rack::Handler::WEBrick.run(lambda {},
109
+ {:Port => 9210,
110
+ :Logger => WEBrick::Log.new(nil, WEBrick::BasicLog::WARN),
111
+ :AccessLog => []}) { |server|
112
+ block_ran = true
113
+ server.should.be.kind_of WEBrick::HTTPServer
114
+ @s = server
115
+ throw :done
116
+ }
117
+ }
118
+ block_ran.should.be.true
119
+ @s.shutdown
120
+ end
121
+
122
+ should "return repeated headers" do
123
+ @server.mount "/headers", Rack::Handler::WEBrick,
124
+ Rack::Lint.new(lambda { |req|
125
+ [
126
+ 401,
127
+ { "Content-Type" => "text/plain",
128
+ "WWW-Authenticate" => "Bar realm=X\nBaz realm=Y" },
129
+ [""]
130
+ ]
131
+ })
132
+
133
+ Net::HTTP.start(@host, @port) { |http|
134
+ res = http.get("/headers")
135
+ res.code.to_i.should.equal 401
136
+ res["www-authenticate"].should.equal "Bar realm=X, Baz realm=Y"
137
+ }
138
+ end
139
+
140
+ @server.shutdown
141
+ end
@@ -0,0 +1,78 @@
1
+ require 'yaml'
2
+ require 'net/http'
3
+ require 'rack/lint'
4
+
5
+ class TestRequest
6
+ NOSERIALIZE = [Method, Proc, Rack::Lint::InputWrapper]
7
+
8
+ def call(env)
9
+ status = env["QUERY_STRING"] =~ /secret/ ? 403 : 200
10
+ env["test.postdata"] = env["rack.input"].read
11
+ minienv = env.dup
12
+ # This may in the future want to replace with a dummy value instead.
13
+ minienv.delete_if { |k,v| NOSERIALIZE.any? { |c| v.kind_of?(c) } }
14
+ body = minienv.to_yaml
15
+ size = body.respond_to?(:bytesize) ? body.bytesize : body.size
16
+ [status, {"Content-Type" => "text/yaml", "Content-Length" => size.to_s}, [body]]
17
+ end
18
+
19
+ module Helpers
20
+ attr_reader :status, :response
21
+
22
+ ROOT = File.expand_path(File.dirname(__FILE__) + "/..")
23
+ ENV["RUBYOPT"] = "-I#{ROOT}/lib -rubygems"
24
+
25
+ def root
26
+ ROOT
27
+ end
28
+
29
+ def rackup
30
+ "#{ROOT}/bin/rackup"
31
+ end
32
+
33
+ def GET(path, header={})
34
+ Net::HTTP.start(@host, @port) { |http|
35
+ user = header.delete(:user)
36
+ passwd = header.delete(:passwd)
37
+
38
+ get = Net::HTTP::Get.new(path, header)
39
+ get.basic_auth user, passwd if user && passwd
40
+ http.request(get) { |response|
41
+ @status = response.code.to_i
42
+ begin
43
+ @response = YAML.load(response.body)
44
+ rescue TypeError, ArgumentError
45
+ @response = nil
46
+ end
47
+ }
48
+ }
49
+ end
50
+
51
+ def POST(path, formdata={}, header={})
52
+ Net::HTTP.start(@host, @port) { |http|
53
+ user = header.delete(:user)
54
+ passwd = header.delete(:passwd)
55
+
56
+ post = Net::HTTP::Post.new(path, header)
57
+ post.form_data = formdata
58
+ post.basic_auth user, passwd if user && passwd
59
+ http.request(post) { |response|
60
+ @status = response.code.to_i
61
+ @response = YAML.load(response.body)
62
+ }
63
+ }
64
+ end
65
+ end
66
+ end
67
+
68
+ class StreamingRequest
69
+ def self.call(env)
70
+ [200, {"Content-Type" => "text/plain"}, new]
71
+ end
72
+
73
+ def each
74
+ yield "hello there!\n"
75
+ sleep 5
76
+ yield "that is all.\n"
77
+ end
78
+ end
@@ -0,0 +1,7 @@
1
+ module Rack
2
+ module Handler
3
+ # this class doesn't do anything, we're just seeing if we get it.
4
+ class Unregistered
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Rack
2
+ module Handler
3
+ # this class doesn't do anything, we're just seeing if we get it.
4
+ class UnregisteredLongOne
5
+ end
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,329 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: edgar-rack
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 1
7
+ - 2
8
+ - 1
9
+ version: 1.2.1
10
+ platform: ruby
11
+ authors:
12
+ - Christian Neukirchen
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2011-01-31 00:00:00 -04:30
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: bacon
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 0
30
+ version: "0"
31
+ type: :development
32
+ version_requirements: *id001
33
+ - !ruby/object:Gem::Dependency
34
+ name: rake
35
+ prerelease: false
36
+ requirement: &id002 !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ segments:
42
+ - 0
43
+ version: "0"
44
+ type: :development
45
+ version_requirements: *id002
46
+ - !ruby/object:Gem::Dependency
47
+ name: fcgi
48
+ prerelease: false
49
+ requirement: &id003 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ segments:
55
+ - 0
56
+ version: "0"
57
+ type: :development
58
+ version_requirements: *id003
59
+ - !ruby/object:Gem::Dependency
60
+ name: memcache-client
61
+ prerelease: false
62
+ requirement: &id004 !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ segments:
68
+ - 0
69
+ version: "0"
70
+ type: :development
71
+ version_requirements: *id004
72
+ - !ruby/object:Gem::Dependency
73
+ name: mongrel
74
+ prerelease: false
75
+ requirement: &id005 !ruby/object:Gem::Requirement
76
+ none: false
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ segments:
81
+ - 0
82
+ version: "0"
83
+ type: :development
84
+ version_requirements: *id005
85
+ - !ruby/object:Gem::Dependency
86
+ name: thin
87
+ prerelease: false
88
+ requirement: &id006 !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ segments:
94
+ - 0
95
+ version: "0"
96
+ type: :development
97
+ version_requirements: *id006
98
+ description: |
99
+ Rack provides minimal, modular and adaptable interface for developing
100
+ web applications in Ruby. By wrapping HTTP requests and responses in
101
+ the simplest way possible, it unifies and distills the API for web
102
+ servers, web frameworks, and software in between (the so-called
103
+ middleware) into a single method call.
104
+
105
+ Also see http://rack.rubyforge.org.
106
+
107
+ email: chneukirchen@gmail.com
108
+ executables:
109
+ - rackup
110
+ extensions: []
111
+
112
+ extra_rdoc_files:
113
+ - README
114
+ - KNOWN-ISSUES
115
+ files:
116
+ - bin/rackup
117
+ - contrib/rack_logo.svg
118
+ - example/protectedlobster.ru
119
+ - example/lobster.ru
120
+ - example/protectedlobster.rb
121
+ - lib/rack.rb
122
+ - lib/rack/logger.rb
123
+ - lib/rack/conditionalget.rb
124
+ - lib/rack/showexceptions.rb
125
+ - lib/rack/head.rb
126
+ - lib/rack/reloader.rb
127
+ - lib/rack/lint.rb
128
+ - lib/rack/server.rb
129
+ - lib/rack/cascade.rb
130
+ - lib/rack/lobster.rb
131
+ - lib/rack/commonlogger.rb
132
+ - lib/rack/urlmap.rb
133
+ - lib/rack/showstatus.rb
134
+ - lib/rack/directory.rb
135
+ - lib/rack/session/memcache.rb
136
+ - lib/rack/session/abstract/id.rb
137
+ - lib/rack/session/cookie.rb
138
+ - lib/rack/session/pool.rb
139
+ - lib/rack/recursive.rb
140
+ - lib/rack/file.rb
141
+ - lib/rack/etag.rb
142
+ - lib/rack/content_type.rb
143
+ - lib/rack/nulllogger.rb
144
+ - lib/rack/content_length.rb
145
+ - lib/rack/mime.rb
146
+ - lib/rack/lock.rb
147
+ - lib/rack/handler/lsws.rb
148
+ - lib/rack/handler/thin.rb
149
+ - lib/rack/handler/evented_mongrel.rb
150
+ - lib/rack/handler/swiftiplied_mongrel.rb
151
+ - lib/rack/handler/scgi.rb
152
+ - lib/rack/handler/cgi.rb
153
+ - lib/rack/handler/webrick.rb
154
+ - lib/rack/handler/fastcgi.rb
155
+ - lib/rack/handler/mongrel.rb
156
+ - lib/rack/deflater.rb
157
+ - lib/rack/sendfile.rb
158
+ - lib/rack/handler.rb
159
+ - lib/rack/rewindable_input.rb
160
+ - lib/rack/builder.rb
161
+ - lib/rack/utils.rb
162
+ - lib/rack/request.rb
163
+ - lib/rack/runtime.rb
164
+ - lib/rack/auth/basic.rb
165
+ - lib/rack/auth/abstract/handler.rb
166
+ - lib/rack/auth/abstract/request.rb
167
+ - lib/rack/auth/digest/params.rb
168
+ - lib/rack/auth/digest/md5.rb
169
+ - lib/rack/auth/digest/request.rb
170
+ - lib/rack/auth/digest/nonce.rb
171
+ - lib/rack/mock.rb
172
+ - lib/rack/static.rb
173
+ - lib/rack/methodoverride.rb
174
+ - lib/rack/response.rb
175
+ - lib/rack/chunked.rb
176
+ - lib/rack/config.rb
177
+ - test/spec_runtime.rb
178
+ - test/spec_directory.rb
179
+ - test/spec_content_length.rb
180
+ - test/spec_conditionalget.rb
181
+ - test/spec_handler.rb
182
+ - test/spec_showexceptions.rb
183
+ - test/spec_webrick.rb
184
+ - test/cgi/lighttpd.conf
185
+ - test/cgi/rackup_stub.rb
186
+ - test/cgi/test.ru
187
+ - test/cgi/test
188
+ - test/cgi/test.fcgi
189
+ - test/cgi/sample_rackup.ru
190
+ - test/spec_deflater.rb
191
+ - test/spec_session_memcache.rb
192
+ - test/spec_recursive.rb
193
+ - test/spec_thin.rb
194
+ - test/spec_auth_digest.rb
195
+ - test/spec_urlmap.rb
196
+ - test/spec_response.rb
197
+ - test/spec_content_type.rb
198
+ - test/spec_cascade.rb
199
+ - test/spec_mongrel.rb
200
+ - test/spec_methodoverride.rb
201
+ - test/testrequest.rb
202
+ - test/spec_head.rb
203
+ - test/rackup/config.ru
204
+ - test/multipart/bad_robots
205
+ - test/multipart/filename_with_escaped_quotes_and_modification_param
206
+ - test/multipart/fail_16384_nofile
207
+ - test/multipart/binary
208
+ - test/multipart/ie
209
+ - test/multipart/empty
210
+ - test/multipart/filename_with_escaped_quotes
211
+ - test/multipart/filename_with_unescaped_quotes
212
+ - test/multipart/text
213
+ - test/multipart/file1.txt
214
+ - test/multipart/semicolon
215
+ - test/multipart/filename_with_percent_escaped_quotes
216
+ - test/multipart/filename_and_modification_param
217
+ - test/multipart/none
218
+ - test/multipart/nested
219
+ - test/spec_session_abstract_id.rb
220
+ - test/spec_utils.rb
221
+ - test/spec_lobster.rb
222
+ - test/spec_server.rb
223
+ - test/spec_commonlogger.rb
224
+ - test/spec_session_pool.rb
225
+ - test/spec_lock.rb
226
+ - test/spec_mock.rb
227
+ - test/spec_file.rb
228
+ - test/spec_config.rb
229
+ - test/spec_lint.rb
230
+ - test/unregistered_handler/rack/handler/unregistered.rb
231
+ - test/unregistered_handler/rack/handler/unregistered_long_one.rb
232
+ - test/spec_session_cookie.rb
233
+ - test/spec_auth_basic.rb
234
+ - test/spec_request.rb
235
+ - test/spec_sendfile.rb
236
+ - test/spec_showstatus.rb
237
+ - test/spec_etag.rb
238
+ - test/spec_cgi.rb
239
+ - test/spec_fastcgi.rb
240
+ - test/spec_chunked.rb
241
+ - test/gemloader.rb
242
+ - test/spec_nulllogger.rb
243
+ - test/spec_builder.rb
244
+ - test/spec_static.rb
245
+ - test/spec_rewindable_input.rb
246
+ - test/spec_logger.rb
247
+ - COPYING
248
+ - KNOWN-ISSUES
249
+ - rack.gemspec
250
+ - Rakefile
251
+ - README
252
+ - SPEC
253
+ has_rdoc: true
254
+ homepage: http://rack.rubyforge.org
255
+ licenses: []
256
+
257
+ post_install_message:
258
+ rdoc_options: []
259
+
260
+ require_paths:
261
+ - lib
262
+ required_ruby_version: !ruby/object:Gem::Requirement
263
+ none: false
264
+ requirements:
265
+ - - ">="
266
+ - !ruby/object:Gem::Version
267
+ segments:
268
+ - 0
269
+ version: "0"
270
+ required_rubygems_version: !ruby/object:Gem::Requirement
271
+ none: false
272
+ requirements:
273
+ - - ">="
274
+ - !ruby/object:Gem::Version
275
+ segments:
276
+ - 0
277
+ version: "0"
278
+ requirements: []
279
+
280
+ rubyforge_project: rack
281
+ rubygems_version: 1.3.7
282
+ signing_key:
283
+ specification_version: 3
284
+ summary: a modular Ruby webserver interface
285
+ test_files:
286
+ - test/spec_runtime.rb
287
+ - test/spec_directory.rb
288
+ - test/spec_content_length.rb
289
+ - test/spec_conditionalget.rb
290
+ - test/spec_handler.rb
291
+ - test/spec_showexceptions.rb
292
+ - test/spec_webrick.rb
293
+ - test/spec_deflater.rb
294
+ - test/spec_session_memcache.rb
295
+ - test/spec_recursive.rb
296
+ - test/spec_thin.rb
297
+ - test/spec_auth_digest.rb
298
+ - test/spec_urlmap.rb
299
+ - test/spec_response.rb
300
+ - test/spec_content_type.rb
301
+ - test/spec_cascade.rb
302
+ - test/spec_mongrel.rb
303
+ - test/spec_methodoverride.rb
304
+ - test/spec_head.rb
305
+ - test/spec_session_abstract_id.rb
306
+ - test/spec_utils.rb
307
+ - test/spec_lobster.rb
308
+ - test/spec_server.rb
309
+ - test/spec_commonlogger.rb
310
+ - test/spec_session_pool.rb
311
+ - test/spec_lock.rb
312
+ - test/spec_mock.rb
313
+ - test/spec_file.rb
314
+ - test/spec_config.rb
315
+ - test/spec_lint.rb
316
+ - test/spec_session_cookie.rb
317
+ - test/spec_auth_basic.rb
318
+ - test/spec_request.rb
319
+ - test/spec_sendfile.rb
320
+ - test/spec_showstatus.rb
321
+ - test/spec_etag.rb
322
+ - test/spec_cgi.rb
323
+ - test/spec_fastcgi.rb
324
+ - test/spec_chunked.rb
325
+ - test/spec_nulllogger.rb
326
+ - test/spec_builder.rb
327
+ - test/spec_static.rb
328
+ - test/spec_rewindable_input.rb
329
+ - test/spec_logger.rb