rack 1.1.0 → 1.2.0

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 (101) hide show
  1. data/README +23 -26
  2. data/SPEC +3 -3
  3. data/lib/rack/auth/digest/params.rb +1 -1
  4. data/lib/rack/content_length.rb +1 -1
  5. data/lib/rack/etag.rb +15 -6
  6. data/lib/rack/file.rb +3 -1
  7. data/lib/rack/handler/cgi.rb +8 -7
  8. data/lib/rack/handler/fastcgi.rb +1 -1
  9. data/lib/rack/handler/lsws.rb +1 -1
  10. data/lib/rack/handler/mongrel.rb +1 -1
  11. data/lib/rack/handler/scgi.rb +1 -4
  12. data/lib/rack/handler/webrick.rb +10 -6
  13. data/lib/rack/lint.rb +29 -37
  14. data/lib/rack/mime.rb +2 -0
  15. data/lib/rack/mock.rb +2 -1
  16. data/lib/rack/recursive.rb +4 -0
  17. data/lib/rack/request.rb +8 -6
  18. data/lib/rack/response.rb +1 -0
  19. data/lib/rack/rewindable_input.rb +13 -10
  20. data/lib/rack/sendfile.rb +8 -6
  21. data/lib/rack/server.rb +66 -7
  22. data/lib/rack/session/memcache.rb +1 -1
  23. data/lib/rack/urlmap.rb +6 -7
  24. data/lib/rack/utils.rb +64 -22
  25. data/lib/rack.rb +1 -12
  26. data/rack.gemspec +6 -6
  27. data/spec/cgi/lighttpd.conf +25 -0
  28. data/spec/cgi/rackup_stub.rb +6 -0
  29. data/spec/cgi/sample_rackup.ru +5 -0
  30. data/spec/cgi/test +9 -0
  31. data/spec/cgi/test.fcgi +8 -0
  32. data/spec/cgi/test.ru +5 -0
  33. data/spec/multipart/bad_robots +259 -0
  34. data/spec/multipart/binary +0 -0
  35. data/spec/multipart/empty +10 -0
  36. data/spec/multipart/fail_16384_nofile +814 -0
  37. data/spec/multipart/file1.txt +1 -0
  38. data/spec/multipart/filename_and_modification_param +7 -0
  39. data/spec/multipart/filename_with_escaped_quotes +6 -0
  40. data/spec/multipart/filename_with_escaped_quotes_and_modification_param +7 -0
  41. data/spec/multipart/filename_with_percent_escaped_quotes +6 -0
  42. data/spec/multipart/filename_with_unescaped_quotes +6 -0
  43. data/spec/multipart/ie +6 -0
  44. data/spec/multipart/nested +10 -0
  45. data/spec/multipart/none +9 -0
  46. data/spec/multipart/semicolon +6 -0
  47. data/spec/multipart/text +10 -0
  48. data/spec/rackup/config.ru +31 -0
  49. data/{test/spec_rack_auth_basic.rb → spec/spec_auth_basic.rb} +11 -14
  50. data/{test/spec_rack_auth_digest.rb → spec/spec_auth_digest.rb} +18 -21
  51. data/{test/spec_rack_builder.rb → spec/spec_builder.rb} +49 -10
  52. data/{test/spec_rack_cascade.rb → spec/spec_cascade.rb} +7 -10
  53. data/{test/spec_rack_cgi.rb → spec/spec_cgi.rb} +34 -32
  54. data/{test/spec_rack_chunked.rb → spec/spec_chunked.rb} +8 -10
  55. data/{test/spec_rack_commonlogger.rb → spec/spec_commonlogger.rb} +10 -15
  56. data/{test/spec_rack_conditionalget.rb → spec/spec_conditionalget.rb} +5 -7
  57. data/{test/spec_rack_config.rb → spec/spec_config.rb} +6 -7
  58. data/{test/spec_rack_content_length.rb → spec/spec_content_length.rb} +7 -8
  59. data/{test/spec_rack_content_type.rb → spec/spec_content_type.rb} +5 -6
  60. data/{test/spec_rack_deflater.rb → spec/spec_deflater.rb} +11 -13
  61. data/{test/spec_rack_directory.rb → spec/spec_directory.rb} +6 -10
  62. data/{test/spec_rack_etag.rb → spec/spec_etag.rb} +3 -5
  63. data/{test/spec_rack_fastcgi.rb → spec/spec_fastcgi.rb} +36 -29
  64. data/{test/spec_rack_file.rb → spec/spec_file.rb} +9 -13
  65. data/{test/spec_rack_handler.rb → spec/spec_handler.rb} +10 -12
  66. data/{test/spec_rack_head.rb → spec/spec_head.rb} +3 -3
  67. data/{test/spec_rack_lint.rb → spec/spec_lint.rb} +19 -32
  68. data/{test/spec_rack_lobster.rb → spec/spec_lobster.rb} +9 -11
  69. data/{test/spec_rack_lock.rb → spec/spec_lock.rb} +15 -17
  70. data/{test/spec_rack_logger.rb → spec/spec_logger.rb} +6 -7
  71. data/{test/spec_rack_methodoverride.rb → spec/spec_methodoverride.rb} +15 -17
  72. data/{test/spec_rack_mock.rb → spec/spec_mock.rb} +30 -32
  73. data/{test/spec_rack_mongrel.rb → spec/spec_mongrel.rb} +40 -46
  74. data/{test/spec_rack_nulllogger.rb → spec/spec_nulllogger.rb} +4 -5
  75. data/{test/spec_rack_recursive.rb → spec/spec_recursive.rb} +28 -36
  76. data/{test/spec_rack_request.rb → spec/spec_request.rb} +84 -49
  77. data/{test/spec_rack_response.rb → spec/spec_response.rb} +48 -29
  78. data/spec/spec_rewindable_input.rb +118 -0
  79. data/{test/spec_rack_runtime.rb → spec/spec_runtime.rb} +15 -11
  80. data/{test/spec_rack_sendfile.rb → spec/spec_sendfile.rb} +11 -14
  81. data/{test/spec_rack_session_cookie.rb → spec/spec_session_cookie.rb} +15 -18
  82. data/{test/spec_rack_session_memcache.rb → spec/spec_session_memcache.rb} +32 -26
  83. data/{test/spec_rack_session_pool.rb → spec/spec_session_pool.rb} +36 -31
  84. data/spec/spec_showexceptions.rb +23 -0
  85. data/spec/spec_showstatus.rb +79 -0
  86. data/{test/spec_rack_static.rb → spec/spec_static.rb} +5 -9
  87. data/{test/spec_rack_thin.rb → spec/spec_thin.rb} +30 -35
  88. data/{test/spec_rack_urlmap.rb → spec/spec_urlmap.rb} +6 -8
  89. data/{test/spec_rack_utils.rb → spec/spec_utils.rb} +136 -71
  90. data/{test/spec_rack_webrick.rb → spec/spec_webrick.rb} +28 -36
  91. data/spec/testrequest.rb +77 -0
  92. data/spec/unregistered_handler/rack/handler/unregistered.rb +7 -0
  93. data/spec/unregistered_handler/rack/handler/unregistered_long_one.rb +7 -0
  94. metadata +206 -124
  95. data/RDOX +0 -0
  96. data/lib/rack/adapter/camping.rb +0 -22
  97. data/test/spec_rack_camping.rb +0 -51
  98. data/test/spec_rack_rewindable_input.rb +0 -118
  99. data/test/spec_rack_showexceptions.rb +0 -21
  100. data/test/spec_rack_showstatus.rb +0 -72
  101. data/test/spec_rackup.rb +0 -154
data/lib/rack/server.rb CHANGED
@@ -79,12 +79,61 @@ module Rack
79
79
  end
80
80
  end
81
81
 
82
- def self.start
83
- new.start
82
+ # Start a new rack server (like running rackup). This will parse ARGV and
83
+ # provide standard ARGV rackup options, defaulting to load 'config.ru'.
84
+ #
85
+ # Providing an options hash will prevent ARGV parsing and will not include
86
+ # any default options.
87
+ #
88
+ # This method can be used to very easily launch a CGI application, for
89
+ # example:
90
+ #
91
+ # Rack::Server.start(
92
+ # :app => lambda do |e|
93
+ # [200, {'Content-Type' => 'text/html'}, ['hello world']]
94
+ # end,
95
+ # :server => 'cgi'
96
+ # )
97
+ #
98
+ # Further options available here are documented on Rack::Server#initialize
99
+ def self.start(options = nil)
100
+ new(options).start
84
101
  end
85
102
 
86
- attr_accessor :options
87
-
103
+ attr_writer :options
104
+
105
+ # Options may include:
106
+ # * :app
107
+ # a rack application to run (overrides :config)
108
+ # * :config
109
+ # a rackup configuration file path to load (.ru)
110
+ # * :environment
111
+ # this selects the middleware that will be wrapped around
112
+ # your application. Default options available are:
113
+ # - development: CommonLogger, ShowExceptions, and Lint
114
+ # - deployment: CommonLogger
115
+ # - none: no extra middleware
116
+ # note: when the server is a cgi server, CommonLogger is not included.
117
+ # * :server
118
+ # choose a specific Rack::Handler, e.g. cgi, fcgi, webrick
119
+ # * :daemonize
120
+ # if true, the server will daemonize itself (fork, detach, etc)
121
+ # * :pid
122
+ # path to write a pid file after daemonize
123
+ # * :Host
124
+ # the host address to bind to (used by supporting Rack::Handler)
125
+ # * :Port
126
+ # the port to bind to (used by supporting Rack::Handler)
127
+ # * :AccessLog
128
+ # webrick acess log options (or supporting Rack::Handler)
129
+ # * :debug
130
+ # turn on debug output ($DEBUG = true)
131
+ # * :warn
132
+ # turn on warnings ($-w = true)
133
+ # * :include
134
+ # add given paths to $LOAD_PATH
135
+ # * :require
136
+ # require the given libraries
88
137
  def initialize(options = nil)
89
138
  @options = options
90
139
  end
@@ -119,7 +168,7 @@ module Rack
119
168
  def self.middleware
120
169
  @middleware ||= begin
121
170
  m = Hash.new {|h,k| h[k] = []}
122
- m["deployment"].concat [lambda {|server| server.server =~ /CGI/ ? nil : [Rack::CommonLogger, $stderr] }]
171
+ m["deployment"].concat [lambda {|server| server.server.name =~ /CGI/ ? nil : [Rack::CommonLogger, $stderr] }]
123
172
  m["development"].concat m["deployment"] + [[Rack::ShowExceptions], [Rack::Lint]]
124
173
  m
125
174
  end
@@ -143,7 +192,7 @@ module Rack
143
192
  end
144
193
 
145
194
  if includes = options[:include]
146
- $LOAD_PATH.unshift *includes
195
+ $LOAD_PATH.unshift(*includes)
147
196
  end
148
197
 
149
198
  if library = options[:require]
@@ -152,11 +201,20 @@ module Rack
152
201
 
153
202
  daemonize_app if options[:daemonize]
154
203
  write_pid if options[:pid]
204
+
205
+ trap(:INT) do
206
+ if server.respond_to?(:shutdown)
207
+ server.shutdown
208
+ else
209
+ exit
210
+ end
211
+ end
212
+
155
213
  server.run wrapped_app, options
156
214
  end
157
215
 
158
216
  def server
159
- @_server ||= Rack::Handler.get(options[:server]) || Rack::Handler.default
217
+ @_server ||= Rack::Handler.get(options[:server]) || Rack::Handler.default(options)
160
218
  end
161
219
 
162
220
  private
@@ -168,6 +226,7 @@ module Rack
168
226
  args.clear if ENV.include?("REQUEST_METHOD")
169
227
 
170
228
  options.merge! opt_parser.parse! args
229
+ ENV["RACK_ENV"] = options[:environment]
171
230
  options
172
231
  end
173
232
 
@@ -31,7 +31,7 @@ module Rack
31
31
  @mutex = Mutex.new
32
32
  mserv = @default_options[:memcache_server]
33
33
  mopts = @default_options.
34
- reject{|k,v| MemCache::DEFAULT_OPTIONS.include? k }
34
+ reject{|k,v| !MemCache::DEFAULT_OPTIONS.include? k }
35
35
  @pool = MemCache.new mserv, mopts
36
36
  unless @pool.active? and @pool.servers.any?{|c| c.alive? }
37
37
  raise 'No memcache servers'
data/lib/rack/urlmap.rb CHANGED
@@ -35,21 +35,20 @@ module Rack
35
35
  end
36
36
 
37
37
  def call(env)
38
- path = env["PATH_INFO"].to_s
38
+ path = env["PATH_INFO"]
39
39
  script_name = env['SCRIPT_NAME']
40
40
  hHost, sName, sPort = env.values_at('HTTP_HOST','SERVER_NAME','SERVER_PORT')
41
41
  @mapping.each { |host, location, match, app|
42
42
  next unless (hHost == host || sName == host \
43
43
  || (host.nil? && (hHost == sName || hHost == sName+':'+sPort)))
44
- next unless path =~ match && rest = $1
44
+ next unless path.to_s =~ match && rest = $1
45
45
  next unless rest.empty? || rest[0] == ?/
46
-
47
- return app.call(
48
- env.merge(
49
- 'SCRIPT_NAME' => (script_name + location),
50
- 'PATH_INFO' => rest))
46
+ env.merge!('SCRIPT_NAME' => (script_name + location), 'PATH_INFO' => rest)
47
+ return app.call(env)
51
48
  }
52
49
  [404, {"Content-Type" => "text/plain", "X-Cascade" => "pass"}, ["Not Found: #{path}"]]
50
+ ensure
51
+ env.merge! 'PATH_INFO' => path, 'SCRIPT_NAME' => script_name
53
52
  end
54
53
  end
55
54
  end
data/lib/rack/utils.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # -*- encoding: binary -*-
2
2
 
3
+ require 'fileutils'
3
4
  require 'set'
4
5
  require 'tempfile'
5
6
 
@@ -38,9 +39,6 @@ module Rack
38
39
 
39
40
  (qs || '').split(d ? /[#{d}] */n : DEFAULT_SEP).each do |p|
40
41
  k, v = p.split('=', 2).map { |x| unescape(x) }
41
- if v =~ /^("|')(.*)\1$/
42
- v = $2.gsub('\\'+$1, $1)
43
- end
44
42
  if cur = params[k]
45
43
  if cur.class == Array
46
44
  params[k] << v
@@ -69,9 +67,6 @@ module Rack
69
67
  module_function :parse_nested_query
70
68
 
71
69
  def normalize_params(params, name, v = nil)
72
- if v and v =~ /^("|')(.*)\1$/
73
- v = $2.gsub('\\'+$1, $1)
74
- end
75
70
  name =~ %r(\A[\[\]]*([^\[\]]+)\]*)
76
71
  k = $1 || ''
77
72
  after = $' || ''
@@ -180,8 +175,8 @@ module Rack
180
175
  path = "; path=" + value[:path] if value[:path]
181
176
  # According to RFC 2109, we need dashes here.
182
177
  # N.B.: cgi.rb uses spaces...
183
- expires = "; expires=" + value[:expires].clone.gmtime.
184
- strftime("%a, %d-%b-%Y %H:%M:%S GMT") if value[:expires]
178
+ expires = "; expires=" +
179
+ rfc2822(value[:expires].clone.gmtime) if value[:expires]
185
180
  secure = "; secure" if value[:secure]
186
181
  httponly = "; HttpOnly" if value[:httponly]
187
182
  value = value[:value]
@@ -192,12 +187,12 @@ module Rack
192
187
  "#{domain}#{path}#{expires}#{secure}#{httponly}"
193
188
 
194
189
  case header["Set-Cookie"]
195
- when Array
196
- header["Set-Cookie"] << cookie
197
- when String
198
- header["Set-Cookie"] = [header["Set-Cookie"], cookie]
199
- when nil
190
+ when nil, ''
200
191
  header["Set-Cookie"] = cookie
192
+ when String
193
+ header["Set-Cookie"] = [header["Set-Cookie"], cookie].join("\n")
194
+ when Array
195
+ header["Set-Cookie"] = (header["Set-Cookie"] + [cookie]).join("\n")
201
196
  end
202
197
 
203
198
  nil
@@ -205,14 +200,25 @@ module Rack
205
200
  module_function :set_cookie_header!
206
201
 
207
202
  def delete_cookie_header!(header, key, value = {})
208
- unless Array === header["Set-Cookie"]
209
- header["Set-Cookie"] = [header["Set-Cookie"]].compact
203
+ case header["Set-Cookie"]
204
+ when nil, ''
205
+ cookies = []
206
+ when String
207
+ cookies = header["Set-Cookie"].split("\n")
208
+ when Array
209
+ cookies = header["Set-Cookie"]
210
210
  end
211
211
 
212
- header["Set-Cookie"].reject! { |cookie|
213
- cookie =~ /\A#{escape(key)}=/
212
+ cookies.reject! { |cookie|
213
+ if value[:domain]
214
+ cookie =~ /\A#{escape(key)}=.*domain=#{value[:domain]}/
215
+ else
216
+ cookie =~ /\A#{escape(key)}=/
217
+ end
214
218
  }
215
219
 
220
+ header["Set-Cookie"] = cookies.join("\n")
221
+
216
222
  set_cookie_header!(header, key,
217
223
  {:value => '', :path => nil, :domain => nil,
218
224
  :expires => Time.at(0) }.merge(value))
@@ -234,6 +240,22 @@ module Rack
234
240
  end
235
241
  module_function :bytesize
236
242
 
243
+ # Modified version of stdlib time.rb Time#rfc2822 to use '%d-%b-%Y' instead
244
+ # of '% %b %Y'.
245
+ # It assumes that the time is in GMT to comply to the RFC 2109.
246
+ #
247
+ # NOTE: I'm not sure the RFC says it requires GMT, but is ambigous enough
248
+ # that I'm certain someone implemented only that option.
249
+ # Do not use %a and %b from Time.strptime, it would use localized names for
250
+ # weekday and month.
251
+ #
252
+ def rfc2822(time)
253
+ wday = Time::RFC2822_DAY_NAME[time.wday]
254
+ mon = Time::RFC2822_MONTH_NAME[time.mon - 1]
255
+ time.strftime("#{wday}, %d-#{mon}-%Y %T GMT")
256
+ end
257
+ module_function :rfc2822
258
+
237
259
  # Context allows the use of a compatible middleware at different points
238
260
  # in a request handling stack. A compatible middleware must define
239
261
  # #context which should take the arguments env and app. The first of which
@@ -291,7 +313,8 @@ module Rack
291
313
  end
292
314
 
293
315
  def [](k)
294
- super(@names[k] ||= @names[k.downcase])
316
+ super(@names[k]) if @names[k]
317
+ super(@names[k.downcase])
295
318
  end
296
319
 
297
320
  def []=(k, v)
@@ -478,11 +501,31 @@ module Rack
478
501
  head = buf.slice!(0, i+2) # First \r\n
479
502
  buf.slice!(0, 2) # Second \r\n
480
503
 
481
- filename = head[/Content-Disposition:.* filename=(?:"((?:\\.|[^\"])*)"|([^;\s]*))/ni, 1]
504
+ token = /[^\s()<>,;:\\"\/\[\]?=]+/
505
+ condisp = /Content-Disposition:\s*#{token}\s*/i
506
+ dispparm = /;\s*(#{token})=("(?:\\"|[^"])*"|#{token})*/
507
+
508
+ rfc2183 = /^#{condisp}(#{dispparm})+$/i
509
+ broken_quoted = /^#{condisp}.*;\sfilename="(.*?)"(?:\s*$|\s*;\s*#{token}=)/i
510
+ broken_unquoted = /^#{condisp}.*;\sfilename=(#{token})/i
511
+
512
+ if head =~ rfc2183
513
+ filename = Hash[head.scan(dispparm)]['filename']
514
+ filename = $1 if filename and filename =~ /^"(.*)"$/
515
+ elsif head =~ broken_quoted
516
+ filename = $1
517
+ elsif head =~ broken_unquoted
518
+ filename = $1
519
+ end
520
+
521
+ if filename && filename !~ /\\[^\\"]/
522
+ filename = Utils.unescape(filename).gsub(/\\(.)/, '\1')
523
+ end
524
+
482
525
  content_type = head[/Content-Type: (.*)#{EOL}/ni, 1]
483
526
  name = head[/Content-Disposition:.*\s+name="?([^\";]*)"?/ni, 1] || head[/Content-ID:\s*([^#{EOL}]*)/ni, 1]
484
527
 
485
- if content_type || filename
528
+ if filename
486
529
  body = Tempfile.new("RackMultipart")
487
530
  body.binmode if body.respond_to?(:binmode)
488
531
  end
@@ -519,8 +562,7 @@ module Rack
519
562
  # This handles the full Windows paths given by Internet Explorer
520
563
  # (and perhaps other broken user agents) without affecting
521
564
  # those which give the lone filename.
522
- filename =~ /^(?:.*[:\\\/])?(.*)/m
523
- filename = $1
565
+ filename = filename.split(/[\/\\]/).last
524
566
 
525
567
  data = {:filename => filename, :type => content_type,
526
568
  :name => name, :tempfile => body, :head => head}
data/lib/rack.rb CHANGED
@@ -20,7 +20,7 @@ module Rack
20
20
 
21
21
  # Return the Rack release as a dotted string.
22
22
  def self.release
23
- "1.1"
23
+ "1.2"
24
24
  end
25
25
 
26
26
  autoload :Builder, "rack/builder"
@@ -78,15 +78,4 @@ module Rack
78
78
  autoload :Pool, "rack/session/pool"
79
79
  autoload :Memcache, "rack/session/memcache"
80
80
  end
81
-
82
- # *Adapters* connect Rack with third party web frameworks.
83
- #
84
- # Rack includes an adapter for Camping, see README for other
85
- # frameworks supporting Rack in their code bases.
86
- #
87
- # Refer to the submodules for framework-specific calling details.
88
-
89
- module Adapter
90
- autoload :Camping, "rack/adapter/camping"
91
- end
92
81
  end
data/rack.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "rack"
3
- s.version = "1.1.0"
3
+ s.version = "1.2.0"
4
4
  s.platform = Gem::Platform::RUBY
5
5
  s.summary = "a modular Ruby webserver interface"
6
6
 
@@ -14,23 +14,23 @@ middleware) into a single method call.
14
14
  Also see http://rack.rubyforge.org.
15
15
  EOF
16
16
 
17
- s.files = Dir['{bin/*,contrib/*,example/*,lib/**/*}'] +
18
- %w(COPYING KNOWN-ISSUES rack.gemspec RDOX README SPEC)
17
+ s.files = Dir['{bin/*,contrib/*,example/*,lib/**/*,spec/**/*}'] +
18
+ %w(COPYING KNOWN-ISSUES rack.gemspec README SPEC)
19
19
  s.bindir = 'bin'
20
20
  s.executables << 'rackup'
21
21
  s.require_path = 'lib'
22
22
  s.has_rdoc = true
23
23
  s.extra_rdoc_files = ['README', 'SPEC', 'KNOWN-ISSUES']
24
- s.test_files = Dir['test/{test,spec}_*.rb']
24
+ s.test_files = Dir['spec/spec_*.rb']
25
25
 
26
26
  s.author = 'Christian Neukirchen'
27
27
  s.email = 'chneukirchen@gmail.com'
28
28
  s.homepage = 'http://rack.rubyforge.org'
29
29
  s.rubyforge_project = 'rack'
30
30
 
31
- s.add_development_dependency 'test-spec'
31
+ s.add_development_dependency 'bacon'
32
+ s.add_development_dependency 'rake'
32
33
 
33
- s.add_development_dependency 'camping'
34
34
  s.add_development_dependency 'fcgi'
35
35
  s.add_development_dependency 'memcache-client'
36
36
  s.add_development_dependency 'mongrel'
@@ -0,0 +1,25 @@
1
+ server.modules = ("mod_fastcgi", "mod_cgi")
2
+ server.document-root = "."
3
+ server.errorlog = var.CWD + "/lighttpd.errors"
4
+ server.port = 9203
5
+
6
+ server.event-handler = "select"
7
+
8
+ cgi.assign = ("/test" => "",
9
+ # ".ru" => ""
10
+ )
11
+
12
+ fastcgi.server = (
13
+ "test.fcgi" => ("localhost" =>
14
+ ("min-procs" => 1,
15
+ "socket" => "/tmp/rack-test-fcgi",
16
+ "bin-path" => "test.fcgi")),
17
+ "test.ru" => ("localhost" =>
18
+ ("min-procs" => 1,
19
+ "socket" => "/tmp/rack-test-ru-fcgi",
20
+ "bin-path" => "test.ru")),
21
+ "sample_rackup.ru" => ("localhost" =>
22
+ ("min-procs" => 1,
23
+ "socket" => "/tmp/rack-test-rackup-fcgi",
24
+ "bin-path" => CWD + "/rackup_stub.rb sample_rackup.ru")),
25
+ )
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- ruby -*-
3
+
4
+ $:.unshift '../../lib'
5
+ require 'rack'
6
+ Rack::Server.start
@@ -0,0 +1,5 @@
1
+ # -*- ruby -*-
2
+
3
+ require '../testrequest'
4
+
5
+ run TestRequest.new
data/spec/cgi/test ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- ruby -*-
3
+
4
+ $: << File.join(File.dirname(__FILE__), "..", "..", "lib")
5
+
6
+ require 'rack'
7
+ require '../testrequest'
8
+
9
+ Rack::Handler::CGI.run(Rack::Lint.new(TestRequest.new))
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- ruby -*-
3
+
4
+ $:.unshift '../../lib'
5
+ require 'rack'
6
+ require '../testrequest'
7
+
8
+ Rack::Handler::FastCGI.run(Rack::Lint.new(TestRequest.new))
data/spec/cgi/test.ru ADDED
@@ -0,0 +1,5 @@
1
+ #!../../bin/rackup
2
+ # -*- ruby -*-
3
+
4
+ require '../testrequest'
5
+ run TestRequest.new