about summary refs log tree commit homepage
path: root/lib/yahns/http_client.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/yahns/http_client.rb')
-rw-r--r--lib/yahns/http_client.rb34
1 files changed, 16 insertions, 18 deletions
diff --git a/lib/yahns/http_client.rb b/lib/yahns/http_client.rb
index db53587..117300e 100644
--- a/lib/yahns/http_client.rb
+++ b/lib/yahns/http_client.rb
@@ -28,15 +28,13 @@ class Yahns::HttpClient < Kgio::Socket # :nodoc:
     when :ignore # :ignore on hijack
       @state = :ignore
       return :ignore
-    when Yahns::StreamFile
-      @state = rv # continue looping
     when true, false # done
       return http_response_done(rv)
     when :ccc_done, :r100_done
       @state = rv
       return :wait_writable
-    else
-      raise "BUG: #{@state.inspect}#wbuf_flush returned #{rv.inspect}"
+    else # Yahns::StreamFile
+      @state = rv # continue looping
     end while true
   end
 
@@ -79,14 +77,14 @@ class Yahns::HttpClient < Kgio::Socket # :nodoc:
   # returns :wait_readable/wait_writable/nil to yield back to epoll
   def fill_body(rsize, rbuf)
     case rv = kgio_tryread(rsize, rbuf)
-    when String
-      @hs.filter_body(rbuf, @hs.buf << rbuf)
-      @input.write(rbuf)
-      true # keep looping on kgio_tryread (but check body_eof? first)
     when :wait_readable, :wait_writable
       rv # have epoll/kqueue wait for more
     when nil # unexpected EOF
       @input.close # nil
+    else # String
+      @hs.filter_body(rbuf, @hs.buf << rbuf)
+      @input.write(rbuf)
+      true # keep looping on kgio_tryread (but check body_eof? first)
     end
   end
 
@@ -94,16 +92,16 @@ class Yahns::HttpClient < Kgio::Socket # :nodoc:
   # returns :wait_readable/wait_writable/nil to yield back to epoll
   def read_trailers(rsize, rbuf)
     case rv = kgio_tryread(rsize, rbuf)
-    when String
+    when :wait_readable, :wait_writable
+      return rv # wait for more
+    when nil # unexpected EOF
+      return @input.close # nil
+    else # String
       if @hs.add_parse(rbuf)
         @input.rewind
         return true
       end
       # keep looping on kgio_tryread...
-    when :wait_readable, :wait_writable
-      return rv # wait for more
-    when nil # unexpected EOF
-      return @input.close # nil
     end while true
   end
 
@@ -132,7 +130,9 @@ class Yahns::HttpClient < Kgio::Socket # :nodoc:
       # continue to outer loop
     when :headers
       case rv = kgio_tryread(k.client_header_buffer_size, rbuf)
-      when String
+      when :wait_readable, :wait_writable, nil
+        return rv
+      else # String
         if @hs.add_parse(rv)
           case input = input_ready
           when :wait_readable, :wait_writable, :close then return input
@@ -142,8 +142,6 @@ class Yahns::HttpClient < Kgio::Socket # :nodoc:
           end
         end
         # keep looping on kgio_tryread
-      when :wait_readable, :wait_writable, nil
-        return rv
       end while true
     when :body
       if @hs.body_eof?
@@ -234,12 +232,12 @@ class Yahns::HttpClient < Kgio::Socket # :nodoc:
   # used by StreamInput (and thus TeeInput) for input_buffering {false|:lazy}
   def yahns_read(bytes, buf)
     case rv = kgio_tryread(bytes, buf)
-    when String, nil
-      return rv
     when :wait_readable
       kgio_wait_readable or raise Yahns::ClientTimeout, "waiting for read", []
     when :wait_writable
       kgio_wait_writable or raise Yahns::ClientTimeout, "waiting for write", []
+    else # String, nil
+      return rv
     end while true
   end