about summary refs log tree commit homepage
path: root/t/preread_input.ru
diff options
context:
space:
mode:
Diffstat (limited to 't/preread_input.ru')
-rw-r--r--t/preread_input.ru22
1 files changed, 14 insertions, 8 deletions
diff --git a/t/preread_input.ru b/t/preread_input.ru
index 79685c4..5f68fe9 100644
--- a/t/preread_input.ru
+++ b/t/preread_input.ru
@@ -1,17 +1,23 @@
 #\-E none
-require 'digest/sha1'
+# frozen_string_literal: false
+require 'digest/md5'
 require 'unicorn/preread_input'
-use Rack::ContentLength
-use Rack::ContentType, "text/plain"
 use Unicorn::PrereadInput
 nr = 0
 run lambda { |env|
   $stderr.write "app dispatch: #{nr += 1}\n"
   input = env["rack.input"]
-  dig = Digest::SHA1.new
-  while buf = input.read(16384)
-    dig.update(buf)
+  dig = Digest::MD5.new
+  if buf = input.read(16384)
+    begin
+      dig.update(buf)
+    end while input.read(16384, buf)
+    buf.clear # remove this call if Ruby ever gets escape analysis
   end
-
-  [ 200, {}, [ "#{dig.hexdigest}\n" ] ]
+  if env['HTTP_TRAILER'] =~ /\bContent-MD5\b/i
+    cmd5_b64 = env['HTTP_CONTENT_MD5'] or return [500, {}, ['No Content-MD5']]
+    cmd5_bin = cmd5_b64.unpack('m')[0]
+    return [500, {}, [ cmd5_b64 ] ] if cmd5_bin != dig.digest
+  end
+  [ 200, {}, [ dig.hexdigest ] ]
 }