about summary refs log tree commit homepage
path: root/lib/unicorn/tmpio.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/unicorn/tmpio.rb')
-rw-r--r--lib/unicorn/tmpio.rb29
1 files changed, 29 insertions, 0 deletions
diff --git a/lib/unicorn/tmpio.rb b/lib/unicorn/tmpio.rb
new file mode 100644
index 0000000..cce89ac
--- /dev/null
+++ b/lib/unicorn/tmpio.rb
@@ -0,0 +1,29 @@
+# -*- encoding: binary -*-
+# :stopdoc:
+require 'tmpdir'
+
+# some versions of Ruby had a broken Tempfile which didn't work
+# well with unlinked files.  This one is much shorter, easier
+# to understand, and slightly faster.
+class Unicorn::TmpIO < File
+
+  # creates and returns a new File object.  The File is unlinked
+  # immediately, switched to binary mode, and userspace output
+  # buffering is disabled
+  def self.new
+    fp = begin
+      open("#{Dir::tmpdir}/#{rand}", RDWR|CREAT|EXCL, 0600)
+    rescue Errno::EEXIST
+      retry
+    end
+    unlink(fp.path)
+    fp.binmode
+    fp.sync = true
+    fp
+  end
+
+  # for easier env["rack.input"] compatibility with Rack <= 1.1
+  def size
+    stat.size
+  end
+end