yahns Ruby server user/dev discussion
 help / color / Atom feed
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
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.
---
 extras/exec_cgi.rb           |  6 ++++--
 test/test_extras_exec_cgi.rb | 23 +++++++++++++++++++++++
 2 files changed, 27 insertions(+), 2 deletions(-)

diff --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
diff --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


  parent reply index

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 publically 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

yahns Ruby server user/dev discussion

Archives are clonable:
	git clone --mirror https://yhbt.net/yahns-public
	git clone --mirror http://ou63pmih66umazou.onion/yahns-public

Newsgroups are available over NNTP:
	nntp://news.public-inbox.org/inbox.comp.lang.ruby.yahns
	nntp://ou63pmih66umazou.onion/inbox.comp.lang.ruby.yahns

 note: .onion URLs require Tor: https://www.torproject.org/

AGPL code for this site: git clone https://public-inbox.org/ public-inbox