puma 2.2.0 → 8.0.2

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 (136) hide show
  1. checksums.yaml +7 -0
  2. data/History.md +3334 -0
  3. data/LICENSE +23 -20
  4. data/README.md +387 -100
  5. data/bin/puma-wild +25 -0
  6. data/bin/pumactl +1 -1
  7. data/docs/5.0-Upgrade.md +98 -0
  8. data/docs/6.0-Upgrade.md +56 -0
  9. data/docs/7.0-Upgrade.md +52 -0
  10. data/docs/8.0-Upgrade.md +100 -0
  11. data/docs/architecture.md +74 -0
  12. data/docs/compile_options.md +55 -0
  13. data/docs/deployment.md +137 -0
  14. data/docs/fork_worker.md +41 -0
  15. data/docs/grpc.md +62 -0
  16. data/docs/images/favicon.svg +1 -0
  17. data/docs/images/puma-connection-flow-no-reactor.png +0 -0
  18. data/docs/images/puma-connection-flow.png +0 -0
  19. data/docs/images/puma-general-arch.png +0 -0
  20. data/docs/images/running-puma.svg +1 -0
  21. data/docs/images/standard-logo.svg +1 -0
  22. data/docs/java_options.md +54 -0
  23. data/docs/jungle/README.md +9 -0
  24. data/docs/jungle/rc.d/README.md +74 -0
  25. data/docs/jungle/rc.d/puma +61 -0
  26. data/docs/jungle/rc.d/puma.conf +10 -0
  27. data/docs/kubernetes.md +73 -0
  28. data/docs/nginx.md +5 -5
  29. data/docs/plugins.md +42 -0
  30. data/docs/rails_dev_mode.md +28 -0
  31. data/docs/restart.md +65 -0
  32. data/docs/signals.md +98 -0
  33. data/docs/stats.md +148 -0
  34. data/docs/systemd.md +253 -0
  35. data/docs/testing_benchmarks_local_files.md +150 -0
  36. data/docs/testing_test_rackup_ci_files.md +36 -0
  37. data/ext/puma_http11/PumaHttp11Service.java +2 -2
  38. data/ext/puma_http11/extconf.rb +59 -2
  39. data/ext/puma_http11/http11_parser.c +319 -487
  40. data/ext/puma_http11/http11_parser.h +15 -13
  41. data/ext/puma_http11/http11_parser.java.rl +64 -94
  42. data/ext/puma_http11/http11_parser.rl +27 -24
  43. data/ext/puma_http11/http11_parser_common.rl +8 -8
  44. data/ext/puma_http11/mini_ssl.c +696 -38
  45. data/ext/puma_http11/no_ssl/PumaHttp11Service.java +15 -0
  46. data/ext/puma_http11/org/jruby/puma/EnvKey.java +241 -0
  47. data/ext/puma_http11/org/jruby/puma/Http11.java +241 -145
  48. data/ext/puma_http11/org/jruby/puma/Http11Parser.java +174 -221
  49. data/ext/puma_http11/org/jruby/puma/MiniSSL.java +413 -193
  50. data/ext/puma_http11/puma_http11.c +183 -175
  51. data/lib/puma/app/status.rb +77 -29
  52. data/lib/puma/binder.rb +349 -119
  53. data/lib/puma/cli.rb +163 -801
  54. data/lib/puma/client.rb +627 -144
  55. data/lib/puma/client_env.rb +171 -0
  56. data/lib/puma/cluster/worker.rb +183 -0
  57. data/lib/puma/cluster/worker_handle.rb +127 -0
  58. data/lib/puma/cluster.rb +634 -0
  59. data/lib/puma/cluster_accept_loop_delay.rb +91 -0
  60. data/lib/puma/commonlogger.rb +115 -0
  61. data/lib/puma/configuration.rb +420 -198
  62. data/lib/puma/const.rb +266 -115
  63. data/lib/puma/control_cli.rb +219 -120
  64. data/lib/puma/detect.rb +56 -2
  65. data/lib/puma/dsl.rb +1562 -0
  66. data/lib/puma/error_logger.rb +115 -0
  67. data/lib/puma/events.rb +44 -60
  68. data/lib/puma/io_buffer.rb +48 -5
  69. data/lib/puma/jruby_restart.rb +2 -51
  70. data/lib/puma/json_serialization.rb +96 -0
  71. data/lib/puma/launcher/bundle_pruner.rb +102 -0
  72. data/lib/puma/launcher.rb +501 -0
  73. data/lib/puma/log_writer.rb +153 -0
  74. data/lib/puma/minissl/context_builder.rb +96 -0
  75. data/lib/puma/minissl.rb +355 -37
  76. data/lib/puma/null_io.rb +79 -12
  77. data/lib/puma/plugin/systemd.rb +90 -0
  78. data/lib/puma/plugin/tmp_restart.rb +36 -0
  79. data/lib/puma/plugin.rb +111 -0
  80. data/lib/puma/rack/builder.rb +297 -0
  81. data/lib/puma/rack/urlmap.rb +93 -0
  82. data/lib/puma/rack_default.rb +21 -4
  83. data/lib/puma/reactor.rb +102 -133
  84. data/lib/puma/response.rb +532 -0
  85. data/lib/puma/runner.rb +211 -0
  86. data/lib/puma/sd_notify.rb +146 -0
  87. data/lib/puma/server.rb +582 -445
  88. data/lib/puma/server_plugin_control.rb +32 -0
  89. data/lib/puma/single.rb +72 -0
  90. data/lib/puma/state_file.rb +69 -0
  91. data/lib/puma/thread_pool.rb +389 -57
  92. data/lib/puma/util.rb +125 -0
  93. data/lib/puma.rb +80 -6
  94. data/lib/rack/handler/puma.rb +125 -47
  95. data/tools/Dockerfile +26 -0
  96. data/tools/trickletest.rb +44 -0
  97. metadata +88 -148
  98. data/COPYING +0 -55
  99. data/Gemfile +0 -10
  100. data/History.txt +0 -302
  101. data/Manifest.txt +0 -60
  102. data/Rakefile +0 -165
  103. data/TODO +0 -5
  104. data/docs/config.md +0 -0
  105. data/ext/puma_http11/ext_help.h +0 -15
  106. data/ext/puma_http11/io_buffer.c +0 -154
  107. data/lib/puma/accept_nonblock.rb +0 -23
  108. data/lib/puma/capistrano.rb +0 -34
  109. data/lib/puma/compat.rb +0 -11
  110. data/lib/puma/daemon_ext.rb +0 -20
  111. data/lib/puma/delegation.rb +0 -11
  112. data/lib/puma/java_io_buffer.rb +0 -45
  113. data/lib/puma/rack_patch.rb +0 -25
  114. data/puma.gemspec +0 -45
  115. data/test/test_app_status.rb +0 -88
  116. data/test/test_cli.rb +0 -171
  117. data/test/test_config.rb +0 -16
  118. data/test/test_http10.rb +0 -27
  119. data/test/test_http11.rb +0 -126
  120. data/test/test_integration.rb +0 -154
  121. data/test/test_iobuffer.rb +0 -38
  122. data/test/test_minissl.rb +0 -25
  123. data/test/test_null_io.rb +0 -31
  124. data/test/test_persistent.rb +0 -238
  125. data/test/test_puma_server.rb +0 -224
  126. data/test/test_rack_handler.rb +0 -10
  127. data/test/test_rack_server.rb +0 -141
  128. data/test/test_thread_pool.rb +0 -146
  129. data/test/test_unix_socket.rb +0 -39
  130. data/test/test_ws.rb +0 -89
  131. data/tools/jungle/init.d/README.md +0 -54
  132. data/tools/jungle/init.d/puma +0 -332
  133. data/tools/jungle/init.d/run-puma +0 -3
  134. data/tools/jungle/upstart/README.md +0 -61
  135. data/tools/jungle/upstart/puma-manager.conf +0 -31
  136. data/tools/jungle/upstart/puma.conf +0 -52
@@ -1,55 +1,103 @@
1
+ # frozen_string_literal: true
2
+ require_relative '../json_serialization'
3
+
1
4
  module Puma
2
5
  module App
6
+ # Check out {#call}'s source code to see what actions this web application
7
+ # can respond to.
3
8
  class Status
4
- def initialize(server, cli)
5
- @server = server
6
- @cli = cli
7
- @auth_token = nil
8
- end
9
9
  OK_STATUS = '{ "status": "ok" }'.freeze
10
+ READ_ONLY_COMMANDS = %w[gc-stats stats].freeze
10
11
 
11
- attr_accessor :auth_token
12
-
13
- def authenticate(env)
14
- return true unless @auth_token
15
- env['QUERY_STRING'].to_s.split(/&;/).include?("token=#{@auth_token}")
12
+ # @param launcher [::Puma::Launcher]
13
+ # @param token [String, nil] the token used for authentication
14
+ # @param data_only [Boolean] if true, restrict to read-only data commands
15
+ #
16
+ def initialize(launcher, token: nil, data_only: false)
17
+ @launcher = launcher
18
+ @auth_token = token
19
+ @enabled_commands = READ_ONLY_COMMANDS if data_only
16
20
  end
17
21
 
22
+ # most commands call methods in `::Puma::Launcher` based on command in
23
+ # `env['PATH_INFO']`
18
24
  def call(env)
19
25
  unless authenticate(env)
20
26
  return rack_response(403, 'Invalid auth token', 'text/plain')
21
27
  end
22
28
 
23
- case env['PATH_INFO']
24
- when /\/stop$/
25
- @server.stop
26
- return rack_response(200, OK_STATUS)
29
+ # resp_type is processed by following case statement, return
30
+ # is a number (status) or a string used as the body of a 200 response
31
+ command = env['PATH_INFO'][/\/([^\/]+)$/, 1]
32
+ if @enabled_commands && !@enabled_commands.include?(command)
33
+ return rack_response(404, "Command #{command.inspect} unavailable", 'text/plain')
34
+ end
35
+
36
+ resp_type =
37
+ case command
38
+ when 'stop'
39
+ @launcher.stop ; 200
40
+
41
+ when 'halt'
42
+ @launcher.halt ; 200
43
+
44
+ when 'restart'
45
+ @launcher.restart ; 200
46
+
47
+ when 'phased-restart'
48
+ @launcher.phased_restart ? 200 : 404
49
+
50
+ when 'refork'
51
+ @launcher.refork ? 200 : 404
27
52
 
28
- when /\/halt$/
29
- @server.halt
30
- return rack_response(200, OK_STATUS)
53
+ when 'reload-worker-directory'
54
+ @launcher.send(:reload_worker_directory) ? 200 : 404
31
55
 
32
- when /\/restart$/
33
- if @cli and @cli.restart_on_stop!
34
- @server.begin_restart
56
+ when 'gc'
57
+ GC.start ; 200
58
+
59
+ when 'gc-stats'
60
+ Puma::JSONSerialization.generate GC.stat
61
+
62
+ when 'stats'
63
+ Puma::JSONSerialization.generate @launcher.stats
64
+
65
+ when 'thread-backtraces'
66
+ backtraces = []
67
+ @launcher.thread_status do |name, backtrace|
68
+ backtraces << { name: name, backtrace: backtrace }
69
+ end
70
+ Puma::JSONSerialization.generate backtraces
35
71
 
36
- return rack_response(200, OK_STATUS)
37
72
  else
38
- return rack_response(200, '{ "status": "not configured" }')
73
+ return rack_response(404, "Unsupported action", 'text/plain')
39
74
  end
40
75
 
41
- when /\/stats$/
42
- b = @server.backlog
43
- r = @server.running
44
- return rack_response(200, %Q!{ "backlog": #{b}, "running": #{r} }!)
76
+ case resp_type
77
+ when String
78
+ rack_response 200, resp_type
79
+ when 200
80
+ rack_response 200, OK_STATUS
81
+ when 404
82
+ str = env['PATH_INFO'][/\/(\S+)/, 1].tr '-', '_'
83
+ rack_response 404, "{ \"error\": \"#{str} not available\" }"
45
84
  end
46
-
47
- rack_response 404, "Unsupported action", 'text/plain'
48
85
  end
49
86
 
50
87
  private
88
+
89
+ def authenticate(env)
90
+ return true unless @auth_token
91
+ env['QUERY_STRING'].to_s.split(/[&;]/).include? "token=#{@auth_token}"
92
+ end
93
+
51
94
  def rack_response(status, body, content_type='application/json')
52
- [status, { 'Content-Type' => content_type, 'Content-Length' => body.bytesize.to_s }, [body]]
95
+ headers = {
96
+ 'content-type' => content_type,
97
+ 'content-length' => body.bytesize.to_s
98
+ }
99
+
100
+ [status, headers, [body]]
53
101
  end
54
102
  end
55
103
  end