puma 3.11.4 → 6.0.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puma might be problematic. Click here for more details.

Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +1717 -432
  3. data/LICENSE +23 -20
  4. data/README.md +190 -64
  5. data/bin/puma-wild +3 -9
  6. data/docs/architecture.md +59 -21
  7. data/docs/compile_options.md +55 -0
  8. data/docs/deployment.md +69 -58
  9. data/docs/fork_worker.md +31 -0
  10. data/docs/images/puma-connection-flow-no-reactor.png +0 -0
  11. data/docs/images/puma-connection-flow.png +0 -0
  12. data/docs/images/puma-general-arch.png +0 -0
  13. data/docs/jungle/README.md +9 -0
  14. data/{tools → docs}/jungle/rc.d/README.md +1 -1
  15. data/{tools → docs}/jungle/rc.d/puma +2 -2
  16. data/{tools → docs}/jungle/rc.d/puma.conf +0 -0
  17. data/docs/kubernetes.md +66 -0
  18. data/docs/nginx.md +2 -2
  19. data/docs/plugins.md +22 -12
  20. data/docs/rails_dev_mode.md +28 -0
  21. data/docs/restart.md +47 -22
  22. data/docs/signals.md +13 -11
  23. data/docs/stats.md +142 -0
  24. data/docs/systemd.md +95 -120
  25. data/docs/testing_benchmarks_local_files.md +150 -0
  26. data/docs/testing_test_rackup_ci_files.md +36 -0
  27. data/ext/puma_http11/PumaHttp11Service.java +2 -2
  28. data/ext/puma_http11/ext_help.h +1 -1
  29. data/ext/puma_http11/extconf.rb +61 -3
  30. data/ext/puma_http11/http11_parser.c +106 -118
  31. data/ext/puma_http11/http11_parser.h +2 -2
  32. data/ext/puma_http11/http11_parser.java.rl +22 -38
  33. data/ext/puma_http11/http11_parser.rl +6 -4
  34. data/ext/puma_http11/http11_parser_common.rl +6 -6
  35. data/ext/puma_http11/mini_ssl.c +376 -93
  36. data/ext/puma_http11/no_ssl/PumaHttp11Service.java +15 -0
  37. data/ext/puma_http11/org/jruby/puma/Http11.java +108 -116
  38. data/ext/puma_http11/org/jruby/puma/Http11Parser.java +84 -99
  39. data/ext/puma_http11/org/jruby/puma/MiniSSL.java +250 -88
  40. data/ext/puma_http11/puma_http11.c +49 -57
  41. data/lib/puma/app/status.rb +71 -49
  42. data/lib/puma/binder.rb +243 -148
  43. data/lib/puma/cli.rb +50 -36
  44. data/lib/puma/client.rb +373 -233
  45. data/lib/puma/cluster/worker.rb +175 -0
  46. data/lib/puma/cluster/worker_handle.rb +97 -0
  47. data/lib/puma/cluster.rb +268 -235
  48. data/lib/puma/commonlogger.rb +4 -2
  49. data/lib/puma/configuration.rb +116 -88
  50. data/lib/puma/const.rb +49 -30
  51. data/lib/puma/control_cli.rb +123 -76
  52. data/lib/puma/detect.rb +33 -2
  53. data/lib/puma/dsl.rb +685 -135
  54. data/lib/puma/error_logger.rb +112 -0
  55. data/lib/puma/events.rb +17 -111
  56. data/lib/puma/io_buffer.rb +44 -5
  57. data/lib/puma/jruby_restart.rb +4 -59
  58. data/lib/puma/json_serialization.rb +96 -0
  59. data/lib/puma/launcher/bundle_pruner.rb +104 -0
  60. data/lib/puma/launcher.rb +196 -130
  61. data/lib/puma/log_writer.rb +137 -0
  62. data/lib/puma/minissl/context_builder.rb +92 -0
  63. data/lib/puma/minissl.rb +249 -69
  64. data/lib/puma/null_io.rb +20 -1
  65. data/lib/puma/plugin/tmp_restart.rb +3 -1
  66. data/lib/puma/plugin.rb +9 -13
  67. data/lib/puma/rack/builder.rb +8 -9
  68. data/lib/puma/rack/urlmap.rb +2 -0
  69. data/lib/puma/rack_default.rb +3 -1
  70. data/lib/puma/reactor.rb +90 -187
  71. data/lib/puma/request.rb +644 -0
  72. data/lib/puma/runner.rb +94 -71
  73. data/lib/puma/server.rb +337 -715
  74. data/lib/puma/single.rb +27 -72
  75. data/lib/puma/state_file.rb +46 -7
  76. data/lib/puma/systemd.rb +47 -0
  77. data/lib/puma/thread_pool.rb +184 -93
  78. data/lib/puma/util.rb +23 -10
  79. data/lib/puma.rb +60 -3
  80. data/lib/rack/handler/puma.rb +17 -15
  81. data/tools/Dockerfile +16 -0
  82. data/tools/trickletest.rb +0 -1
  83. metadata +53 -33
  84. data/ext/puma_http11/io_buffer.c +0 -155
  85. data/lib/puma/accept_nonblock.rb +0 -23
  86. data/lib/puma/compat.rb +0 -14
  87. data/lib/puma/convenient.rb +0 -23
  88. data/lib/puma/daemon_ext.rb +0 -31
  89. data/lib/puma/delegation.rb +0 -11
  90. data/lib/puma/java_io_buffer.rb +0 -45
  91. data/lib/puma/rack/backports/uri/common_193.rb +0 -33
  92. data/lib/puma/tcp_logger.rb +0 -39
  93. data/tools/jungle/README.md +0 -19
  94. data/tools/jungle/init.d/README.md +0 -61
  95. data/tools/jungle/init.d/puma +0 -421
  96. data/tools/jungle/init.d/run-puma +0 -18
  97. data/tools/jungle/upstart/README.md +0 -61
  98. data/tools/jungle/upstart/puma-manager.conf +0 -31
  99. data/tools/jungle/upstart/puma.conf +0 -69
data/lib/puma/util.rb CHANGED
@@ -1,10 +1,6 @@
1
- major, minor, patch = RUBY_VERSION.split('.').map { |v| v.to_i }
1
+ # frozen_string_literal: true
2
2
 
3
- if major == 1 && minor == 9 && patch == 3 && RUBY_PATCHLEVEL < 125
4
- require 'puma/rack/backports/uri/common_193'
5
- else
6
- require 'uri/common'
7
- end
3
+ require 'uri/common'
8
4
 
9
5
  module Puma
10
6
  module Util
@@ -14,18 +10,34 @@ module Puma
14
10
  IO.pipe
15
11
  end
16
12
 
17
- # Unescapes a URI escaped string with +encoding+. +encoding+ will be the
18
- # target encoding of the string returned, and it defaults to UTF-8
13
+ # An instance method on Thread has been provided to address https://bugs.ruby-lang.org/issues/13632,
14
+ # which currently effects some older versions of Ruby: 2.2.7 2.2.8 2.2.9 2.2.10 2.3.4 2.4.1
15
+ # Additional context: https://github.com/puma/puma/pull/1345
16
+ def purge_interrupt_queue
17
+ Thread.current.purge_interrupt_queue if Thread.current.respond_to? :purge_interrupt_queue
18
+ end
19
+
20
+ # Escapes and unescapes a URI escaped string with
21
+ # +encoding+. +encoding+ will be the target encoding of the string
22
+ # returned, and it defaults to UTF-8
19
23
  if defined?(::Encoding)
24
+ def escape(s, encoding = Encoding::UTF_8)
25
+ URI.encode_www_form_component(s, encoding)
26
+ end
27
+
20
28
  def unescape(s, encoding = Encoding::UTF_8)
21
29
  URI.decode_www_form_component(s, encoding)
22
30
  end
23
31
  else
32
+ def escape(s, encoding = nil)
33
+ URI.encode_www_form_component(s, encoding)
34
+ end
35
+
24
36
  def unescape(s, encoding = nil)
25
37
  URI.decode_www_form_component(s, encoding)
26
38
  end
27
39
  end
28
- module_function :unescape
40
+ module_function :unescape, :escape
29
41
 
30
42
  DEFAULT_SEP = /[&;] */n
31
43
 
@@ -54,7 +66,7 @@ module Puma
54
66
  end
55
67
  end
56
68
 
57
- return params
69
+ params
58
70
  end
59
71
 
60
72
  # A case-insensitive Hash that preserves the original case of a
@@ -76,6 +88,7 @@ module Puma
76
88
  end
77
89
  end
78
90
 
91
+ # @!attribute [r] to_hash
79
92
  def to_hash
80
93
  hash = {}
81
94
  each { |k,v| hash[k] = v }
data/lib/puma.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Standard libraries
2
4
  require 'socket'
3
5
  require 'tempfile'
@@ -8,16 +10,71 @@ require 'stringio'
8
10
 
9
11
  require 'thread'
10
12
 
13
+ # use require, see https://github.com/puma/puma/pull/2381
14
+ require 'puma/puma_http11'
15
+
16
+ require_relative 'puma/detect'
17
+ require_relative 'puma/json_serialization'
18
+
11
19
  module Puma
12
- autoload :Const, 'puma/const'
13
- autoload :Server, 'puma/server'
14
- autoload :Launcher, 'puma/launcher'
20
+ # when Puma is loaded via `Puma::CLI`, all files are loaded via
21
+ # `require_relative`. The below are for non-standard loading
22
+ autoload :Const, "#{__dir__}/puma/const"
23
+ autoload :Server, "#{__dir__}/puma/server"
24
+ autoload :Launcher, "#{__dir__}/puma/launcher"
25
+ autoload :LogWriter, "#{__dir__}/puma/log_writer"
26
+
27
+ # at present, MiniSSL::Engine is only defined in extension code (puma_http11),
28
+ # not in minissl.rb
29
+ HAS_SSL = const_defined?(:MiniSSL, false) && MiniSSL.const_defined?(:Engine, false)
15
30
 
31
+ HAS_UNIX_SOCKET = Object.const_defined?(:UNIXSocket) && !IS_WINDOWS
32
+
33
+ if HAS_SSL
34
+ require_relative 'puma/minissl'
35
+ else
36
+ module MiniSSL
37
+ # this class is defined so that it exists when Puma is compiled
38
+ # without ssl support, as Server and Reactor use it in rescue statements.
39
+ class SSLError < StandardError ; end
40
+ end
41
+ end
42
+
43
+ def self.ssl?
44
+ HAS_SSL
45
+ end
46
+
47
+ def self.abstract_unix_socket?
48
+ @abstract_unix ||=
49
+ if HAS_UNIX_SOCKET
50
+ begin
51
+ ::UNIXServer.new("\0puma.temp.unix").close
52
+ true
53
+ rescue ArgumentError # darwin
54
+ false
55
+ end
56
+ else
57
+ false
58
+ end
59
+ end
60
+
61
+ # @!attribute [rw] stats_object=
16
62
  def self.stats_object=(val)
17
63
  @get_stats = val
18
64
  end
19
65
 
66
+ # @!attribute [rw] stats_object
20
67
  def self.stats
68
+ Puma::JSONSerialization.generate @get_stats.stats
69
+ end
70
+
71
+ # @!attribute [r] stats_hash
72
+ # @version 5.0.0
73
+ def self.stats_hash
21
74
  @get_stats.stats
22
75
  end
76
+
77
+ def self.set_thread_name(name)
78
+ Thread.current.name = "puma #{name}"
79
+ end
23
80
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rack/handler'
2
4
 
3
5
  module Rack
@@ -9,10 +11,10 @@ module Rack
9
11
  }
10
12
 
11
13
  def self.config(app, options = {})
12
- require 'puma'
13
- require 'puma/configuration'
14
- require 'puma/events'
15
- require 'puma/launcher'
14
+ require_relative '../../puma'
15
+ require_relative '../../puma/configuration'
16
+ require_relative '../../puma/log_writer'
17
+ require_relative '../../puma/launcher'
16
18
 
17
19
  default_options = DEFAULT_OPTIONS.dup
18
20
 
@@ -28,9 +30,8 @@ module Rack
28
30
  end
29
31
 
30
32
  conf = ::Puma::Configuration.new(options, default_options) do |user_config, file_config, default_config|
31
- user_config.quiet
32
-
33
33
  if options.delete(:Verbose)
34
+ require 'rack/common_logger'
34
35
  app = Rack::CommonLogger.new(app, STDOUT)
35
36
  end
36
37
 
@@ -49,6 +50,9 @@ module Rack
49
50
  self.set_host_port_to_config(host, port, user_config)
50
51
  end
51
52
 
53
+ if default_options[:Host]
54
+ file_config.set_default_host(default_options[:Host])
55
+ end
52
56
  self.set_host_port_to_config(default_options[:Host], default_options[:Port], default_config)
53
57
 
54
58
  user_config.app app
@@ -56,14 +60,12 @@ module Rack
56
60
  conf
57
61
  end
58
62
 
59
-
60
-
61
- def self.run(app, options = {})
63
+ def self.run(app, **options)
62
64
  conf = self.config(app, options)
63
65
 
64
- events = options.delete(:Silent) ? ::Puma::Events.strings : ::Puma::Events.stdio
66
+ log_writer = options.delete(:Silent) ? ::Puma::LogWriter.strings : ::Puma::LogWriter.stdio
65
67
 
66
- launcher = ::Puma::Launcher.new(conf, :events => events)
68
+ launcher = ::Puma::Launcher.new(conf, :log_writer => log_writer)
67
69
 
68
70
  yield launcher if block_given?
69
71
  begin
@@ -83,7 +85,7 @@ module Rack
83
85
  "Verbose" => "Don't report each request (default: false)"
84
86
  }
85
87
  end
86
- private
88
+
87
89
  def self.set_host_port_to_config(host, port, config)
88
90
  config.clear_binds! if host || port
89
91
 
@@ -91,16 +93,16 @@ module Rack
91
93
  config.bind "unix://#{host}"
92
94
  elsif host && host =~ /^ssl:\/\//
93
95
  uri = URI.parse(host)
94
- uri.port ||= port || ::Puma::Configuration::DefaultTCPPort
96
+ uri.port ||= port || ::Puma::Configuration::DEFAULTS[:tcp_port]
95
97
  config.bind uri.to_s
96
98
  else
97
99
 
98
100
  if host
99
- port ||= ::Puma::Configuration::DefaultTCPPort
101
+ port ||= ::Puma::Configuration::DEFAULTS[:tcp_port]
100
102
  end
101
103
 
102
104
  if port
103
- host ||= ::Puma::Configuration::DefaultTCPHost
105
+ host ||= ::Puma::Configuration::DEFAULTS[:tcp_host]
104
106
  config.port port, host
105
107
  end
106
108
  end
data/tools/Dockerfile ADDED
@@ -0,0 +1,16 @@
1
+ # Use this Dockerfile to create minimal reproductions of issues
2
+
3
+ FROM ruby:3.1
4
+
5
+ # throw errors if Gemfile has been modified since Gemfile.lock
6
+ RUN bundle config --global frozen 1
7
+
8
+ WORKDIR /usr/src/app
9
+
10
+ COPY . .
11
+ RUN gem install bundler
12
+ RUN bundle install
13
+ RUN bundle exec rake compile
14
+
15
+ EXPOSE 9292
16
+ CMD bundle exec bin/puma test/rackup/hello.ru
data/tools/trickletest.rb CHANGED
@@ -38,7 +38,6 @@ ARGV[1].to_i.times do
38
38
  do_test(st, size)
39
39
  end
40
40
 
41
- t.abort_on_exception = true
42
41
  threads << t
43
42
  end
44
43
 
metadata CHANGED
@@ -1,18 +1,32 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: puma
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.11.4
4
+ version: 6.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Evan Phoenix
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-04-12 00:00:00.000000000 Z
12
- dependencies: []
13
- description: Puma is a simple, fast, threaded, and highly concurrent HTTP 1.1 server
11
+ date: 1980-01-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nio4r
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ description: Puma is a simple, fast, threaded, and highly parallel HTTP 1.1 server
14
28
  for Ruby/Rack applications. Puma is intended for use in both development and production
15
- environments. It's great for highly concurrent Ruby implementations such as Rubinius
29
+ environments. It's great for highly parallel Ruby implementations such as Rubinius
16
30
  and JRuby as well as as providing process worker support to support CRuby well.
17
31
  email:
18
32
  - evan@phx.io
@@ -30,15 +44,26 @@ files:
30
44
  - bin/puma-wild
31
45
  - bin/pumactl
32
46
  - docs/architecture.md
47
+ - docs/compile_options.md
33
48
  - docs/deployment.md
49
+ - docs/fork_worker.md
34
50
  - docs/images/puma-connection-flow-no-reactor.png
35
51
  - docs/images/puma-connection-flow.png
36
52
  - docs/images/puma-general-arch.png
53
+ - docs/jungle/README.md
54
+ - docs/jungle/rc.d/README.md
55
+ - docs/jungle/rc.d/puma
56
+ - docs/jungle/rc.d/puma.conf
57
+ - docs/kubernetes.md
37
58
  - docs/nginx.md
38
59
  - docs/plugins.md
60
+ - docs/rails_dev_mode.md
39
61
  - docs/restart.md
40
62
  - docs/signals.md
63
+ - docs/stats.md
41
64
  - docs/systemd.md
65
+ - docs/testing_benchmarks_local_files.md
66
+ - docs/testing_test_rackup_ci_files.md
42
67
  - ext/puma_http11/PumaHttp11Service.java
43
68
  - ext/puma_http11/ext_help.h
44
69
  - ext/puma_http11/extconf.rb
@@ -47,68 +72,64 @@ files:
47
72
  - ext/puma_http11/http11_parser.java.rl
48
73
  - ext/puma_http11/http11_parser.rl
49
74
  - ext/puma_http11/http11_parser_common.rl
50
- - ext/puma_http11/io_buffer.c
51
75
  - ext/puma_http11/mini_ssl.c
76
+ - ext/puma_http11/no_ssl/PumaHttp11Service.java
52
77
  - ext/puma_http11/org/jruby/puma/Http11.java
53
78
  - ext/puma_http11/org/jruby/puma/Http11Parser.java
54
79
  - ext/puma_http11/org/jruby/puma/MiniSSL.java
55
80
  - ext/puma_http11/puma_http11.c
56
81
  - lib/puma.rb
57
- - lib/puma/accept_nonblock.rb
58
82
  - lib/puma/app/status.rb
59
83
  - lib/puma/binder.rb
60
84
  - lib/puma/cli.rb
61
85
  - lib/puma/client.rb
62
86
  - lib/puma/cluster.rb
87
+ - lib/puma/cluster/worker.rb
88
+ - lib/puma/cluster/worker_handle.rb
63
89
  - lib/puma/commonlogger.rb
64
- - lib/puma/compat.rb
65
90
  - lib/puma/configuration.rb
66
91
  - lib/puma/const.rb
67
92
  - lib/puma/control_cli.rb
68
- - lib/puma/convenient.rb
69
- - lib/puma/daemon_ext.rb
70
- - lib/puma/delegation.rb
71
93
  - lib/puma/detect.rb
72
94
  - lib/puma/dsl.rb
95
+ - lib/puma/error_logger.rb
73
96
  - lib/puma/events.rb
74
97
  - lib/puma/io_buffer.rb
75
- - lib/puma/java_io_buffer.rb
76
98
  - lib/puma/jruby_restart.rb
99
+ - lib/puma/json_serialization.rb
77
100
  - lib/puma/launcher.rb
101
+ - lib/puma/launcher/bundle_pruner.rb
102
+ - lib/puma/log_writer.rb
78
103
  - lib/puma/minissl.rb
104
+ - lib/puma/minissl/context_builder.rb
79
105
  - lib/puma/null_io.rb
80
106
  - lib/puma/plugin.rb
81
107
  - lib/puma/plugin/tmp_restart.rb
82
- - lib/puma/rack/backports/uri/common_193.rb
83
108
  - lib/puma/rack/builder.rb
84
109
  - lib/puma/rack/urlmap.rb
85
110
  - lib/puma/rack_default.rb
86
111
  - lib/puma/reactor.rb
112
+ - lib/puma/request.rb
87
113
  - lib/puma/runner.rb
88
114
  - lib/puma/server.rb
89
115
  - lib/puma/single.rb
90
116
  - lib/puma/state_file.rb
91
- - lib/puma/tcp_logger.rb
117
+ - lib/puma/systemd.rb
92
118
  - lib/puma/thread_pool.rb
93
119
  - lib/puma/util.rb
94
120
  - lib/rack/handler/puma.rb
95
- - tools/jungle/README.md
96
- - tools/jungle/init.d/README.md
97
- - tools/jungle/init.d/puma
98
- - tools/jungle/init.d/run-puma
99
- - tools/jungle/rc.d/README.md
100
- - tools/jungle/rc.d/puma
101
- - tools/jungle/rc.d/puma.conf
102
- - tools/jungle/upstart/README.md
103
- - tools/jungle/upstart/puma-manager.conf
104
- - tools/jungle/upstart/puma.conf
121
+ - tools/Dockerfile
105
122
  - tools/trickletest.rb
106
- homepage: http://puma.io
123
+ homepage: https://puma.io
107
124
  licenses:
108
125
  - BSD-3-Clause
109
126
  metadata:
110
- msys2_mingw_dependencies: openssl
111
- post_install_message:
127
+ bug_tracker_uri: https://github.com/puma/puma/issues
128
+ changelog_uri: https://github.com/puma/puma/blob/master/History.md
129
+ homepage_uri: https://puma.io
130
+ source_code_uri: https://github.com/puma/puma
131
+ rubygems_mfa_required: 'true'
132
+ post_install_message:
112
133
  rdoc_options: []
113
134
  require_paths:
114
135
  - lib
@@ -116,17 +137,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
116
137
  requirements:
117
138
  - - ">="
118
139
  - !ruby/object:Gem::Version
119
- version: 1.9.3
140
+ version: '2.4'
120
141
  required_rubygems_version: !ruby/object:Gem::Requirement
121
142
  requirements:
122
143
  - - ">="
123
144
  - !ruby/object:Gem::Version
124
145
  version: '0'
125
146
  requirements: []
126
- rubyforge_project:
127
- rubygems_version: 2.7.6
128
- signing_key:
147
+ rubygems_version: 3.2.26
148
+ signing_key:
129
149
  specification_version: 4
130
- summary: Puma is a simple, fast, threaded, and highly concurrent HTTP 1.1 server for
150
+ summary: Puma is a simple, fast, threaded, and highly parallel HTTP 1.1 server for
131
151
  Ruby/Rack applications
132
152
  test_files: []
@@ -1,155 +0,0 @@
1
- #define RSTRING_NOT_MODIFIED 1
2
- #include "ruby.h"
3
-
4
- #include <sys/types.h>
5
-
6
- struct buf_int {
7
- uint8_t* top;
8
- uint8_t* cur;
9
-
10
- size_t size;
11
- };
12
-
13
- #define BUF_DEFAULT_SIZE 4096
14
- #define BUF_TOLERANCE 32
15
-
16
- static void buf_free(struct buf_int* internal) {
17
- xfree(internal->top);
18
- xfree(internal);
19
- }
20
-
21
- static VALUE buf_alloc(VALUE self) {
22
- VALUE buf;
23
- struct buf_int* internal;
24
-
25
- buf = Data_Make_Struct(self, struct buf_int, 0, buf_free, internal);
26
-
27
- internal->size = BUF_DEFAULT_SIZE;
28
- internal->top = ALLOC_N(uint8_t, BUF_DEFAULT_SIZE);
29
- internal->cur = internal->top;
30
-
31
- return buf;
32
- }
33
-
34
- static VALUE buf_append(VALUE self, VALUE str) {
35
- struct buf_int* b;
36
- size_t used, str_len, new_size;
37
-
38
- Data_Get_Struct(self, struct buf_int, b);
39
-
40
- used = b->cur - b->top;
41
-
42
- StringValue(str);
43
- str_len = RSTRING_LEN(str);
44
-
45
- new_size = used + str_len;
46
-
47
- if(new_size > b->size) {
48
- size_t n = b->size + (b->size / 2);
49
- uint8_t* top;
50
- uint8_t* old;
51
-
52
- new_size = (n > new_size ? n : new_size + BUF_TOLERANCE);
53
-
54
- top = ALLOC_N(uint8_t, new_size);
55
- old = b->top;
56
- memcpy(top, old, used);
57
- b->top = top;
58
- b->cur = top + used;
59
- b->size = new_size;
60
- xfree(old);
61
- }
62
-
63
- memcpy(b->cur, RSTRING_PTR(str), str_len);
64
- b->cur += str_len;
65
-
66
- return self;
67
- }
68
-
69
- static VALUE buf_append2(int argc, VALUE* argv, VALUE self) {
70
- struct buf_int* b;
71
- size_t used, new_size;
72
- int i;
73
- VALUE str;
74
-
75
- Data_Get_Struct(self, struct buf_int, b);
76
-
77
- used = b->cur - b->top;
78
- new_size = used;
79
-
80
- for(i = 0; i < argc; i++) {
81
- StringValue(argv[i]);
82
-
83
- str = argv[i];
84
-
85
- new_size += RSTRING_LEN(str);
86
- }
87
-
88
- if(new_size > b->size) {
89
- size_t n = b->size + (b->size / 2);
90
- uint8_t* top;
91
- uint8_t* old;
92
-
93
- new_size = (n > new_size ? n : new_size + BUF_TOLERANCE);
94
-
95
- top = ALLOC_N(uint8_t, new_size);
96
- old = b->top;
97
- memcpy(top, old, used);
98
- b->top = top;
99
- b->cur = top + used;
100
- b->size = new_size;
101
- xfree(old);
102
- }
103
-
104
- for(i = 0; i < argc; i++) {
105
- long str_len;
106
- str = argv[i];
107
- str_len = RSTRING_LEN(str);
108
- memcpy(b->cur, RSTRING_PTR(str), str_len);
109
- b->cur += str_len;
110
- }
111
-
112
- return self;
113
- }
114
-
115
- static VALUE buf_to_str(VALUE self) {
116
- struct buf_int* b;
117
- Data_Get_Struct(self, struct buf_int, b);
118
-
119
- return rb_str_new((const char*)(b->top), b->cur - b->top);
120
- }
121
-
122
- static VALUE buf_used(VALUE self) {
123
- struct buf_int* b;
124
- Data_Get_Struct(self, struct buf_int, b);
125
-
126
- return INT2FIX(b->cur - b->top);
127
- }
128
-
129
- static VALUE buf_capa(VALUE self) {
130
- struct buf_int* b;
131
- Data_Get_Struct(self, struct buf_int, b);
132
-
133
- return INT2FIX(b->size);
134
- }
135
-
136
- static VALUE buf_reset(VALUE self) {
137
- struct buf_int* b;
138
- Data_Get_Struct(self, struct buf_int, b);
139
-
140
- b->cur = b->top;
141
- return self;
142
- }
143
-
144
- void Init_io_buffer(VALUE puma) {
145
- VALUE buf = rb_define_class_under(puma, "IOBuffer", rb_cObject);
146
-
147
- rb_define_alloc_func(buf, buf_alloc);
148
- rb_define_method(buf, "<<", buf_append, 1);
149
- rb_define_method(buf, "append", buf_append2, -1);
150
- rb_define_method(buf, "to_str", buf_to_str, 0);
151
- rb_define_method(buf, "to_s", buf_to_str, 0);
152
- rb_define_method(buf, "used", buf_used, 0);
153
- rb_define_method(buf, "capacity", buf_capa, 0);
154
- rb_define_method(buf, "reset", buf_reset, 0);
155
- }
@@ -1,23 +0,0 @@
1
- require 'openssl'
2
-
3
- module OpenSSL
4
- module SSL
5
- class SSLServer
6
- unless public_method_defined? :accept_nonblock
7
- def accept_nonblock
8
- sock = @svr.accept_nonblock
9
-
10
- begin
11
- ssl = OpenSSL::SSL::SSLSocket.new(sock, @ctx)
12
- ssl.sync_close = true
13
- ssl.accept if @start_immediately
14
- ssl
15
- rescue SSLError => ex
16
- sock.close
17
- raise ex
18
- end
19
- end
20
- end
21
- end
22
- end
23
- end
data/lib/puma/compat.rb DELETED
@@ -1,14 +0,0 @@
1
- # Provides code to work properly on 1.8 and 1.9
2
-
3
- class String
4
- unless method_defined? :bytesize
5
- alias_method :bytesize, :size
6
- end
7
-
8
- unless method_defined? :byteslice
9
- def byteslice(*arg)
10
- enc = self.encoding
11
- self.dup.force_encoding(Encoding::ASCII_8BIT).slice(*arg).force_encoding(enc)
12
- end
13
- end
14
- end
@@ -1,23 +0,0 @@
1
- require 'puma/launcher'
2
- require 'puma/configuration'
3
-
4
- module Puma
5
- def self.run(opts={})
6
- cfg = Puma::Configuration.new do |user_config|
7
- if port = opts[:port]
8
- user_config.port port
9
- end
10
-
11
- user_config.quiet
12
-
13
- yield c
14
- end
15
-
16
- cfg.clamp
17
-
18
- events = Puma::Events.null
19
-
20
- launcher = Puma::Launcher.new cfg, :events => events
21
- launcher.run
22
- end
23
- end
@@ -1,31 +0,0 @@
1
- module Process
2
-
3
- # This overrides the default version because it is broken if it
4
- # exists.
5
-
6
- if respond_to? :daemon
7
- class << self
8
- remove_method :daemon
9
- end
10
- end
11
-
12
- def self.daemon(nochdir=false, noclose=false)
13
- exit if fork # Parent exits, child continues.
14
-
15
- Process.setsid # Become session leader.
16
-
17
- exit if fork # Zap session leader. See [1].
18
-
19
- Dir.chdir "/" unless nochdir # Release old working directory.
20
-
21
- if !noclose
22
- STDIN.reopen File.open("/dev/null", "r")
23
-
24
- null_out = File.open "/dev/null", "w"
25
- STDOUT.reopen null_out
26
- STDERR.reopen null_out
27
- end
28
-
29
- 0
30
- end
31
- end
@@ -1,11 +0,0 @@
1
- module Puma
2
- module Delegation
3
- def forward(what, who)
4
- module_eval <<-CODE
5
- def #{what}(*args, &block)
6
- #{who}.#{what}(*args, &block)
7
- end
8
- CODE
9
- end
10
- end
11
- end