about summary refs log tree commit homepage
diff options
context:
space:
mode:
-rw-r--r--lib/yahns/http_response.rb6
-rw-r--r--lib/yahns/max_body/wrapper.rb2
-rw-r--r--lib/yahns/tee_input.rb1
3 files changed, 7 insertions, 2 deletions
diff --git a/lib/yahns/http_response.rb b/lib/yahns/http_response.rb
index 292fab7..4b36db2 100644
--- a/lib/yahns/http_response.rb
+++ b/lib/yahns/http_response.rb
@@ -162,11 +162,13 @@ module Yahns::HttpResponse # :nodoc:
                     : "Connection: close\r\n\r\n".freeze)
       case rv = kgio_syssend(buf, flags)
       when nil # all done, likely
+        buf.clear
+        buf = nil # recycle any memory we used ASAP
         break
       when String
         flags = MSG_DONTWAIT
-        buf = rv # hope the skb grows
-      when :wait_writable, :wait_readable
+        buf = rv # unlikely, hope the skb grows
+      when :wait_writable, :wait_readable # unlikely
         if k.output_buffering
           alive = hijack ? hijack : alive
           rv = response_header_blocked(rv, buf, body, alive, offset, count)
diff --git a/lib/yahns/max_body/wrapper.rb b/lib/yahns/max_body/wrapper.rb
index b75c3b6..b6ca1a3 100644
--- a/lib/yahns/max_body/wrapper.rb
+++ b/lib/yahns/max_body/wrapper.rb
@@ -48,6 +48,7 @@ class Yahns::MaxBody::Wrapper # :nodoc:
 
       if tmp = checked_read(16384)
         @rbuf << tmp
+        tmp.clear
       elsif @rbuf.empty? # EOF
         return nil
       else # EOF, return whatever is left
@@ -69,6 +70,7 @@ class Yahns::MaxBody::Wrapper # :nodoc:
     while checked_read(16384, tmp)
       rv << tmp
     end
+    tmp.clear
     rv
   end
 end
diff --git a/lib/yahns/tee_input.rb b/lib/yahns/tee_input.rb
index 55b1604..93ec148 100644
--- a/lib/yahns/tee_input.rb
+++ b/lib/yahns/tee_input.rb
@@ -100,6 +100,7 @@ class Yahns::TeeInput < Yahns::StreamInput # :nodoc:
     junk = ''.dup
     rsize = __rsize
     nil while read(rsize, junk)
+    junk.clear
   end
 
   def tee(buffer)