rsense-server 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +23 -0
- data/Gemfile +14 -0
- data/Guardfile +5 -0
- data/LICENSE.txt +1 -0
- data/README.md +51 -0
- data/Rakefile +9 -0
- data/bin/_rsense.rb +115 -0
- data/config/puma.rb +2 -0
- data/lib/rsense/server/code.rb +38 -0
- data/lib/rsense/server/command/completion_result.rb +11 -0
- data/lib/rsense/server/command/special_meth.rb +18 -0
- data/lib/rsense/server/command/type_inference_method.rb +24 -0
- data/lib/rsense/server/command.rb +239 -0
- data/lib/rsense/server/config.rb +70 -0
- data/lib/rsense/server/gem_path.rb +18 -0
- data/lib/rsense/server/listeners/find_definition_event_listener.rb +91 -0
- data/lib/rsense/server/listeners/where_event_listener.rb +39 -0
- data/lib/rsense/server/load_path.rb +62 -0
- data/lib/rsense/server/options.rb +85 -0
- data/lib/rsense/server/parser.rb +17 -0
- data/lib/rsense/server/path_info.rb +17 -0
- data/lib/rsense/server/project.rb +24 -0
- data/lib/rsense/server/version.rb +5 -0
- data/lib/rsense/server.rb +18 -0
- data/rsense-server.gemspec +35 -0
- data/spec/fixtures/config_fixture/.rsense +4 -0
- data/spec/fixtures/deeply/nested/thing.rb +0 -0
- data/spec/fixtures/find_def_sample.json +10 -0
- data/spec/fixtures/sample.json +10 -0
- data/spec/fixtures/test_gem/.gitignore +22 -0
- data/spec/fixtures/test_gem/Gemfile +4 -0
- data/spec/fixtures/test_gem/LICENSE.txt +22 -0
- data/spec/fixtures/test_gem/README.md +29 -0
- data/spec/fixtures/test_gem/Rakefile +2 -0
- data/spec/fixtures/test_gem/lib/sample/version.rb +3 -0
- data/spec/fixtures/test_gem/lib/sample.rb +16 -0
- data/spec/fixtures/test_gem/sample.gemspec +23 -0
- data/spec/fixtures/test_gem/test.json +10 -0
- data/spec/rsense/server/code_spec.rb +44 -0
- data/spec/rsense/server/command/special_meth_spec.rb +23 -0
- data/spec/rsense/server/command_spec.rb +108 -0
- data/spec/rsense/server/config_spec.rb +27 -0
- data/spec/rsense/server/gem_path_spec.rb +16 -0
- data/spec/rsense/server/load_path_spec.rb +63 -0
- data/spec/rsense/server/options_spec.rb +33 -0
- data/spec/rsense/server/path_info_spec.rb +11 -0
- data/spec/rsense/server/project_spec.rb +18 -0
- data/spec/rsense/server_spec.rb +7 -0
- data/spec/spec_helper.rb +16 -0
- data/vendor/gems/puma-2.8.2-java/COPYING +55 -0
- data/vendor/gems/puma-2.8.2-java/DEPLOYMENT.md +92 -0
- data/vendor/gems/puma-2.8.2-java/Gemfile +17 -0
- data/vendor/gems/puma-2.8.2-java/History.txt +532 -0
- data/vendor/gems/puma-2.8.2-java/LICENSE +26 -0
- data/vendor/gems/puma-2.8.2-java/Manifest.txt +68 -0
- data/vendor/gems/puma-2.8.2-java/README.md +251 -0
- data/vendor/gems/puma-2.8.2-java/Rakefile +158 -0
- data/vendor/gems/puma-2.8.2-java/bin/puma +10 -0
- data/vendor/gems/puma-2.8.2-java/bin/puma-wild +17 -0
- data/vendor/gems/puma-2.8.2-java/bin/pumactl +12 -0
- data/vendor/gems/puma-2.8.2-java/docs/config.md +0 -0
- data/vendor/gems/puma-2.8.2-java/docs/nginx.md +80 -0
- data/vendor/gems/puma-2.8.2-java/docs/signals.md +42 -0
- data/vendor/gems/puma-2.8.2-java/ext/puma_http11/PumaHttp11Service.java +17 -0
- data/vendor/gems/puma-2.8.2-java/ext/puma_http11/ext_help.h +15 -0
- data/vendor/gems/puma-2.8.2-java/ext/puma_http11/extconf.rb +8 -0
- data/vendor/gems/puma-2.8.2-java/ext/puma_http11/http11_parser.c +1225 -0
- data/vendor/gems/puma-2.8.2-java/ext/puma_http11/http11_parser.h +64 -0
- data/vendor/gems/puma-2.8.2-java/ext/puma_http11/http11_parser.java.rl +161 -0
- data/vendor/gems/puma-2.8.2-java/ext/puma_http11/http11_parser.rl +146 -0
- data/vendor/gems/puma-2.8.2-java/ext/puma_http11/http11_parser_common.rl +54 -0
- data/vendor/gems/puma-2.8.2-java/ext/puma_http11/io_buffer.c +155 -0
- data/vendor/gems/puma-2.8.2-java/ext/puma_http11/mini_ssl.c +195 -0
- data/vendor/gems/puma-2.8.2-java/ext/puma_http11/org/jruby/puma/Http11.java +225 -0
- data/vendor/gems/puma-2.8.2-java/ext/puma_http11/org/jruby/puma/Http11Parser.java +488 -0
- data/vendor/gems/puma-2.8.2-java/ext/puma_http11/org/jruby/puma/MiniSSL.java +289 -0
- data/vendor/gems/puma-2.8.2-java/ext/puma_http11/puma_http11.c +491 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/accept_nonblock.rb +23 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/app/status.rb +59 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/binder.rb +298 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/capistrano.rb +86 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/cli.rb +587 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/client.rb +289 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/cluster.rb +389 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/compat.rb +18 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/configuration.rb +377 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/const.rb +165 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/control_cli.rb +251 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/daemon_ext.rb +25 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/delegation.rb +11 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/detect.rb +4 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/events.rb +130 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/io_buffer.rb +7 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/java_io_buffer.rb +45 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/jruby_restart.rb +83 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/minissl.rb +148 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/null_io.rb +34 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/puma_http11.jar +0 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/rack_default.rb +7 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/rack_patch.rb +45 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/reactor.rb +183 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/runner.rb +146 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/server.rb +801 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/single.rb +102 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/tcp_logger.rb +32 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/thread_pool.rb +185 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma/util.rb +9 -0
- data/vendor/gems/puma-2.8.2-java/lib/puma.rb +14 -0
- data/vendor/gems/puma-2.8.2-java/lib/rack/handler/puma.rb +66 -0
- data/vendor/gems/puma-2.8.2-java/puma.gemspec +55 -0
- data/vendor/gems/puma-2.8.2-java/test/test_app_status.rb +92 -0
- data/vendor/gems/puma-2.8.2-java/test/test_cli.rb +173 -0
- data/vendor/gems/puma-2.8.2-java/test/test_config.rb +26 -0
- data/vendor/gems/puma-2.8.2-java/test/test_http10.rb +27 -0
- data/vendor/gems/puma-2.8.2-java/test/test_http11.rb +144 -0
- data/vendor/gems/puma-2.8.2-java/test/test_integration.rb +165 -0
- data/vendor/gems/puma-2.8.2-java/test/test_iobuffer.rb +38 -0
- data/vendor/gems/puma-2.8.2-java/test/test_minissl.rb +25 -0
- data/vendor/gems/puma-2.8.2-java/test/test_null_io.rb +31 -0
- data/vendor/gems/puma-2.8.2-java/test/test_persistent.rb +238 -0
- data/vendor/gems/puma-2.8.2-java/test/test_puma_server.rb +323 -0
- data/vendor/gems/puma-2.8.2-java/test/test_rack_handler.rb +10 -0
- data/vendor/gems/puma-2.8.2-java/test/test_rack_server.rb +141 -0
- data/vendor/gems/puma-2.8.2-java/test/test_tcp_rack.rb +42 -0
- data/vendor/gems/puma-2.8.2-java/test/test_thread_pool.rb +156 -0
- data/vendor/gems/puma-2.8.2-java/test/test_unix_socket.rb +39 -0
- data/vendor/gems/puma-2.8.2-java/test/test_ws.rb +89 -0
- data/vendor/gems/puma-2.8.2-java/tools/jungle/README.md +9 -0
- data/vendor/gems/puma-2.8.2-java/tools/jungle/init.d/README.md +54 -0
- data/vendor/gems/puma-2.8.2-java/tools/jungle/init.d/puma +332 -0
- data/vendor/gems/puma-2.8.2-java/tools/jungle/init.d/run-puma +3 -0
- data/vendor/gems/puma-2.8.2-java/tools/jungle/upstart/README.md +61 -0
- data/vendor/gems/puma-2.8.2-java/tools/jungle/upstart/puma-manager.conf +31 -0
- data/vendor/gems/puma-2.8.2-java/tools/jungle/upstart/puma.conf +63 -0
- data/vendor/gems/puma-2.8.2-java/tools/trickletest.rb +45 -0
- metadata +389 -0
@@ -0,0 +1,34 @@
|
|
1
|
+
module Puma
|
2
|
+
|
3
|
+
# Provides an IO-like object that always appears to contain no data.
|
4
|
+
# Used as the value for rack.input when the request has no body.
|
5
|
+
#
|
6
|
+
class NullIO
|
7
|
+
# Always returns nil
|
8
|
+
#
|
9
|
+
def gets
|
10
|
+
nil
|
11
|
+
end
|
12
|
+
|
13
|
+
# Never yields
|
14
|
+
#
|
15
|
+
def each
|
16
|
+
end
|
17
|
+
|
18
|
+
# Mimics IO#read with no data
|
19
|
+
#
|
20
|
+
def read(count=nil,buffer=nil)
|
21
|
+
(count && count > 0) ? nil : ""
|
22
|
+
end
|
23
|
+
|
24
|
+
# Does nothing
|
25
|
+
#
|
26
|
+
def rewind
|
27
|
+
end
|
28
|
+
|
29
|
+
# Does nothing
|
30
|
+
#
|
31
|
+
def close
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
Binary file
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'rack/commonlogger'
|
2
|
+
|
3
|
+
module Rack
|
4
|
+
# Patch CommonLogger to use after_reply.
|
5
|
+
#
|
6
|
+
# Simply request this file and CommonLogger will be a bit more
|
7
|
+
# efficient.
|
8
|
+
class CommonLogger
|
9
|
+
remove_method :call
|
10
|
+
|
11
|
+
def call(env)
|
12
|
+
began_at = Time.now
|
13
|
+
status, header, body = @app.call(env)
|
14
|
+
header = Utils::HeaderHash.new(header)
|
15
|
+
|
16
|
+
# If we've been hijacked, then output a special line
|
17
|
+
if env['rack.hijack_io']
|
18
|
+
log_hijacking(env, 'HIJACK', header, began_at)
|
19
|
+
elsif ary = env['rack.after_reply']
|
20
|
+
ary << lambda { log(env, status, header, began_at) }
|
21
|
+
else
|
22
|
+
body = BodyProxy.new(body) { log(env, status, header, began_at) }
|
23
|
+
end
|
24
|
+
|
25
|
+
[status, header, body]
|
26
|
+
end
|
27
|
+
|
28
|
+
HIJACK_FORMAT = %{%s - %s [%s] "%s %s%s %s" HIJACKED -1 %0.4f\n}
|
29
|
+
|
30
|
+
def log_hijacking(env, status, header, began_at)
|
31
|
+
now = Time.now
|
32
|
+
|
33
|
+
logger = @logger || env['rack.errors']
|
34
|
+
logger.write HIJACK_FORMAT % [
|
35
|
+
env['HTTP_X_FORWARDED_FOR'] || env["REMOTE_ADDR"] || "-",
|
36
|
+
env["REMOTE_USER"] || "-",
|
37
|
+
now.strftime("%d/%b/%Y %H:%M:%S"),
|
38
|
+
env["REQUEST_METHOD"],
|
39
|
+
env["PATH_INFO"],
|
40
|
+
env["QUERY_STRING"].empty? ? "" : "?"+env["QUERY_STRING"],
|
41
|
+
env["HTTP_VERSION"],
|
42
|
+
now - began_at ]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,183 @@
|
|
1
|
+
require 'puma/util'
|
2
|
+
|
3
|
+
module Puma
|
4
|
+
class Reactor
|
5
|
+
DefaultSleepFor = 5
|
6
|
+
|
7
|
+
def initialize(server, app_pool)
|
8
|
+
@server = server
|
9
|
+
@events = server.events
|
10
|
+
@app_pool = app_pool
|
11
|
+
|
12
|
+
@mutex = Mutex.new
|
13
|
+
@ready, @trigger = Puma::Util.pipe
|
14
|
+
@input = []
|
15
|
+
@sleep_for = DefaultSleepFor
|
16
|
+
@timeouts = []
|
17
|
+
|
18
|
+
@sockets = [@ready]
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def run_internal
|
24
|
+
sockets = @sockets
|
25
|
+
|
26
|
+
while true
|
27
|
+
begin
|
28
|
+
ready = IO.select sockets, nil, nil, @sleep_for
|
29
|
+
rescue IOError => e
|
30
|
+
if sockets.any? { |socket| socket.closed? }
|
31
|
+
STDERR.puts "Error in select: #{e.message} (#{e.class})"
|
32
|
+
STDERR.puts e.backtrace
|
33
|
+
sockets = sockets.reject { |socket| socket.closed? }
|
34
|
+
retry
|
35
|
+
else
|
36
|
+
raise
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
if ready and reads = ready[0]
|
41
|
+
reads.each do |c|
|
42
|
+
if c == @ready
|
43
|
+
@mutex.synchronize do
|
44
|
+
case @ready.read(1)
|
45
|
+
when "*"
|
46
|
+
sockets += @input
|
47
|
+
@input.clear
|
48
|
+
when "c"
|
49
|
+
sockets.delete_if do |s|
|
50
|
+
if s == @ready
|
51
|
+
false
|
52
|
+
else
|
53
|
+
s.close
|
54
|
+
true
|
55
|
+
end
|
56
|
+
end
|
57
|
+
when "!"
|
58
|
+
return
|
59
|
+
end
|
60
|
+
end
|
61
|
+
else
|
62
|
+
# We have to be sure to remove it from the timeout
|
63
|
+
# list or we'll accidentally close the socket when
|
64
|
+
# it's in use!
|
65
|
+
if c.timeout_at
|
66
|
+
@mutex.synchronize do
|
67
|
+
@timeouts.delete c
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
begin
|
72
|
+
if c.try_to_finish
|
73
|
+
@app_pool << c
|
74
|
+
sockets.delete c
|
75
|
+
end
|
76
|
+
|
77
|
+
# The client doesn't know HTTP well
|
78
|
+
rescue HttpParserError => e
|
79
|
+
c.write_400
|
80
|
+
c.close
|
81
|
+
|
82
|
+
sockets.delete c
|
83
|
+
|
84
|
+
@events.parse_error @server, c.env, e
|
85
|
+
rescue StandardError => e
|
86
|
+
c.write_500
|
87
|
+
c.close
|
88
|
+
|
89
|
+
sockets.delete c
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
unless @timeouts.empty?
|
96
|
+
@mutex.synchronize do
|
97
|
+
now = Time.now
|
98
|
+
|
99
|
+
while @timeouts.first.timeout_at < now
|
100
|
+
c = @timeouts.shift
|
101
|
+
c.write_408 if c.in_data_phase
|
102
|
+
c.close
|
103
|
+
sockets.delete c
|
104
|
+
|
105
|
+
break if @timeouts.empty?
|
106
|
+
end
|
107
|
+
|
108
|
+
calculate_sleep
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
public
|
115
|
+
|
116
|
+
def run
|
117
|
+
run_internal
|
118
|
+
ensure
|
119
|
+
@trigger.close
|
120
|
+
@ready.close
|
121
|
+
end
|
122
|
+
|
123
|
+
def run_in_thread
|
124
|
+
@thread = Thread.new do
|
125
|
+
begin
|
126
|
+
run_internal
|
127
|
+
rescue StandardError => e
|
128
|
+
STDERR.puts "Error in reactor loop escaped: #{e.message} (#{e.class})"
|
129
|
+
STDERR.puts e.backtrace
|
130
|
+
retry
|
131
|
+
ensure
|
132
|
+
@trigger.close
|
133
|
+
@ready.close
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def calculate_sleep
|
139
|
+
if @timeouts.empty?
|
140
|
+
@sleep_for = DefaultSleepFor
|
141
|
+
else
|
142
|
+
diff = @timeouts.first.timeout_at.to_f - Time.now.to_f
|
143
|
+
|
144
|
+
if diff < 0.0
|
145
|
+
@sleep_for = 0
|
146
|
+
else
|
147
|
+
@sleep_for = diff
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
def add(c)
|
153
|
+
@mutex.synchronize do
|
154
|
+
@input << c
|
155
|
+
@trigger << "*"
|
156
|
+
|
157
|
+
if c.timeout_at
|
158
|
+
@timeouts << c
|
159
|
+
@timeouts.sort! { |a,b| a.timeout_at <=> b.timeout_at }
|
160
|
+
|
161
|
+
calculate_sleep
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
# Close all watched sockets and clear them from being watched
|
167
|
+
def clear!
|
168
|
+
begin
|
169
|
+
@trigger << "c"
|
170
|
+
rescue IOError
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
def shutdown
|
175
|
+
begin
|
176
|
+
@trigger << "!"
|
177
|
+
rescue IOError
|
178
|
+
end
|
179
|
+
|
180
|
+
@thread.join
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
@@ -0,0 +1,146 @@
|
|
1
|
+
module Puma
|
2
|
+
class Runner
|
3
|
+
def initialize(cli)
|
4
|
+
@cli = cli
|
5
|
+
@options = cli.options
|
6
|
+
@app = nil
|
7
|
+
@control = nil
|
8
|
+
end
|
9
|
+
|
10
|
+
def daemon?
|
11
|
+
@options[:daemon]
|
12
|
+
end
|
13
|
+
|
14
|
+
def development?
|
15
|
+
@options[:environment] == "development"
|
16
|
+
end
|
17
|
+
|
18
|
+
def log(str)
|
19
|
+
@cli.log str
|
20
|
+
end
|
21
|
+
|
22
|
+
def error(str)
|
23
|
+
@cli.error str
|
24
|
+
end
|
25
|
+
|
26
|
+
def before_restart
|
27
|
+
@control.stop(true) if @control
|
28
|
+
end
|
29
|
+
|
30
|
+
def start_control
|
31
|
+
str = @options[:control_url]
|
32
|
+
return unless str
|
33
|
+
|
34
|
+
require 'puma/app/status'
|
35
|
+
|
36
|
+
uri = URI.parse str
|
37
|
+
|
38
|
+
app = Puma::App::Status.new @cli
|
39
|
+
|
40
|
+
if token = @options[:control_auth_token]
|
41
|
+
app.auth_token = token unless token.empty? or token == :none
|
42
|
+
end
|
43
|
+
|
44
|
+
control = Puma::Server.new app, @cli.events
|
45
|
+
control.min_threads = 0
|
46
|
+
control.max_threads = 1
|
47
|
+
|
48
|
+
case uri.scheme
|
49
|
+
when "tcp"
|
50
|
+
log "* Starting control server on #{str}"
|
51
|
+
control.add_tcp_listener uri.host, uri.port
|
52
|
+
when "unix"
|
53
|
+
log "* Starting control server on #{str}"
|
54
|
+
path = "#{uri.host}#{uri.path}"
|
55
|
+
|
56
|
+
control.add_unix_listener path
|
57
|
+
else
|
58
|
+
error "Invalid control URI: #{str}"
|
59
|
+
end
|
60
|
+
|
61
|
+
control.run
|
62
|
+
@control = control
|
63
|
+
end
|
64
|
+
|
65
|
+
def ruby_engine
|
66
|
+
if !defined?(RUBY_ENGINE) || RUBY_ENGINE == "ruby"
|
67
|
+
"ruby #{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}"
|
68
|
+
else
|
69
|
+
"#{RUBY_ENGINE} #{RUBY_VERSION}"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def output_header(mode)
|
74
|
+
min_t = @options[:min_threads]
|
75
|
+
max_t = @options[:max_threads]
|
76
|
+
|
77
|
+
log "Puma starting in #{mode} mode..."
|
78
|
+
log "* Version #{Puma::Const::PUMA_VERSION} (#{ruby_engine}), codename: #{Puma::Const::CODE_NAME}"
|
79
|
+
log "* Min threads: #{min_t}, max threads: #{max_t}"
|
80
|
+
log "* Environment: #{ENV['RACK_ENV']}"
|
81
|
+
|
82
|
+
if @options[:mode] == :tcp
|
83
|
+
log "* Mode: Lopez Express (tcp)"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def redirect_io
|
88
|
+
stdout = @options[:redirect_stdout]
|
89
|
+
stderr = @options[:redirect_stderr]
|
90
|
+
append = @options[:redirect_append]
|
91
|
+
|
92
|
+
if stdout
|
93
|
+
STDOUT.reopen stdout, (append ? "a" : "w")
|
94
|
+
STDOUT.sync = true
|
95
|
+
STDOUT.puts "=== puma startup: #{Time.now} ==="
|
96
|
+
end
|
97
|
+
|
98
|
+
if stderr
|
99
|
+
STDERR.reopen stderr, (append ? "a" : "w")
|
100
|
+
STDERR.sync = true
|
101
|
+
STDERR.puts "=== puma startup: #{Time.now} ==="
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def load_and_bind
|
106
|
+
unless @cli.config.app_configured?
|
107
|
+
error "No application configured, nothing to run"
|
108
|
+
exit 1
|
109
|
+
end
|
110
|
+
|
111
|
+
# Load the app before we daemonize.
|
112
|
+
begin
|
113
|
+
@app = @cli.config.app
|
114
|
+
rescue Exception => e
|
115
|
+
log "! Unable to load application"
|
116
|
+
raise e
|
117
|
+
end
|
118
|
+
|
119
|
+
@cli.binder.parse @options[:binds], self
|
120
|
+
end
|
121
|
+
|
122
|
+
def app
|
123
|
+
@app ||= @cli.config.app
|
124
|
+
end
|
125
|
+
|
126
|
+
def start_server
|
127
|
+
min_t = @options[:min_threads]
|
128
|
+
max_t = @options[:max_threads]
|
129
|
+
|
130
|
+
server = Puma::Server.new app, @cli.events, @options
|
131
|
+
server.min_threads = min_t
|
132
|
+
server.max_threads = max_t
|
133
|
+
server.inherit_binder @cli.binder
|
134
|
+
|
135
|
+
if @options[:mode] == :tcp
|
136
|
+
server.tcp_mode!
|
137
|
+
end
|
138
|
+
|
139
|
+
unless development?
|
140
|
+
server.leak_stack_on_error = false
|
141
|
+
end
|
142
|
+
|
143
|
+
server
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|