about summary refs log tree commit homepage
diff options
context:
space:
mode:
-rw-r--r--lib/mongrel.rb6
-rw-r--r--test/test_response.rb13
2 files changed, 18 insertions, 1 deletions
diff --git a/lib/mongrel.rb b/lib/mongrel.rb
index 3bb5447..f30c221 100644
--- a/lib/mongrel.rb
+++ b/lib/mongrel.rb
@@ -322,12 +322,16 @@ module Mongrel
     attr_reader :out
 
     def initialize(out)
+      @sent = {}
       @out = out
     end
 
     # Simply writes "#{key}: #{value}" to an output buffer.
     def[]=(key,value)
-      @out.write(Const::HEADER_FORMAT % [key, value])
+      if not @sent.has_key?(key)
+        @sent[key] = true
+        @out.write(Const::HEADER_FORMAT % [key, value])
+      end
     end
   end
 
diff --git a/test/test_response.rb b/test/test_response.rb
index b68c1ef..c5e1084 100644
--- a/test/test_response.rb
+++ b/test/test_response.rb
@@ -37,6 +37,19 @@ class ResponseTest < Test::Unit::TestCase
     assert io.length > 0, "output didn't have data"
   end
 
+  def test_response_duplicate_header_squash
+    io = StringIO.new
+    resp = HttpResponse.new(io)
+    resp.start do |head,out|
+      head["Content-Length"] = 30
+      head["Content-Length"] = 0
+    end
+
+    resp.finished
+
+    assert_equal io.length, 95, "too much output"
+  end
+
   def test_response_404
     io = StringIO.new