about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2012-03-14 17:53:30 -0700
committerEric Wong <normalperson@yhbt.net>2012-03-14 17:53:30 -0700
commitfcbe015155f0cbbfc45a152192f5bd6a9c6b03b8 (patch)
treec856ac1881dc4811952a4d04ecd6188b58824dbe
parent340ea0d698b7b9f6197d4caaeaac6c0e7a603301 (diff)
downloadcmogstored-fcbe015155f0cbbfc45a152192f5bd6a9c6b03b8.tar.gz
We'll ensure "server=none" setups will disable HTTP support
entirely.
-rw-r--r--cfg.c4
-rw-r--r--cmogstored.c4
-rw-r--r--test/cmogstored-cfg.rb73
3 files changed, 80 insertions, 1 deletions
diff --git a/cfg.c b/cfg.c
index e413c37..d2f7f48 100644
--- a/cfg.c
+++ b/cfg.c
@@ -157,6 +157,10 @@ static bool svc_from_cfg(void *cfg_ptr, void *ignored)
                 die("failed to load svc from docroot=%s\n", cfg->docroot);
 
         svc->mgmt_fd = bind_or_die(cfg->mgmtlisten, "dataready");
+
+        if (cfg->server && strcmp(cfg->server, "none") == 0)
+                return true;
+
         svc->http_fd = bind_or_die(cfg->httplisten, "httpready");
         svc->httpget_fd = bind_or_die(cfg->httpgetlisten, "httpready");
 
diff --git a/cmogstored.c b/cmogstored.c
index e7e7d50..4bebf66 100644
--- a/cmogstored.c
+++ b/cmogstored.c
@@ -44,7 +44,9 @@ static struct argp_option options[] = {
         { .name = "pidfile", .key = CFG_KEY(pidfile),
           .arg = "<path>",
           .doc = "path to PID file" },
-        { .name = "server", .key = CFG_KEY(server), .flags = OPTION_HIDDEN },
+        { .name = "server", .key = CFG_KEY(server), .flags = OPTION_HIDDEN,
+          .arg = "(perlbal|none)"
+        },
         {
           /* hidden for now, don't break compat with Perl mogstored */
           .name = "multi", .key = 'M', .flags = OPTION_HIDDEN
diff --git a/test/cmogstored-cfg.rb b/test/cmogstored-cfg.rb
index 24ea85e..137812c 100644
--- a/test/cmogstored-cfg.rb
+++ b/test/cmogstored-cfg.rb
@@ -40,6 +40,7 @@ class TestCmogstoredConfig < Test::Unit::TestCase
   def test_worker_processes
     nproc = 2
     @cmd << "--worker-processes=#{nproc}"
+    @cmd << "--docroot=#@tmpdir"
     @cmd << "--mgmtlisten=#@host:#@port"
     tmp = Tempfile.new("err")
     @pid = fork do
@@ -256,4 +257,76 @@ class TestCmogstoredConfig < Test::Unit::TestCase
     _, status = Process.waitpid2(@pid)
     assert status.success?, status.inspect
   end
+
+  def test_server_none
+    http = rand_port
+    @cmd << "--docroot=#@tmpdir"
+    @cmd << "--server=none"
+    @cmd << "--mgmtlisten=#@host:#@port"
+    @cmd << "--httplisten=#@host:#{http}"
+    tmp = Tempfile.new('err')
+    @pid = fork do
+      $stderr.reopen(tmp)
+      exec(*@cmd)
+    end
+    pre_kill
+    assert_raises(Errno::ECONNREFUSED) { TCPSocket.new(@host, http) }
+    Process.kill(:QUIT, @pid)
+    _, status = Process.waitpid2(@pid)
+    assert status.success?, status.inspect
+  end
+
+  def test_server_perlbal
+    http = rand_port
+    FileUtils.mkpath("#@tmpdir/dev666")
+    @cmd << "--docroot=#@tmpdir"
+    @cmd << "--server=perlbal"
+    @cmd << "--mgmtlisten=#@host:#@port"
+    @cmd << "--httplisten=#@host:#{http}"
+    tmp = Tempfile.new('err')
+    @pid = fork do
+      $stderr.reopen(tmp)
+      exec(*@cmd)
+    end
+    pre_kill
+    Net::HTTP.start(@host, http) do |c|
+      put = Net::HTTP::Put.new("/dev666/foo")
+      body = StringIO.new("BODY!")
+      put.content_type = "application/octet-stream"
+      put.body_stream = body
+      put.content_length = body.size
+      resp = c.request(put)
+      assert_equal 201, resp.code.to_i
+      assert_equal "BODY!", IO.read("#@tmpdir/dev666/foo")
+    end
+    Process.kill(:QUIT, @pid)
+    _, status = Process.waitpid2(@pid)
+    assert status.success?, status.inspect
+    tmp.rewind
+    assert_match(/W: using internal HTTP for 'server = perlbal'/, tmp.read)
+  end
+
+  def test_unsupported_servers
+    http = rand_port
+    FileUtils.mkpath("#@tmpdir/dev666")
+    @cmd << "--docroot=#@tmpdir"
+    @cmd << "--httplisten=#@host:#@port"
+    tmp = Tempfile.new("err")
+
+    %w(apache lighttpd nginx).each do |srv|
+      cmd = @cmd.dup
+      cmd << "--server=#{srv}"
+      tmp.rewind
+      tmp.truncate(0)
+      pid = fork do
+        $stderr.reopen(tmp)
+        exec(*cmd)
+      end
+      _, status = Process.waitpid2(pid)
+      assert ! status.success?, status.inspect
+      tmp.rewind
+      assert_match(%r{E: 'server = #{srv}' not understood by cmogstored},
+                   tmp.read)
+    end
+  end
 end