From: Eric Wong <e@80x24.org>
To: yahns-public@yhbt.net
Subject: [PATCH 5/5] extras/exec_cgi: support Process.spawn options (e.g. RLIMIT_*)
Date: Wed, 26 Dec 2018 19:57:16 +0000 [thread overview]
Message-ID: <20181226195716.31202-6-e@80x24.org> (raw)
In-Reply-To: <20181226195716.31202-1-e@80x24.org>
These options can be useful for limiting CGI process runtime and
memory usage.
---
| 6 ++++--
| 23 +++++++++++++++++++++++
2 files changed, 27 insertions(+), 2 deletions(-)
--git a/extras/exec_cgi.rb b/extras/exec_cgi.rb
index babda3c..2746c09 100644
--- a/extras/exec_cgi.rb
+++ b/extras/exec_cgi.rb
@@ -18,7 +18,8 @@
# use Rack::Chunked
# # other Rack middlewares can go here...
#
-# run ExecCgi.new('/path/to/cgit.cgi') # cgit: https://git.zx2c4.com/cgit/
+# # cgit: https://git.zx2c4.com/cgit/
+# run ExecCgi.new('/path/to/cgit.cgi', opts)
#
class ExecCgi
class MyIO
@@ -91,6 +92,7 @@ def initialize(*args)
first[0] == ?/ or args[0] = ::File.expand_path(first)
File.executable?(args[0]) or
raise ArgumentError, "#{args[0]} is not executable"
+ @opts = Hash === args[-1] ? args.pop : {}
end
# Calls the app
@@ -104,7 +106,7 @@ def call(env)
io = MyIO.new(rd)
errbody = io
errbody.my_pid = spawn(cgi_env.merge!(@env), *@args,
- out: wr, close_others: true)
+ @opts.merge(out: wr, close_others: true))
wr.close
begin
--git a/test/test_extras_exec_cgi.rb b/test/test_extras_exec_cgi.rb
index c6c5ad6..48d62b7 100644
--- a/test/test_extras_exec_cgi.rb
+++ b/test/test_extras_exec_cgi.rb
@@ -179,4 +179,27 @@ def _blocked_zombie(block_on, rtype)
c.close if c
quit_wait(pid)
end
+
+ def test_rlimit_options
+ err, cfg, host, port = @err, Yahns::Config.new, @srv.addr[3], @srv.addr[1]
+ tout = 1
+ opts = { rlimit_cpu: tout, rlimit_core: 0 }
+ cmd = [ '/bin/sh', '-c', 'while :; do :;done', opts ]
+ pid = mkserver(cfg) do
+ require './extras/exec_cgi'
+ cfg.instance_eval do
+ stack = Rack::ContentLength.new(Rack::Chunked.new(ExecCgi.new(*cmd)))
+ app(:rack, stack) { listen "#{host}:#{port}" }
+ stderr_path err.path
+ worker_processes 1
+ end
+ end
+ c = get_tcp_client(host, port)
+ c.write "GET / HTTP/1.0\r\n\r\n"
+ assert_same c, c.wait(tout + 0.5)
+ assert_match %r{ 500 Internal Server Error\b}, c.readpartial(4096)
+ c.close
+ ensure
+ quit_wait(pid)
+ end
end
--
EW
next prev parent reply other threads:[~2018-12-26 19:57 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-12-26 19:57 [PATCH 0/5] exec_cgi: various cleanups and fixes Eric Wong
2018-12-26 19:57 ` [PATCH 1/5] test/test_extras_exec_cgi.rb: improve test reliability Eric Wong
2018-12-26 19:57 ` [PATCH 2/5] extras/exec_cgi: remove kgio dependency Eric Wong
2018-12-26 19:57 ` [PATCH 3/5] extras/exec_cgi: update copyright year and use SPDX Eric Wong
2018-12-26 19:57 ` [PATCH 4/5] extras/exec_cgi: @body_tip is always set Eric Wong
2018-12-26 19:57 ` Eric Wong [this message]
2018-12-28 7:39 ` [PATCH 5/5] extras/exec_cgi: support Process.spawn options (e.g. RLIMIT_*) Eric Wong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://yhbt.net/yahns/README
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20181226195716.31202-6-e@80x24.org \
--to=e@80x24.org \
--cc=yahns-public@yhbt.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://yhbt.net/yahns.git/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).