puma 3.12.0 → 5.6.8
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.
- checksums.yaml +4 -4
- data/History.md +1620 -439
- data/LICENSE +23 -20
- data/README.md +175 -63
- data/bin/puma-wild +3 -9
- data/docs/architecture.md +59 -21
- data/docs/compile_options.md +21 -0
- data/docs/deployment.md +69 -58
- data/docs/fork_worker.md +33 -0
- data/docs/jungle/README.md +9 -0
- data/{tools → docs}/jungle/rc.d/README.md +1 -1
- data/{tools → docs}/jungle/rc.d/puma +2 -2
- data/docs/kubernetes.md +66 -0
- data/docs/nginx.md +1 -1
- data/docs/plugins.md +22 -12
- data/docs/rails_dev_mode.md +28 -0
- data/docs/restart.md +47 -22
- data/docs/signals.md +13 -11
- data/docs/stats.md +142 -0
- data/docs/systemd.md +95 -120
- data/ext/puma_http11/PumaHttp11Service.java +2 -2
- data/ext/puma_http11/ext_help.h +1 -1
- data/ext/puma_http11/extconf.rb +57 -2
- data/ext/puma_http11/http11_parser.c +105 -117
- data/ext/puma_http11/http11_parser.h +1 -1
- data/ext/puma_http11/http11_parser.java.rl +22 -38
- data/ext/puma_http11/http11_parser.rl +4 -2
- data/ext/puma_http11/http11_parser_common.rl +4 -4
- data/ext/puma_http11/mini_ssl.c +347 -94
- data/ext/puma_http11/no_ssl/PumaHttp11Service.java +15 -0
- data/ext/puma_http11/org/jruby/puma/Http11.java +108 -116
- data/ext/puma_http11/org/jruby/puma/Http11Parser.java +84 -99
- data/ext/puma_http11/org/jruby/puma/MiniSSL.java +124 -71
- data/ext/puma_http11/puma_http11.c +35 -51
- data/lib/puma/app/status.rb +71 -49
- data/lib/puma/binder.rb +241 -143
- data/lib/puma/cli.rb +30 -18
- data/lib/puma/client.rb +379 -229
- data/lib/puma/cluster/worker.rb +173 -0
- data/lib/puma/cluster/worker_handle.rb +94 -0
- data/lib/puma/cluster.rb +249 -232
- data/lib/puma/commonlogger.rb +4 -2
- data/lib/puma/configuration.rb +63 -51
- data/lib/puma/const.rb +44 -21
- data/lib/puma/control_cli.rb +123 -73
- data/lib/puma/detect.rb +31 -2
- data/lib/puma/dsl.rb +631 -125
- data/lib/puma/error_logger.rb +104 -0
- data/lib/puma/events.rb +57 -31
- data/lib/puma/io_buffer.rb +9 -5
- data/lib/puma/jruby_restart.rb +2 -58
- data/lib/puma/json_serialization.rb +96 -0
- data/lib/puma/launcher.rb +196 -70
- data/lib/puma/minissl/context_builder.rb +81 -0
- data/lib/puma/minissl.rb +172 -65
- data/lib/puma/null_io.rb +20 -1
- data/lib/puma/plugin/tmp_restart.rb +2 -0
- data/lib/puma/plugin.rb +9 -13
- data/lib/puma/queue_close.rb +26 -0
- data/lib/puma/rack/builder.rb +5 -6
- data/lib/puma/rack/urlmap.rb +2 -0
- data/lib/puma/rack_default.rb +2 -0
- data/lib/puma/reactor.rb +87 -316
- data/lib/puma/request.rb +476 -0
- data/lib/puma/runner.rb +50 -55
- data/lib/puma/server.rb +307 -695
- data/lib/puma/single.rb +13 -67
- data/lib/puma/state_file.rb +49 -7
- data/lib/puma/systemd.rb +46 -0
- data/lib/puma/thread_pool.rb +134 -82
- data/lib/puma/util.rb +34 -10
- data/lib/puma.rb +56 -0
- data/lib/rack/handler/puma.rb +8 -6
- data/lib/rack/version_restriction.rb +15 -0
- data/tools/Dockerfile +16 -0
- data/tools/trickletest.rb +0 -1
- metadata +49 -32
- data/ext/puma_http11/io_buffer.c +0 -155
- data/lib/puma/accept_nonblock.rb +0 -23
- data/lib/puma/compat.rb +0 -14
- data/lib/puma/convenient.rb +0 -23
- data/lib/puma/daemon_ext.rb +0 -31
- data/lib/puma/delegation.rb +0 -11
- data/lib/puma/java_io_buffer.rb +0 -45
- data/lib/puma/rack/backports/uri/common_193.rb +0 -33
- data/lib/puma/tcp_logger.rb +0 -39
- data/tools/jungle/README.md +0 -19
- data/tools/jungle/init.d/README.md +0 -61
- data/tools/jungle/init.d/puma +0 -421
- data/tools/jungle/init.d/run-puma +0 -18
- data/tools/jungle/upstart/README.md +0 -61
- data/tools/jungle/upstart/puma-manager.conf +0 -31
- data/tools/jungle/upstart/puma.conf +0 -69
- /data/{tools → docs}/jungle/rc.d/puma.conf +0 -0
data/lib/puma/util.rb
CHANGED
@@ -1,10 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
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,45 @@ module Puma
|
|
14
10
|
IO.pipe
|
15
11
|
end
|
16
12
|
|
17
|
-
#
|
18
|
-
#
|
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
|
41
|
+
|
42
|
+
# @version 5.0.0
|
43
|
+
def nakayoshi_gc(events)
|
44
|
+
events.log "! Promoting existing objects to old generation..."
|
45
|
+
4.times { GC.start(full_mark: false) }
|
46
|
+
if GC.respond_to?(:compact)
|
47
|
+
events.log "! Compacting..."
|
48
|
+
GC.compact
|
49
|
+
end
|
50
|
+
events.log "! Friendly fork preparation complete."
|
51
|
+
end
|
29
52
|
|
30
53
|
DEFAULT_SEP = /[&;] */n
|
31
54
|
|
@@ -54,7 +77,7 @@ module Puma
|
|
54
77
|
end
|
55
78
|
end
|
56
79
|
|
57
|
-
|
80
|
+
params
|
58
81
|
end
|
59
82
|
|
60
83
|
# A case-insensitive Hash that preserves the original case of a
|
@@ -76,6 +99,7 @@ module Puma
|
|
76
99
|
end
|
77
100
|
end
|
78
101
|
|
102
|
+
# @!attribute [r] to_hash
|
79
103
|
def to_hash
|
80
104
|
hash = {}
|
81
105
|
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,70 @@ require 'stringio'
|
|
8
10
|
|
9
11
|
require 'thread'
|
10
12
|
|
13
|
+
# extension files should not be loaded with `require_relative`
|
14
|
+
require 'puma/puma_http11'
|
15
|
+
require_relative 'puma/detect'
|
16
|
+
require_relative 'puma/json_serialization'
|
17
|
+
require_relative 'rack/version_restriction'
|
18
|
+
|
11
19
|
module Puma
|
12
20
|
autoload :Const, 'puma/const'
|
13
21
|
autoload :Server, 'puma/server'
|
14
22
|
autoload :Launcher, 'puma/launcher'
|
15
23
|
|
24
|
+
# at present, MiniSSL::Engine is only defined in extension code (puma_http11),
|
25
|
+
# not in minissl.rb
|
26
|
+
HAS_SSL = const_defined?(:MiniSSL, false) && MiniSSL.const_defined?(:Engine, false)
|
27
|
+
|
28
|
+
HAS_UNIX_SOCKET = Object.const_defined?(:UNIXSocket) && !IS_WINDOWS
|
29
|
+
|
30
|
+
if HAS_SSL
|
31
|
+
require 'puma/minissl'
|
32
|
+
else
|
33
|
+
module MiniSSL
|
34
|
+
# this class is defined so that it exists when Puma is compiled
|
35
|
+
# without ssl support, as Server and Reactor use it in rescue statements.
|
36
|
+
class SSLError < StandardError ; end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.ssl?
|
41
|
+
HAS_SSL
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.abstract_unix_socket?
|
45
|
+
@abstract_unix ||=
|
46
|
+
if HAS_UNIX_SOCKET
|
47
|
+
begin
|
48
|
+
::UNIXServer.new("\0puma.temp.unix").close
|
49
|
+
true
|
50
|
+
rescue ArgumentError # darwin
|
51
|
+
false
|
52
|
+
end
|
53
|
+
else
|
54
|
+
false
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# @!attribute [rw] stats_object=
|
16
59
|
def self.stats_object=(val)
|
17
60
|
@get_stats = val
|
18
61
|
end
|
19
62
|
|
63
|
+
# @!attribute [rw] stats_object
|
20
64
|
def self.stats
|
65
|
+
Puma::JSONSerialization.generate @get_stats.stats
|
66
|
+
end
|
67
|
+
|
68
|
+
# @!attribute [r] stats_hash
|
69
|
+
# @version 5.0.0
|
70
|
+
def self.stats_hash
|
21
71
|
@get_stats.stats
|
22
72
|
end
|
73
|
+
|
74
|
+
# Thread name is new in Ruby 2.3
|
75
|
+
def self.set_thread_name(name)
|
76
|
+
return unless Thread.current.respond_to?(:name=)
|
77
|
+
Thread.current.name = "puma #{name}"
|
78
|
+
end
|
23
79
|
end
|
data/lib/rack/handler/puma.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rack/handler'
|
2
4
|
|
3
5
|
module Rack
|
@@ -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,9 +60,7 @@ 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
66
|
events = options.delete(:Silent) ? ::Puma::Events.strings : ::Puma::Events.stdio
|
@@ -83,7 +85,7 @@ module Rack
|
|
83
85
|
"Verbose" => "Don't report each request (default: false)"
|
84
86
|
}
|
85
87
|
end
|
86
|
-
|
88
|
+
|
87
89
|
def self.set_host_port_to_config(host, port, config)
|
88
90
|
config.clear_binds! if host || port
|
89
91
|
|
@@ -0,0 +1,15 @@
|
|
1
|
+
begin
|
2
|
+
begin
|
3
|
+
# rack/version exists in Rack 2.2.0 and later, compatible with Ruby 2.3 and later
|
4
|
+
# we prefer to not load Rack
|
5
|
+
require 'rack/version'
|
6
|
+
rescue LoadError
|
7
|
+
require 'rack'
|
8
|
+
end
|
9
|
+
|
10
|
+
# Rack.release is needed for Rack v1, Rack::RELEASE was added in v2
|
11
|
+
if Gem::Version.new(Rack.release) >= Gem::Version.new("3.0.0")
|
12
|
+
raise StandardError.new "Puma 5 is not compatible with Rack 3, please upgrade to Puma 6 or higher."
|
13
|
+
end
|
14
|
+
rescue LoadError
|
15
|
+
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
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:
|
4
|
+
version: 5.6.8
|
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:
|
12
|
-
dependencies:
|
13
|
-
|
11
|
+
date: 2024-01-08 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
|
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,14 +44,23 @@ 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
|
42
65
|
- ext/puma_http11/PumaHttp11Service.java
|
43
66
|
- ext/puma_http11/ext_help.h
|
@@ -47,68 +70,63 @@ files:
|
|
47
70
|
- ext/puma_http11/http11_parser.java.rl
|
48
71
|
- ext/puma_http11/http11_parser.rl
|
49
72
|
- ext/puma_http11/http11_parser_common.rl
|
50
|
-
- ext/puma_http11/io_buffer.c
|
51
73
|
- ext/puma_http11/mini_ssl.c
|
74
|
+
- ext/puma_http11/no_ssl/PumaHttp11Service.java
|
52
75
|
- ext/puma_http11/org/jruby/puma/Http11.java
|
53
76
|
- ext/puma_http11/org/jruby/puma/Http11Parser.java
|
54
77
|
- ext/puma_http11/org/jruby/puma/MiniSSL.java
|
55
78
|
- ext/puma_http11/puma_http11.c
|
56
79
|
- lib/puma.rb
|
57
|
-
- lib/puma/accept_nonblock.rb
|
58
80
|
- lib/puma/app/status.rb
|
59
81
|
- lib/puma/binder.rb
|
60
82
|
- lib/puma/cli.rb
|
61
83
|
- lib/puma/client.rb
|
62
84
|
- lib/puma/cluster.rb
|
85
|
+
- lib/puma/cluster/worker.rb
|
86
|
+
- lib/puma/cluster/worker_handle.rb
|
63
87
|
- lib/puma/commonlogger.rb
|
64
|
-
- lib/puma/compat.rb
|
65
88
|
- lib/puma/configuration.rb
|
66
89
|
- lib/puma/const.rb
|
67
90
|
- lib/puma/control_cli.rb
|
68
|
-
- lib/puma/convenient.rb
|
69
|
-
- lib/puma/daemon_ext.rb
|
70
|
-
- lib/puma/delegation.rb
|
71
91
|
- lib/puma/detect.rb
|
72
92
|
- lib/puma/dsl.rb
|
93
|
+
- lib/puma/error_logger.rb
|
73
94
|
- lib/puma/events.rb
|
74
95
|
- lib/puma/io_buffer.rb
|
75
|
-
- lib/puma/java_io_buffer.rb
|
76
96
|
- lib/puma/jruby_restart.rb
|
97
|
+
- lib/puma/json_serialization.rb
|
77
98
|
- lib/puma/launcher.rb
|
78
99
|
- lib/puma/minissl.rb
|
100
|
+
- lib/puma/minissl/context_builder.rb
|
79
101
|
- lib/puma/null_io.rb
|
80
102
|
- lib/puma/plugin.rb
|
81
103
|
- lib/puma/plugin/tmp_restart.rb
|
82
|
-
- lib/puma/
|
104
|
+
- lib/puma/queue_close.rb
|
83
105
|
- lib/puma/rack/builder.rb
|
84
106
|
- lib/puma/rack/urlmap.rb
|
85
107
|
- lib/puma/rack_default.rb
|
86
108
|
- lib/puma/reactor.rb
|
109
|
+
- lib/puma/request.rb
|
87
110
|
- lib/puma/runner.rb
|
88
111
|
- lib/puma/server.rb
|
89
112
|
- lib/puma/single.rb
|
90
113
|
- lib/puma/state_file.rb
|
91
|
-
- lib/puma/
|
114
|
+
- lib/puma/systemd.rb
|
92
115
|
- lib/puma/thread_pool.rb
|
93
116
|
- lib/puma/util.rb
|
94
117
|
- lib/rack/handler/puma.rb
|
95
|
-
-
|
96
|
-
- tools/
|
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
|
118
|
+
- lib/rack/version_restriction.rb
|
119
|
+
- tools/Dockerfile
|
105
120
|
- tools/trickletest.rb
|
106
|
-
homepage:
|
121
|
+
homepage: https://puma.io
|
107
122
|
licenses:
|
108
123
|
- BSD-3-Clause
|
109
124
|
metadata:
|
110
|
-
|
111
|
-
|
125
|
+
bug_tracker_uri: https://github.com/puma/puma/issues
|
126
|
+
changelog_uri: https://github.com/puma/puma/blob/master/History.md
|
127
|
+
homepage_uri: https://puma.io
|
128
|
+
source_code_uri: https://github.com/puma/puma
|
129
|
+
post_install_message:
|
112
130
|
rdoc_options: []
|
113
131
|
require_paths:
|
114
132
|
- lib
|
@@ -123,10 +141,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
123
141
|
- !ruby/object:Gem::Version
|
124
142
|
version: '0'
|
125
143
|
requirements: []
|
126
|
-
|
127
|
-
|
128
|
-
signing_key:
|
144
|
+
rubygems_version: 3.5.3
|
145
|
+
signing_key:
|
129
146
|
specification_version: 4
|
130
|
-
summary: Puma is a simple, fast, threaded, and highly
|
147
|
+
summary: Puma is a simple, fast, threaded, and highly parallel HTTP 1.1 server for
|
131
148
|
Ruby/Rack applications
|
132
149
|
test_files: []
|
data/ext/puma_http11/io_buffer.c
DELETED
@@ -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
|
-
}
|
data/lib/puma/accept_nonblock.rb
DELETED
@@ -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
|
data/lib/puma/convenient.rb
DELETED
@@ -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
|
data/lib/puma/daemon_ext.rb
DELETED
@@ -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
|