DRY setting of rack.multithread
[rainbows.git] / lib / rainbows / http_server.rb
blob6d61228cdcc101a37eced7c0481a33c1b19990a3
1 # -*- encoding: binary -*-
2 require 'rainbows'
3 module Rainbows
5   class HttpServer < ::Unicorn::HttpServer
6     include Rainbows
8     @@instance = nil
10     class << self
11       def setup(block)
12         @@instance.instance_eval(&block)
13       end
14     end
16     def initialize(app, options)
17       @@instance = self
18       rv = super(app, options)
19       defined?(@use) or use(:Base)
20       @worker_connections ||= MODEL_WORKER_CONNECTIONS[@use]
21     end
23     def use(*args)
24       model = args.shift or return @use
25       mod = begin
26         Rainbows.const_get(model)
27       rescue NameError
28         raise ArgumentError, "concurrency model #{model.inspect} not supported"
29       end
31       Module === mod or
32         raise ArgumentError, "concurrency model #{model.inspect} not supported"
33       extend(mod)
34       Const::RACK_DEFAULTS['rainbows.model'] = @use = model
35       Const::RACK_DEFAULTS['rack.multithread'] = !!(/Thread/ =~ model.to_s)
36     end
38     def worker_connections(*args)
39       return @worker_connections if args.empty?
40       nr = args.first
41       (Integer === nr && nr > 0) or
42         raise ArgumentError, "worker_connections must be a positive Integer"
43       @worker_connections = nr
44     end
46   end
48 end