rsense-server 0.5.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.
- 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
|