1 # -*- encoding: binary -*-
4 class Rainbows::HttpServer < Unicorn::HttpServer
8 G.server.instance_eval(&block)
11 def initialize(app, options)
13 @logger = Unicorn::Configurator::DEFAULTS[:logger]
14 rv = super(app, options)
15 defined?(@use) or use(:Base)
16 @worker_connections ||= Rainbows::MODEL_WORKER_CONNECTIONS[@use]
19 def reopen_worker_logs(worker_nr)
20 logger.info "worker=#{worker_nr} reopening logs..."
21 Unicorn::Util.reopen_logs
22 logger.info "worker=#{worker_nr} done reopening logs"
24 G.quit! # let the master reopen and refork us
27 # Add one second to the timeout since our fchmod heartbeat is less
28 # precise (and must be more conservative) than Unicorn does. We
29 # handle many clients per process and can't chmod on every
30 # connection we accept without wasting cycles. That added to the
31 # fact that we let clients keep idle connections open for long
32 # periods of time means we have to chmod at a fixed interval.
40 Rainbows.max_bytes = 1024 * 1024
41 @worker_connections = nil
43 @worker_connections ||= Rainbows::MODEL_WORKER_CONNECTIONS[@use]
47 # hacky hook got force Rainbows! to load modules only in workers
48 if @master_pid && @master_pid == Process.ppid
49 extend(Rainbows.const_get(@use))
55 model = args.shift or return @use
57 Rainbows.const_get(model)
59 logger.error "error loading #{model.inspect}: #{e}"
60 e.backtrace.each { |l| logger.error l }
61 raise ArgumentError, "concurrency model #{model.inspect} not supported"
65 raise ArgumentError, "concurrency model #{model.inspect} not supported"
68 when Hash; O.update(opt)
69 when Symbol; O[opt] = true
70 else; raise ArgumentError, "can't handle option: #{opt.inspect}"
73 mod.setup if mod.respond_to?(:setup)
75 'rainbows.model' => (@use = model.to_sym),
76 'rack.multithread' => !!(model.to_s =~ /Thread/),
77 'rainbows.autochunk' => [:Coolio,:Rev,
78 :EventMachine,:NeverBlock].include?(@use),
80 Rainbows::Const::RACK_DEFAULTS.update(new_defaults)
83 def worker_connections(*args)
84 return @worker_connections if args.empty?
86 (Integer === nr && nr > 0) or
87 raise ArgumentError, "worker_connections must be a positive Integer"
88 @worker_connections = nr
91 def keepalive_timeout(nr)
92 (Integer === nr && nr >= 0) or
93 raise ArgumentError, "keepalive_timeout must be a non-negative Integer"
97 def keepalive_requests(nr)
99 raise ArgumentError, "keepalive_requests must be a non-negative Integer"
100 Unicorn::HttpRequest.keepalive_requests = nr
103 def client_max_body_size(nr)
104 err = "client_max_body_size must be nil or a non-negative Integer"
108 nr >= 0 or raise ArgumentError, err
110 raise ArgumentError, err
112 Rainbows.max_bytes = nr