about summary refs log tree commit homepage
path: root/t/large-file-response.ru
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2009-10-18 15:59:29 -0700
committerEric Wong <normalperson@yhbt.net>2009-10-18 21:25:47 -0700
commit7b01d94dd9287ac402d91451f1e93c9faaf913c4 (patch)
tree8f4005f4e92108748af53b8cbf709522f33419db /t/large-file-response.ru
parentd0103759ae63b0ed1084f6a9d2b7ede538e8c871 (diff)
downloadrainbows-7b01d94dd9287ac402d91451f1e93c9faaf913c4.tar.gz
This new middleware should be a no-op for non-Rev concurrency
models (or by explicitly setting env['rainbows.autochunk'] to
false).

Setting env['rainbows.autochunk'] to true (the default when Rev
is used) allows (e)poll-able IO objects (sockets, pipes) to be
sent asynchronously after app.call(env) returns.

This also has a fortunate side effect of introducing a code path
which allows large, static files to be sent without slurping
them into a Rev IO::Buffer, too.  This new change works even
without the DevFdResponse middleware, so you won't have to
reconfigure your app.

This lets us epoll on response bodies that come in from a pipe
or even a socket and send them either straight through or with
chunked encoding.
Diffstat (limited to 't/large-file-response.ru')
-rw-r--r--t/large-file-response.ru13
1 files changed, 13 insertions, 0 deletions
diff --git a/t/large-file-response.ru b/t/large-file-response.ru
new file mode 100644
index 0000000..90dc6c5
--- /dev/null
+++ b/t/large-file-response.ru
@@ -0,0 +1,13 @@
+# lib-large-file-response will stop running if we're not on Linux here
+use Rack::ContentLength
+use Rack::ContentType
+map "/rss" do
+  run lambda { |env|
+    # on Linux, this is in kilobytes
+    ::File.read("/proc/self/status") =~ /^VmRSS:\s+(\d+)/
+    [ 200, {}, [ ($1.to_i * 1024).to_s ] ]
+  }
+end
+map "/" do
+  run Rack::File.new(Dir.pwd)
+end