unicorn 3.5.0 → 3.6.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 (47) hide show
  1. data/.document +0 -1
  2. data/DESIGN +1 -1
  3. data/GIT-VERSION-GEN +1 -1
  4. data/GNUmakefile +4 -4
  5. data/KNOWN_ISSUES +8 -1
  6. data/README +1 -1
  7. data/bin/unicorn +2 -2
  8. data/bin/unicorn_rails +6 -6
  9. data/examples/logrotate.conf +29 -0
  10. data/examples/unicorn.conf.rb +7 -0
  11. data/lib/unicorn.rb +19 -7
  12. data/lib/unicorn/app/exec_cgi.rb +1 -1
  13. data/lib/unicorn/app/inetd.rb +1 -2
  14. data/lib/unicorn/app/old_rails.rb +1 -0
  15. data/lib/unicorn/app/old_rails/static.rb +1 -1
  16. data/lib/unicorn/cgi_wrapper.rb +1 -0
  17. data/lib/unicorn/configurator.rb +120 -91
  18. data/lib/unicorn/const.rb +1 -0
  19. data/lib/unicorn/http_request.rb +2 -1
  20. data/lib/unicorn/http_response.rb +1 -0
  21. data/lib/unicorn/http_server.rb +26 -9
  22. data/lib/unicorn/launcher.rb +1 -0
  23. data/lib/unicorn/preread_input.rb +3 -0
  24. data/lib/unicorn/socket_helper.rb +1 -1
  25. data/lib/unicorn/stream_input.rb +1 -1
  26. data/lib/unicorn/tmpio.rb +1 -1
  27. data/lib/unicorn/util.rb +5 -4
  28. data/lib/unicorn/worker.rb +13 -6
  29. data/script/isolate_for_tests +2 -2
  30. data/t/t0100-rack-input-tests.sh +1 -1
  31. data/test/unit/test_http_parser.rb +0 -1
  32. metadata +6 -24
  33. data/test/rails/app-2.3.8/.gitignore +0 -2
  34. data/test/rails/app-2.3.8/Rakefile +0 -7
  35. data/test/rails/app-2.3.8/app/controllers/application_controller.rb +0 -5
  36. data/test/rails/app-2.3.8/app/controllers/foo_controller.rb +0 -36
  37. data/test/rails/app-2.3.8/app/helpers/application_helper.rb +0 -4
  38. data/test/rails/app-2.3.8/config/boot.rb +0 -109
  39. data/test/rails/app-2.3.8/config/database.yml +0 -12
  40. data/test/rails/app-2.3.8/config/environment.rb +0 -17
  41. data/test/rails/app-2.3.8/config/environments/development.rb +0 -7
  42. data/test/rails/app-2.3.8/config/environments/production.rb +0 -6
  43. data/test/rails/app-2.3.8/config/routes.rb +0 -6
  44. data/test/rails/app-2.3.8/db/.gitignore +0 -0
  45. data/test/rails/app-2.3.8/public/404.html +0 -1
  46. data/test/rails/app-2.3.8/public/500.html +0 -1
  47. data/test/rails/app-2.3.8/public/x.txt +0 -1
data/.document CHANGED
@@ -13,7 +13,6 @@ NEWS
13
13
  ChangeLog
14
14
  LATEST
15
15
  lib
16
- ext/unicorn_http/unicorn_http.c
17
16
  unicorn_1
18
17
  unicorn_rails_1
19
18
  ISSUES
data/DESIGN CHANGED
@@ -11,7 +11,7 @@
11
11
  only non-Ruby part and there are no plans to add any more
12
12
  non-Ruby components.
13
13
 
14
- * All HTTP protocol parsing and I/O is done much like Mongrel:
14
+ * All HTTP parsing and I/O is done much like Mongrel:
15
15
  1. read/parse HTTP request headers in full
16
16
  2. call Rack application
17
17
  3. write HTTP response back to the client
@@ -1,7 +1,7 @@
1
1
  #!/bin/sh
2
2
 
3
3
  GVF=GIT-VERSION-FILE
4
- DEF_VER=v3.5.0.GIT
4
+ DEF_VER=v3.6.0.GIT
5
5
 
6
6
  LF='
7
7
  '
@@ -15,7 +15,7 @@ GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE
15
15
  -include local.mk
16
16
  ruby_bin := $(shell which $(RUBY))
17
17
  ifeq ($(DLEXT),) # "so" for Linux
18
- DLEXT := $(shell $(RUBY) -rrbconfig -e 'puts Config::CONFIG["DLEXT"]')
18
+ DLEXT := $(shell $(RUBY) -rrbconfig -e 'puts RbConfig::CONFIG["DLEXT"]')
19
19
  endif
20
20
  ifeq ($(RUBY_VERSION),)
21
21
  RUBY_VERSION := $(shell $(RUBY) -e 'puts RUBY_VERSION')
@@ -205,9 +205,9 @@ $(rails_git)/info/cloned-stamp:
205
205
  git clone --mirror -q $(rails_git_url) $(rails_git)
206
206
  > $@
207
207
 
208
- $(rails_git)/info/v2.3.8-stamp: $(rails_git)/info/cloned-stamp
208
+ $(rails_git)/info/v2.2.3-stamp: $(rails_git)/info/cloned-stamp
209
209
  cd $(rails_git) && git fetch
210
- cd $(rails_git) && git rev-parse --verify refs/tags/v2.3.8
210
+ cd $(rails_git) && git rev-parse --verify refs/tags/v2.2.3
211
211
  > $@
212
212
 
213
213
  rails_tests := $(addsuffix .r,$(addprefix $(T_r).,$(rails_vers)))
@@ -220,7 +220,7 @@ $(T_r).%.r: export PATH := $(test_prefix)/bin:$(PATH)
220
220
  $(T_r).%.r: export RUBYLIB := $(test_prefix):$(test_prefix)/lib:$(MYLIBS)
221
221
  $(T_r).%.r: export UNICORN_RAILS_TEST_VERSION = $(rv)
222
222
  $(T_r).%.r: export RAILS_GIT_REPO = $(CURDIR)/$(rails_git)
223
- $(T_r).%.r: $(test_prefix)/.stamp $(rails_git)/info/v2.3.8-stamp
223
+ $(T_r).%.r: $(test_prefix)/.stamp $(rails_git)/info/v2.2.3-stamp
224
224
  $(run_test)
225
225
 
226
226
  ifneq ($(VERSION),)
@@ -3,8 +3,15 @@
3
3
  Occasionally odd {issues}[link:ISSUES.html] arise without a transparent or
4
4
  acceptable solution. Those issues are documented here.
5
5
 
6
+ * PRNGs (pseudo-random number generators) loaded before forking
7
+ (e.g. "preload_app true") may need to have their internal state
8
+ reset in the after_fork hook. Starting with \Unicorn 3.6.0, we
9
+ have builtin workarounds for Kernel#rand and OpenSSL::Random users,
10
+ but applications may use other PRNGs.
11
+
6
12
  * Under some versions of Ruby 1.8, it is necessary to call +srand+ in an
7
- after_fork hook to get correct random number generation.
13
+ after_fork hook to get correct random number generation. We have a builtin
14
+ workaround for this starting with \Unicorn 3.6.0
8
15
 
9
16
  See http://redmine.ruby-lang.org/issues/show/4338
10
17
 
data/README CHANGED
@@ -78,7 +78,7 @@ and run setup.rb after unpacking it:
78
78
 
79
79
  http://rubyforge.org/frs/?group_id=1306
80
80
 
81
- You may also install it via RubyGems on Gemcutter:
81
+ You may also install it via RubyGems on RubyGems.org:
82
82
 
83
83
  gem install unicorn
84
84
 
@@ -7,7 +7,7 @@ ENV["RACK_ENV"] ||= "development"
7
7
  rackup_opts = Unicorn::Configurator::RACKUP
8
8
  options = rackup_opts[:options]
9
9
 
10
- opts = OptionParser.new("", 24, ' ') do |opts|
10
+ op = OptionParser.new("", 24, ' ') do |opts|
11
11
  cmd = File.basename($0)
12
12
  opts.banner = "Usage: #{cmd} " \
13
13
  "[ruby options] [#{cmd} options] [rackup config file]"
@@ -105,7 +105,7 @@ opts = OptionParser.new("", 24, ' ') do |opts|
105
105
  opts.parse! ARGV
106
106
  end
107
107
 
108
- app = Unicorn.builder(ARGV[0] || 'config.ru', opts)
108
+ app = Unicorn.builder(ARGV[0] || 'config.ru', op)
109
109
 
110
110
  if $DEBUG
111
111
  require 'pp'
@@ -8,7 +8,7 @@ ENV['RAILS_ENV'] ||= "development"
8
8
  rackup_opts = Unicorn::Configurator::RACKUP
9
9
  options = rackup_opts[:options]
10
10
 
11
- opts = OptionParser.new("", 24, ' ') do |opts|
11
+ op = OptionParser.new("", 24, ' ') do |opts|
12
12
  cmd = File.basename($0)
13
13
  opts.banner = "Usage: #{cmd} " \
14
14
  "[ruby options] [#{cmd} options] [rackup config file]"
@@ -124,11 +124,11 @@ def rails_dispatcher
124
124
  result || abort("Unable to locate the application dispatcher class")
125
125
  end
126
126
 
127
- def rails_builder(ru, opts, daemonize)
128
- return Unicorn.builder(ru, opts) if ru
127
+ def rails_builder(ru, op, daemonize)
128
+ return Unicorn.builder(ru, op) if ru
129
129
 
130
130
  # allow Configurator to parse cli switches embedded in the ru file
131
- Unicorn::Configurator::RACKUP.update(:file => :rails, :optparse => opts)
131
+ Unicorn::Configurator::RACKUP.update(:file => :rails, :optparse => op)
132
132
 
133
133
  # this lambda won't run until after forking if preload_app is false
134
134
  # this runs after config file reloading
@@ -136,7 +136,7 @@ def rails_builder(ru, opts, daemonize)
136
136
  # Rails 3 includes a config.ru, use it if we find it after
137
137
  # working_directory is bound.
138
138
  ::File.exist?('config.ru') and
139
- return Unicorn.builder('config.ru', opts).call
139
+ return Unicorn.builder('config.ru', op).call
140
140
 
141
141
  # Load Rails and (possibly) the private version of Rack it bundles.
142
142
  begin
@@ -185,7 +185,7 @@ def rails_builder(ru, opts, daemonize)
185
185
  end
186
186
  end
187
187
 
188
- app = rails_builder(ARGV[0], opts, rackup_opts[:daemonize])
188
+ app = rails_builder(ARGV[0], op, rackup_opts[:daemonize])
189
189
 
190
190
  if $DEBUG
191
191
  require 'pp'
@@ -0,0 +1,29 @@
1
+ # example logrotate config file, I usually keep this in
2
+ # /etc/logrotate.d/unicorn_app on my Debian systems
3
+ #
4
+ # See the logrotate(8) manpage for more information:
5
+ # http://linux.die.net/man/8/logrotate
6
+
7
+ # Modify the following glob to match the logfiles your app writes to:
8
+ /var/log/unicorn_app/*.log {
9
+ # this first block is mostly just personal preference, though
10
+ # I wish logrotate offered an "hourly" option...
11
+ daily
12
+ missingok
13
+ rotate 180
14
+ compress # must use with delaycompress below
15
+ dateext
16
+
17
+ # this is important if using "compress" since we need to call
18
+ # the "lastaction" script below before compressing:
19
+ delaycompress
20
+
21
+ # note the lack of the evil "copytruncate" option in this
22
+ # config. Unicorn supports the USR1 signal and we send it
23
+ # as our "lastaction" action:
24
+ lastaction
25
+ # assuming your pid file is in /var/run/unicorn_app/pid
26
+ pid=/var/run/unicorn_app/pid
27
+ test -s $pid && kill -USR1 "$(cat $pid)"
28
+ endscript
29
+ }
@@ -12,6 +12,13 @@
12
12
  # more will usually help for _short_ waits on databases/caches.
13
13
  worker_processes 4
14
14
 
15
+ # Since Unicorn is never exposed to outside clients, it does not need to
16
+ # run on the standard HTTP port (80), there is no reason to start Unicorn
17
+ # as root unless it's from system init scripts.
18
+ # If running the master process as root and the workers as an unprivileged
19
+ # user, do this to switch euid/egid in the workers (also chowns logs):
20
+ # user "unprivileged_user", "unprivileged_group"
21
+
15
22
  # Help ensure your application will always spawn in the symlinked
16
23
  # "current" directory that Capistrano sets up.
17
24
  working_directory "/path/to/app/current" # available in 0.94.0+
@@ -5,10 +5,27 @@ require 'stringio'
5
5
  require 'rack'
6
6
  require 'kgio'
7
7
 
8
+ # :stopdoc:
8
9
  # Unicorn module containing all of the classes (include C extensions) for
9
10
  # running a Unicorn web server. It contains a minimalist HTTP server with just
10
11
  # enough functionality to service web application requests fast as possible.
12
+ # :startdoc:
13
+
14
+ # \Unicorn exposes very little of an user-visible API and most of its
15
+ # internals are subject to change. \Unicorn is designed to host Rack
16
+ # applications, so applications should be written against the Rack SPEC
17
+ # and not \Unicorn internals.
11
18
  module Unicorn
19
+
20
+ # Raised inside TeeInput when a client closes the socket inside the
21
+ # application dispatch. This is always raised with an empty backtrace
22
+ # since there is nothing in the application stack that is responsible
23
+ # for client shutdowns/disconnects. This exception is visible to Rack
24
+ # applications unless PrereadInput middleware is loaded.
25
+ class ClientShutdown < EOFError
26
+ end
27
+
28
+ # :stopdoc:
12
29
  def self.run(app, options = {})
13
30
  Unicorn::HttpServer.new(app, options).start.join
14
31
  end
@@ -63,14 +80,9 @@ module Unicorn
63
80
  Unicorn::SocketHelper.sock_name(io)
64
81
  end
65
82
  end
83
+ # :startdoc:
66
84
  end
67
-
68
- # raised inside TeeInput when a client closes the socket inside the
69
- # application dispatch. This is always raised with an empty backtrace
70
- # since there is nothing in the application stack that is responsible
71
- # for client shutdowns/disconnects.
72
- class Unicorn::ClientShutdown < EOFError; end
73
-
85
+ # :enddoc:
74
86
  require 'unicorn/const'
75
87
  require 'unicorn/socket_helper'
76
88
  require 'unicorn/stream_input'
@@ -1,5 +1,5 @@
1
1
  # -*- encoding: binary -*-
2
-
2
+ # :enddoc:
3
3
  require 'unicorn'
4
4
 
5
5
  module Unicorn::App
@@ -1,10 +1,9 @@
1
1
  # -*- encoding: binary -*-
2
-
2
+ # :enddoc:
3
3
  # Copyright (c) 2009 Eric Wong
4
4
  # You can redistribute it and/or modify it under the same terms as Ruby.
5
5
 
6
6
  # this class *must* be used with Rack::Chunked
7
-
8
7
  module Unicorn::App
9
8
  class Inetd < Struct.new(:cmd)
10
9
 
@@ -1,5 +1,6 @@
1
1
  # -*- encoding: binary -*-
2
2
 
3
+ # :enddoc:
3
4
  # This code is based on the original Rails handler in Mongrel
4
5
  # Copyright (c) 2005 Zed A. Shaw
5
6
  # Copyright (c) 2009 Eric Wong
@@ -1,5 +1,5 @@
1
1
  # -*- encoding: binary -*-
2
-
2
+ # :enddoc:
3
3
  # This code is based on the original Rails handler in Mongrel
4
4
  # Copyright (c) 2005 Zed A. Shaw
5
5
  # Copyright (c) 2009 Eric Wong
@@ -1,5 +1,6 @@
1
1
  # -*- encoding: binary -*-
2
2
 
3
+ # :enddoc:
3
4
  # This code is based on the original CGIWrapper from Mongrel
4
5
  # Copyright (c) 2005 Zed A. Shaw
5
6
  # Copyright (c) 2009 Eric Wong
@@ -103,20 +103,24 @@ class Unicorn::Configurator
103
103
  set[key]
104
104
  end
105
105
 
106
- # sets object to the +new+ Logger-like object. The new logger-like
106
+ # sets object to the +obj+ Logger-like object. The new Logger-like
107
107
  # object must respond to the following methods:
108
- # +debug+, +info+, +warn+, +error+, +fatal+
108
+ # * debug
109
+ # * info
110
+ # * warn
111
+ # * error
112
+ # * fatal
109
113
  # The default Logger will log its output to the path specified
110
114
  # by +stderr_path+. If you're running Unicorn daemonized, then
111
115
  # you must specify a path to prevent error messages from going
112
116
  # to /dev/null.
113
- def logger(new)
117
+ def logger(obj)
114
118
  %w(debug info warn error fatal).each do |m|
115
- new.respond_to?(m) and next
116
- raise ArgumentError, "logger=#{new} does not respond to method=#{m}"
119
+ obj.respond_to?(m) and next
120
+ raise ArgumentError, "logger=#{obj} does not respond to method=#{m}"
117
121
  end
118
122
 
119
- set[:logger] = new
123
+ set[:logger] = obj
120
124
  end
121
125
 
122
126
  # sets after_fork hook to a given block. This block will be called by
@@ -132,11 +136,6 @@ class Unicorn::Configurator
132
136
  # # Existing options for Unicorn::Configurator#listen such as
133
137
  # # :backlog, :rcvbuf, :sndbuf are available here as well.
134
138
  # server.listen(addr, :tries => -1, :delay => 5, :backlog => 128)
135
- #
136
- # # drop permissions to "www-data" in the worker
137
- # # generally there's no reason to start Unicorn as a priviledged user
138
- # # as it is not recommended to expose Unicorn to public clients.
139
- # worker.user('www-data', 'www-data') if Process.euid == 0
140
139
  # end
141
140
  def after_fork(*args, &block)
142
141
  set_hook(:after_fork, block_given? ? block : args[0])
@@ -208,131 +207,157 @@ class Unicorn::Configurator
208
207
  set[:listeners] = addresses
209
208
  end
210
209
 
211
- # adds an +address+ to the existing listener set.
210
+ # Adds an +address+ to the existing listener set. May be specified more
211
+ # than once. +address+ may be an Integer port number for a TCP port, an
212
+ # "IP_ADDRESS:PORT" for TCP listeners or a pathname for UNIX domain sockets.
213
+ #
214
+ # listen 3000 # listen to port 3000 on all TCP interfaces
215
+ # listen "127.0.0.1:3000" # listen to port 3000 on the loopback interface
216
+ # listen "/tmp/.unicorn.sock" # listen on the given Unix domain socket
217
+ # listen "[::1]:3000" # listen to port 3000 on the IPv6 loopback interface
212
218
  #
213
219
  # The following options may be specified (but are generally not needed):
214
220
  #
215
- # +:backlog+: this is the backlog of the listen() syscall.
221
+ # [:backlog => number of clients]
222
+ #
223
+ # This is the backlog of the listen() syscall.
224
+ #
225
+ # Some operating systems allow negative values here to specify the
226
+ # maximum allowable value. In most cases, this number is only
227
+ # recommendation and there are other OS-specific tunables and
228
+ # variables that can affect this number. See the listen(2)
229
+ # syscall documentation of your OS for the exact semantics of
230
+ # this.
231
+ #
232
+ # If you are running unicorn on multiple machines, lowering this number
233
+ # can help your load balancer detect when a machine is overloaded
234
+ # and give requests to a different machine.
235
+ #
236
+ # Default: 1024
216
237
  #
217
- # Some operating systems allow negative values here to specify the
218
- # maximum allowable value. In most cases, this number is only
219
- # recommendation and there are other OS-specific tunables and
220
- # variables that can affect this number. See the listen(2)
221
- # syscall documentation of your OS for the exact semantics of
222
- # this.
238
+ # [:rcvbuf => bytes, :sndbuf => bytes]
223
239
  #
224
- # If you are running unicorn on multiple machines, lowering this number
225
- # can help your load balancer detect when a machine is overloaded
226
- # and give requests to a different machine.
240
+ # Maximum receive and send buffer sizes (in bytes) of sockets.
227
241
  #
228
- # Default: 1024
242
+ # These correspond to the SO_RCVBUF and SO_SNDBUF settings which
243
+ # can be set via the setsockopt(2) syscall. Some kernels
244
+ # (e.g. Linux 2.4+) have intelligent auto-tuning mechanisms and
245
+ # there is no need (and it is sometimes detrimental) to specify them.
229
246
  #
230
- # +:rcvbuf+, +:sndbuf+: maximum receive and send buffer sizes of sockets
247
+ # See the socket API documentation of your operating system
248
+ # to determine the exact semantics of these settings and
249
+ # other operating system-specific knobs where they can be
250
+ # specified.
231
251
  #
232
- # These correspond to the SO_RCVBUF and SO_SNDBUF settings which
233
- # can be set via the setsockopt(2) syscall. Some kernels
234
- # (e.g. Linux 2.4+) have intelligent auto-tuning mechanisms and
235
- # there is no need (and it is sometimes detrimental) to specify them.
252
+ # Defaults: operating system defaults
236
253
  #
237
- # See the socket API documentation of your operating system
238
- # to determine the exact semantics of these settings and
239
- # other operating system-specific knobs where they can be
240
- # specified.
254
+ # [:tcp_nodelay => true or false]
241
255
  #
242
- # Defaults: operating system defaults
256
+ # Disables Nagle's algorithm on TCP sockets if +true+
243
257
  #
244
- # +:tcp_nodelay+: disables Nagle's algorithm on TCP sockets
258
+ # This has no effect on UNIX sockets.
245
259
  #
246
- # This has no effect on UNIX sockets.
260
+ # Default: operating system defaults (usually Nagle's algorithm enabled)
247
261
  #
248
- # Default: operating system defaults (usually Nagle's algorithm enabled)
262
+ # [:tcp_nopush => true or false]
249
263
  #
250
- # +:tcp_nopush+: enables/disables TCP_CORK in Linux or TCP_NOPUSH in FreeBSD
264
+ # Enables/disables TCP_CORK in Linux or TCP_NOPUSH in FreeBSD
251
265
  #
252
- # This is enabled by default as of Unicorn 3.4. This prevents partial
253
- # TCP frames from being sent out and reduces wakeups in nginx if it is
254
- # on a different machine. Since Unicorn is only designed for applications
255
- # that send the response body quickly without keepalive, sockets will
256
- # always be flushed on close to prevent delays.
266
+ # This is enabled by default as of Unicorn 3.4. This prevents partial
267
+ # TCP frames from being sent out and reduces wakeups in nginx if it is
268
+ # on a different machine. Since Unicorn is only designed for applications
269
+ # that send the response body quickly without keepalive, sockets will
270
+ # always be flushed on close to prevent delays.
257
271
  #
258
- # This has no effect on UNIX sockets.
272
+ # This has no effect on UNIX sockets.
259
273
  #
260
- # +:tries+: times to retry binding a socket if it is already in use
274
+ # [:tries => Integer]
261
275
  #
262
- # A negative number indicates we will retry indefinitely, this is
263
- # useful for migrations and upgrades when individual workers
264
- # are binding to different ports.
276
+ # Times to retry binding a socket if it is already in use
265
277
  #
266
- # Default: 5
278
+ # A negative number indicates we will retry indefinitely, this is
279
+ # useful for migrations and upgrades when individual workers
280
+ # are binding to different ports.
267
281
  #
268
- # +:delay+: seconds to wait between successive +tries+
282
+ # Default: 5
269
283
  #
270
- # Default: 0.5 seconds
284
+ # [:delay => seconds]
271
285
  #
272
- # +:umask+: sets the file mode creation mask for UNIX sockets
286
+ # Seconds to wait between successive +tries+
273
287
  #
274
- # Typically UNIX domain sockets are created with more liberal
275
- # file permissions than the rest of the application. By default,
276
- # we create UNIX domain sockets to be readable and writable by
277
- # all local users to give them the same accessibility as
278
- # locally-bound TCP listeners.
288
+ # Default: 0.5 seconds
279
289
  #
280
- # This has no effect on TCP listeners.
290
+ # [:umask => mode]
281
291
  #
282
- # Default: 0 (world read/writable)
292
+ # Sets the file mode creation mask for UNIX sockets. If specified,
293
+ # this is usually in octal notation.
283
294
  #
284
- # +:tcp_defer_accept:+ defer accept() until data is ready (Linux-only)
295
+ # Typically UNIX domain sockets are created with more liberal
296
+ # file permissions than the rest of the application. By default,
297
+ # we create UNIX domain sockets to be readable and writable by
298
+ # all local users to give them the same accessibility as
299
+ # locally-bound TCP listeners.
285
300
  #
286
- # For Linux 2.6.32 and later, this is the number of retransmits to
287
- # defer an accept() for if no data arrives, but the client will
288
- # eventually be accepted after the specified number of retransmits
289
- # regardless of whether data is ready.
301
+ # This has no effect on TCP listeners.
290
302
  #
291
- # For Linux before 2.6.32, this is a boolean option, and
292
- # accepts are _always_ deferred indefinitely if no data arrives.
293
- # This is similar to <code>:accept_filter => "dataready"</code>
294
- # under FreeBSD.
303
+ # Default: 0000 (world-read/writable)
295
304
  #
296
- # Specifying +true+ is synonymous for the default value(s) below,
297
- # and +false+ or +nil+ is synonymous for a value of zero.
305
+ # [:tcp_defer_accept => Integer]
298
306
  #
299
- # A value of +1+ is a good optimization for local networks
300
- # and trusted clients. For Rainbows! and Zbatery users, a higher
301
- # value (e.g. +60+) provides more protection against some
302
- # denial-of-service attacks. There is no good reason to ever
303
- # disable this with a +zero+ value when serving HTTP.
307
+ # Defer accept() until data is ready (Linux-only)
304
308
  #
305
- # Default: 1 retransmit for \Unicorn, 60 for Rainbows! 0.95.0\+
309
+ # For Linux 2.6.32 and later, this is the number of retransmits to
310
+ # defer an accept() for if no data arrives, but the client will
311
+ # eventually be accepted after the specified number of retransmits
312
+ # regardless of whether data is ready.
306
313
  #
307
- # +:accept_filter: defer accept() until data is ready (FreeBSD-only)
314
+ # For Linux before 2.6.32, this is a boolean option, and
315
+ # accepts are _always_ deferred indefinitely if no data arrives.
316
+ # This is similar to <code>:accept_filter => "dataready"</code>
317
+ # under FreeBSD.
308
318
  #
309
- # This enables either the "dataready" or (default) "httpready"
310
- # accept() filter under FreeBSD. This is intended as an
311
- # optimization to reduce context switches with common GET/HEAD
312
- # requests. For Rainbows! and Zbatery users, this provides
313
- # some protection against certain denial-of-service attacks, too.
319
+ # Specifying +true+ is synonymous for the default value(s) below,
320
+ # and +false+ or +nil+ is synonymous for a value of zero.
314
321
  #
315
- # There is no good reason to change from the default.
322
+ # A value of +1+ is a good optimization for local networks
323
+ # and trusted clients. For Rainbows! and Zbatery users, a higher
324
+ # value (e.g. +60+) provides more protection against some
325
+ # denial-of-service attacks. There is no good reason to ever
326
+ # disable this with a +zero+ value when serving HTTP.
316
327
  #
317
- # Default: "httpready"
318
- def listen(address, opt = {})
328
+ # Default: 1 retransmit for \Unicorn, 60 for Rainbows! 0.95.0\+
329
+ #
330
+ # [:accept_filter => String]
331
+ #
332
+ # defer accept() until data is ready (FreeBSD-only)
333
+ #
334
+ # This enables either the "dataready" or (default) "httpready"
335
+ # accept() filter under FreeBSD. This is intended as an
336
+ # optimization to reduce context switches with common GET/HEAD
337
+ # requests. For Rainbows! and Zbatery users, this provides
338
+ # some protection against certain denial-of-service attacks, too.
339
+ #
340
+ # There is no good reason to change from the default.
341
+ #
342
+ # Default: "httpready"
343
+ def listen(address, options = {})
319
344
  address = expand_addr(address)
320
345
  if String === address
321
346
  [ :umask, :backlog, :sndbuf, :rcvbuf, :tries ].each do |key|
322
- value = opt[key] or next
347
+ value = options[key] or next
323
348
  Integer === value or
324
349
  raise ArgumentError, "not an integer: #{key}=#{value.inspect}"
325
350
  end
326
351
  [ :tcp_nodelay, :tcp_nopush ].each do |key|
327
- (value = opt[key]).nil? and next
352
+ (value = options[key]).nil? and next
328
353
  TrueClass === value || FalseClass === value or
329
354
  raise ArgumentError, "not boolean: #{key}=#{value.inspect}"
330
355
  end
331
- unless (value = opt[:delay]).nil?
356
+ unless (value = options[:delay]).nil?
332
357
  Numeric === value or
333
358
  raise ArgumentError, "not numeric: delay=#{value.inspect}"
334
359
  end
335
- set[:listener_opts][address].merge!(opt)
360
+ set[:listener_opts][address].merge!(options)
336
361
  end
337
362
 
338
363
  set[:listeners] << address
@@ -373,11 +398,11 @@ class Unicorn::Configurator
373
398
  set_bool(:preload_app, bool)
374
399
  end
375
400
 
376
- # Toggles making <code>env["rack.input"]</code> rewindable.
401
+ # Toggles making \env[\"rack.input\"] rewindable.
377
402
  # Disabling rewindability can improve performance by lowering
378
403
  # I/O and memory usage for applications that accept uploads.
379
404
  # Keep in mind that the Rack 1.x spec requires
380
- # <code>env["rack.input"]</code> to be rewindable, so this allows
405
+ # \env[\"rack.input\"] to be rewindable, so this allows
381
406
  # intentionally violating the current Rack 1.x spec.
382
407
  #
383
408
  # +rewindable_input+ defaults to +true+ when used with Rack 1.x for
@@ -443,6 +468,7 @@ class Unicorn::Configurator
443
468
  # The master process always stays running as the user who started it.
444
469
  # This switch will occur after calling the after_fork hook, and only
445
470
  # if the Worker#user method is not called in the after_fork hook
471
+ # +group+ is optional and will not change if unspecified.
446
472
  def user(user, group = nil)
447
473
  # raises ArgumentError on invalid user/group
448
474
  Etc.getpwnam(user)
@@ -455,6 +481,9 @@ class Unicorn::Configurator
455
481
  # Rainbows!/Zbatery installations facing untrusted clients directly
456
482
  # should set this to +false+. This is +true+ by default as Unicorn
457
483
  # is designed to only sit behind trusted nginx proxies.
484
+ #
485
+ # This has never been publically documented and is subject to removal
486
+ # in future releases.
458
487
  def trust_x_forwarded(bool) # :nodoc:
459
488
  set_bool(:trust_x_forwarded, bool)
460
489
  end
@@ -462,7 +491,7 @@ class Unicorn::Configurator
462
491
  # expands "unix:path/to/foo" to a socket relative to the current path
463
492
  # expands pathnames of sockets if relative to "~" or "~username"
464
493
  # expands "*:port and ":port" to "0.0.0.0:port"
465
- def expand_addr(address) #:nodoc
494
+ def expand_addr(address) #:nodoc:
466
495
  return "0.0.0.0:#{address}" if Integer === address
467
496
  return address unless String === address
468
497
 
@@ -1,5 +1,6 @@
1
1
  # -*- encoding: binary -*-
2
2
 
3
+ # :enddoc:
3
4
  # Frequently used constants when constructing requests or responses.
4
5
  # Many times the constant just refers to a string with the same
5
6
  # contents. Using these constants gave about a 3% to 10% performance
@@ -1,5 +1,6 @@
1
1
  # -*- encoding: binary -*-
2
-
2
+ # :enddoc:
3
+ # no stable API here
3
4
  require 'unicorn_http'
4
5
 
5
6
  # TODO: remove redundant names
@@ -1,4 +1,5 @@
1
1
  # -*- encoding: binary -*-
2
+ # :enddoc:
2
3
  # Writes a Rack response to your client using the HTTP/1.1 specification.
3
4
  # You use it by simply doing:
4
5
  #
@@ -4,15 +4,19 @@
4
4
  # processes which in turn handle the I/O and application process.
5
5
  # Listener sockets are started in the master process and shared with
6
6
  # forked worker children.
7
+ #
8
+ # Users do not need to know the internals of this class, but reading the
9
+ # {source}[http://bogomips.org/unicorn.git/tree/lib/unicorn/http_server.rb]
10
+ # is education for programmers wishing to learn how \Unicorn works.
11
+ # See Unicorn::Configurator for information on how to configure \Unicorn.
7
12
  class Unicorn::HttpServer
13
+ # :stopdoc:
8
14
  attr_accessor :app, :request, :timeout, :worker_processes,
9
15
  :before_fork, :after_fork, :before_exec,
10
16
  :listener_opts, :preload_app,
11
17
  :reexec_pid, :orig_app, :init_listeners,
12
18
  :master_pid, :config, :ready_pipe, :user
13
19
  attr_reader :pid, :logger
14
-
15
- # :stopdoc:
16
20
  include Unicorn::SocketHelper
17
21
  include Unicorn::HttpResponse
18
22
 
@@ -84,6 +88,7 @@ class Unicorn::HttpServer
84
88
  rescue
85
89
  Dir.pwd
86
90
  end
91
+ # :stopdoc:
87
92
 
88
93
  # Creates a working server on host:port (strange things happen if
89
94
  # port isn't a Number). Use HttpServer::run to start the server and
@@ -94,7 +99,7 @@ class Unicorn::HttpServer
94
99
  @request = Unicorn::HttpRequest.new
95
100
  self.reexec_pid = 0
96
101
  options = options.dup
97
- self.ready_pipe = options.delete(:ready_pipe)
102
+ @ready_pipe = options.delete(:ready_pipe)
98
103
  self.init_listeners = options[:listeners] ? options[:listeners].dup : []
99
104
  options[:use_defaults] = true
100
105
  self.config = Unicorn::Configurator.new(options)
@@ -277,10 +282,10 @@ class Unicorn::HttpServer
277
282
 
278
283
  proc_name 'master'
279
284
  logger.info "master process ready" # test_exec.rb relies on this message
280
- if ready_pipe
281
- ready_pipe.syswrite($$.to_s)
282
- ready_pipe.close rescue nil
283
- self.ready_pipe = nil
285
+ if @ready_pipe
286
+ @ready_pipe.syswrite($$.to_s)
287
+ @ready_pipe.close rescue nil
288
+ @ready_pipe = nil
284
289
  end
285
290
  begin
286
291
  reap_all_workers
@@ -484,14 +489,23 @@ class Unicorn::HttpServer
484
489
  next_sleep
485
490
  end
486
491
 
492
+ def after_fork_internal
493
+ @ready_pipe.close if @ready_pipe
494
+ self.ready_pipe = nil # XXX Rainbows! compat, change for Unicorn 4.x
495
+ tmp = srand # http://redmine.ruby-lang.org/issues/4338
496
+
497
+ # The OpenSSL PRNG is seeded with only the pid, and apps with frequently
498
+ # dying workers can recycle pids
499
+ OpenSSL::Random.seed(tmp.to_s) if defined?(OpenSSL::Random)
500
+ end
501
+
487
502
  def spawn_missing_workers
488
503
  (0...worker_processes).each do |worker_nr|
489
504
  WORKERS.values.include?(worker_nr) and next
490
505
  worker = Worker.new(worker_nr, Unicorn::TmpIO.new)
491
506
  before_fork.call(self, worker)
492
507
  WORKERS[fork {
493
- ready_pipe.close if ready_pipe
494
- self.ready_pipe = nil
508
+ after_fork_internal
495
509
  worker_loop(worker)
496
510
  }] = worker
497
511
  end
@@ -568,6 +582,9 @@ class Unicorn::HttpServer
568
582
  Unicorn::Util.reopen_logs
569
583
  logger.info "worker=#{worker_nr} done reopening logs"
570
584
  init_self_pipe!
585
+ rescue => e
586
+ logger.error(e) rescue nil
587
+ exit!(77) # EX_NOPERM in sysexits.h
571
588
  end
572
589
 
573
590
  # runs inside each forked worker, this sits around and waits
@@ -1,5 +1,6 @@
1
1
  # -*- encoding: binary -*-
2
2
 
3
+ # :enddoc:
3
4
  $stdout.sync = $stderr.sync = true
4
5
  $stdin.binmode
5
6
  $stdout.binmode
@@ -13,6 +13,8 @@ module Unicorn
13
13
  # end
14
14
  # run YourApp.new
15
15
  class PrereadInput
16
+
17
+ # :stopdoc:
16
18
  def initialize(app)
17
19
  @app = app
18
20
  end
@@ -26,5 +28,6 @@ class PrereadInput
26
28
  end
27
29
  @app.call(env)
28
30
  end
31
+ # :startdoc:
29
32
  end
30
33
  end
@@ -17,7 +17,7 @@ module Unicorn
17
17
  # denial-of-service attacks
18
18
  :tcp_defer_accept => 1,
19
19
 
20
- # FreeBSD, we need to override this to 'dataready' when we
20
+ # FreeBSD, we need to override this to 'dataready' if we
21
21
  # eventually get HTTPS support
22
22
  :accept_filter => 'httpready',
23
23
 
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: binary -*-
2
2
 
3
3
  # When processing uploads, Unicorn may expose a StreamInput object under
4
- # "rack.input" of the Rack (2.x) environment.
4
+ # "rack.input" of the (future) Rack (2.x) environment.
5
5
  class Unicorn::StreamInput
6
6
  # The I/O chunk size (in +bytes+) for I/O operations where
7
7
  # the size cannot be user-specified when a method is called.
@@ -25,5 +25,5 @@ class Unicorn::TmpIO < File
25
25
  # for easier env["rack.input"] compatibility with Rack <= 1.1
26
26
  def size
27
27
  stat.size
28
- end
28
+ end unless File.method_defined?(:size)
29
29
  end
@@ -8,7 +8,6 @@ module Unicorn::Util
8
8
 
9
9
  ! fp.closed? &&
10
10
  fp.sync &&
11
- fp.path[0] == ?/ &&
12
11
  (fp.fcntl(Fcntl::F_GETFL) & append_flags) == append_flags
13
12
  rescue IOError, Errno::EBADF
14
13
  false
@@ -25,10 +24,12 @@ module Unicorn::Util
25
24
  # using logrotate(8) (without copytruncate) or similar tools.
26
25
  # A +File+ object is considered for reopening if it is:
27
26
  # 1) opened with the O_APPEND and O_WRONLY flags
28
- # 2) opened with an absolute path (starts with "/")
29
- # 3) the current open file handle does not match its original open path
30
- # 4) unbuffered (as far as userspace buffering goes, not O_SYNC)
27
+ # 2) the current open file handle does not match its original open path
28
+ # 3) unbuffered (as far as userspace buffering goes, not O_SYNC)
31
29
  # Returns the number of files reopened
30
+ #
31
+ # In Unicorn 3.5.x and earlier, files must be opened with an absolute
32
+ # path to be considered a log file.
32
33
  def self.reopen_logs
33
34
  to_reopen = []
34
35
  nr = 0
@@ -2,16 +2,23 @@
2
2
 
3
3
  # This class and its members can be considered a stable interface
4
4
  # and will not change in a backwards-incompatible fashion between
5
- # releases of Unicorn. You may need to access it in the
6
- # before_fork/after_fork hooks. See the Unicorn::Configurator RDoc
7
- # for examples.
5
+ # releases of \Unicorn. Knowledge of this class is generally not
6
+ # not needed for most users of \Unicorn.
7
+ #
8
+ # Some users may want to access it in the before_fork/after_fork hooks.
9
+ # See the Unicorn::Configurator RDoc for examples.
8
10
  class Unicorn::Worker < Struct.new(:nr, :tmp, :switched)
9
11
 
10
- # worker objects may be compared to just plain numbers
11
- def ==(other_nr)
12
- self.nr == other_nr
12
+ # worker objects may be compared to just plain Integers
13
+ def ==(other_nr) # :nodoc:
14
+ nr == other_nr
13
15
  end
14
16
 
17
+ # In most cases, you should be using the Unicorn::Configurator#user
18
+ # directive instead. This method should only be used if you need
19
+ # fine-grained control of exactly when you want to change permissions
20
+ # in your after_fork hooks.
21
+ #
15
22
  # Changes the worker process to the specified +user+ and +group+
16
23
  # This is only intended to be called from within the worker
17
24
  # process from the +after_fork+ hook. This should be called in
@@ -17,8 +17,8 @@ opts = {
17
17
  pid = fork do
18
18
  Isolate.now!(opts) do
19
19
  gem 'sqlite3-ruby', '1.2.5'
20
- gem 'kgio', '2.3.2'
21
- gem 'rack', '1.1.0'
20
+ gem 'kgio', '2.3.3'
21
+ gem 'rack', '1.2.2'
22
22
  end
23
23
  end
24
24
  _, status = Process.waitpid2(pid)
@@ -7,7 +7,7 @@ t_plan 10 "rack.input read tests"
7
7
  t_begin "setup and startup" && {
8
8
  rtmpfiles curl_out curl_err
9
9
  unicorn_setup
10
- unicorn -D rack-input-tests.ru -c $unicorn_config
10
+ unicorn -E none -D rack-input-tests.ru -c $unicorn_config
11
11
  blob_sha1=$(rsha1 < random_blob)
12
12
  blob_size=$(wc -c < random_blob)
13
13
  t_info "blob_sha1=$blob_sha1"
@@ -302,7 +302,6 @@ class HttpParserTest < Test::Unit::TestCase
302
302
  "Host: hello\r\n" \
303
303
  "\r\n"
304
304
  parser.buf << header
305
- req = parser.env
306
305
  assert_raises(HttpParserError) { parser.parse }
307
306
  end
308
307
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: unicorn
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
4
+ hash: 31
5
5
  prerelease:
6
6
  segments:
7
7
  - 3
8
- - 5
8
+ - 6
9
9
  - 0
10
- version: 3.5.0
10
+ version: 3.6.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Unicorn hackers
@@ -15,8 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-03-15 00:00:00 +00:00
19
- default_executable:
18
+ date: 2011-04-21 00:00:00 Z
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
22
21
  name: rack
@@ -125,7 +124,6 @@ extra_rdoc_files:
125
124
  - lib/unicorn/tmpio.rb
126
125
  - lib/unicorn/util.rb
127
126
  - lib/unicorn/worker.rb
128
- - ext/unicorn_http/unicorn_http.c
129
127
  - ISSUES
130
128
  - Sandbox
131
129
  files:
@@ -167,6 +165,7 @@ files:
167
165
  - examples/git.ru
168
166
  - examples/init.sh
169
167
  - examples/logger_mp_safe.rb
168
+ - examples/logrotate.conf
170
169
  - examples/nginx.conf
171
170
  - examples/unicorn.conf.minimal.rb
172
171
  - examples/unicorn.conf.rb
@@ -348,22 +347,6 @@ files:
348
347
  - test/rails/app-2.2.2/log/.gitignore
349
348
  - test/rails/app-2.2.2/public/404.html
350
349
  - test/rails/app-2.2.2/public/500.html
351
- - test/rails/app-2.3.8/.gitignore
352
- - test/rails/app-2.3.8/Rakefile
353
- - test/rails/app-2.3.8/app/controllers/application_controller.rb
354
- - test/rails/app-2.3.8/app/controllers/foo_controller.rb
355
- - test/rails/app-2.3.8/app/helpers/application_helper.rb
356
- - test/rails/app-2.3.8/config/boot.rb
357
- - test/rails/app-2.3.8/config/database.yml
358
- - test/rails/app-2.3.8/config/environment.rb
359
- - test/rails/app-2.3.8/config/environments/development.rb
360
- - test/rails/app-2.3.8/config/environments/production.rb
361
- - test/rails/app-2.3.8/config/routes.rb
362
- - test/rails/app-2.3.8/db/.gitignore
363
- - test/rails/app-2.3.8/log/.gitignore
364
- - test/rails/app-2.3.8/public/404.html
365
- - test/rails/app-2.3.8/public/500.html
366
- - test/rails/app-2.3.8/public/x.txt
367
350
  - test/rails/test_rails.rb
368
351
  - test/test_helper.rb
369
352
  - test/unit/test_configurator.rb
@@ -380,7 +363,6 @@ files:
380
363
  - test/unit/test_upload.rb
381
364
  - test/unit/test_util.rb
382
365
  - unicorn.gemspec
383
- has_rdoc: true
384
366
  homepage: http://unicorn.bogomips.org/
385
367
  licenses: []
386
368
 
@@ -413,7 +395,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
413
395
  requirements: []
414
396
 
415
397
  rubyforge_project: mongrel
416
- rubygems_version: 1.6.1
398
+ rubygems_version: 1.7.2
417
399
  signing_key:
418
400
  specification_version: 3
419
401
  summary: Rack HTTP server for fast clients and Unix
@@ -1,2 +0,0 @@
1
- /tmp
2
- /vendor
@@ -1,7 +0,0 @@
1
- require(File.join(File.dirname(__FILE__), 'config', 'boot'))
2
-
3
- require 'rake'
4
- require 'rake/testtask'
5
- require 'rake/rdoctask'
6
-
7
- require 'tasks/rails'
@@ -1,5 +0,0 @@
1
- # -*- encoding: binary -*-
2
-
3
- class ApplicationController < ActionController::Base
4
- helper :all
5
- end
@@ -1,36 +0,0 @@
1
- # -*- encoding: binary -*-
2
-
3
- require 'digest/sha1'
4
- class FooController < ApplicationController
5
- def index
6
- render :text => "FOO\n"
7
- end
8
-
9
- def xcookie
10
- cookies["foo"] = "cookie-#$$-#{session[:gotta_use_the_session_in_2_3]}"
11
- render :text => ""
12
- end
13
-
14
- def xnotice
15
- flash[:notice] = "session #$$"
16
- render :text => ""
17
- end
18
-
19
- def xpost
20
- if request.post?
21
- digest = Digest::SHA1.new
22
- out = "params: #{params.inspect}\n"
23
- if file = params[:file]
24
- loop do
25
- buf = file.read(4096) or break
26
- digest.update(buf)
27
- end
28
- out << "sha1: #{digest.to_s}\n"
29
- end
30
- headers['content-type'] = 'text/plain'
31
- render :text => out
32
- else
33
- render :status => 403, :text => "need post\n"
34
- end
35
- end
36
- end
@@ -1,4 +0,0 @@
1
- # -*- encoding: binary -*-
2
-
3
- module ApplicationHelper
4
- end
@@ -1,109 +0,0 @@
1
- # -*- encoding: binary -*-
2
-
3
- RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
4
-
5
- module Rails
6
- class << self
7
- def boot!
8
- unless booted?
9
- preinitialize
10
- pick_boot.run
11
- end
12
- end
13
-
14
- def booted?
15
- defined? Rails::Initializer
16
- end
17
-
18
- def pick_boot
19
- (vendor_rails? ? VendorBoot : GemBoot).new
20
- end
21
-
22
- def vendor_rails?
23
- File.exist?("#{RAILS_ROOT}/vendor/rails")
24
- end
25
-
26
- def preinitialize
27
- load(preinitializer_path) if File.exist?(preinitializer_path)
28
- end
29
-
30
- def preinitializer_path
31
- "#{RAILS_ROOT}/config/preinitializer.rb"
32
- end
33
- end
34
-
35
- class Boot
36
- def run
37
- load_initializer
38
- Rails::Initializer.run(:set_load_path)
39
- end
40
- end
41
-
42
- class VendorBoot < Boot
43
- def load_initializer
44
- require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"
45
- Rails::Initializer.run(:install_gem_spec_stubs)
46
- Rails::GemDependency.add_frozen_gem_path
47
- end
48
- end
49
-
50
- class GemBoot < Boot
51
- def load_initializer
52
- self.class.load_rubygems
53
- load_rails_gem
54
- require 'initializer'
55
- end
56
-
57
- def load_rails_gem
58
- if version = self.class.gem_version
59
- gem 'rails', version
60
- else
61
- gem 'rails'
62
- end
63
- rescue Gem::LoadError => load_error
64
- $stderr.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.)
65
- exit 1
66
- end
67
-
68
- class << self
69
- def rubygems_version
70
- Gem::RubyGemsVersion rescue nil
71
- end
72
-
73
- def gem_version
74
- if defined? RAILS_GEM_VERSION
75
- RAILS_GEM_VERSION
76
- elsif ENV.include?('RAILS_GEM_VERSION')
77
- ENV['RAILS_GEM_VERSION']
78
- else
79
- parse_gem_version(read_environment_rb)
80
- end
81
- end
82
-
83
- def load_rubygems
84
- require 'rubygems'
85
- min_version = '1.3.1'
86
- unless rubygems_version >= min_version
87
- $stderr.puts %Q(Rails requires RubyGems >= #{min_version} (you have #{rubygems_version}). Please `gem update --system` and try again.)
88
- exit 1
89
- end
90
-
91
- rescue LoadError
92
- $stderr.puts %Q(Rails requires RubyGems >= #{min_version}. Please install RubyGems and try again: http://rubygems.rubyforge.org)
93
- exit 1
94
- end
95
-
96
- def parse_gem_version(text)
97
- $1 if text =~ /^[^#]*RAILS_GEM_VERSION\s*=\s*["']([!~<>=]*\s*[\d.]+)["']/
98
- end
99
-
100
- private
101
- def read_environment_rb
102
- File.read("#{RAILS_ROOT}/config/environment.rb")
103
- end
104
- end
105
- end
106
- end
107
-
108
- # All that for this:
109
- Rails.boot!
@@ -1,12 +0,0 @@
1
- development:
2
- adapter: sqlite3
3
- database: db/development.sqlite3
4
- timeout: 5000
5
- test:
6
- adapter: sqlite3
7
- database: db/test.sqlite3
8
- timeout: 5000
9
- production:
10
- adapter: sqlite3
11
- database: db/production.sqlite3
12
- timeout: 5000
@@ -1,17 +0,0 @@
1
- # -*- encoding: binary -*-
2
-
3
- unless defined? RAILS_GEM_VERSION
4
- RAILS_GEM_VERSION = ENV['UNICORN_RAILS_VERSION']
5
- end
6
-
7
- # Bootstrap the Rails environment, frameworks, and default configuration
8
- require File.join(File.dirname(__FILE__), 'boot')
9
-
10
- Rails::Initializer.run do |config|
11
- config.frameworks -= [ :active_resource, :action_mailer ]
12
- config.action_controller.session_store = :active_record_store
13
- config.action_controller.session = {
14
- :session_key => "_unicorn_rails_test.#{rand}",
15
- :secret => "#{rand}#{rand}#{rand}#{rand}",
16
- }
17
- end
@@ -1,7 +0,0 @@
1
- # -*- encoding: binary -*-
2
-
3
- config.cache_classes = false
4
- config.whiny_nils = true
5
- config.action_controller.consider_all_requests_local = true
6
- config.action_view.debug_rjs = true
7
- config.action_controller.perform_caching = false
@@ -1,6 +0,0 @@
1
- # -*- encoding: binary -*-
2
-
3
- config.cache_classes = true
4
- config.action_controller.consider_all_requests_local = false
5
- config.action_controller.perform_caching = true
6
- config.action_view.cache_template_loading = true
@@ -1,6 +0,0 @@
1
- # -*- encoding: binary -*-
2
-
3
- ActionController::Routing::Routes.draw do |map|
4
- map.connect ':controller/:action/:id'
5
- map.connect ':controller/:action/:id.:format'
6
- end
File without changes
@@ -1 +0,0 @@
1
- 404 Not Found
@@ -1 +0,0 @@
1
- 500 Internal Server Error
@@ -1 +0,0 @@
1
- HELLO