Sha256: 61b1d00c9654f8950fa984b67052f31fba844790617b85375bd5e7477644d979

Contents?: true

Size: 1.46 KB

Versions: 5

Compression:

Stored size: 1.46 KB

Contents

require 'forwardable'
require 'http/client'

module HTTP
  class Response
    # A streamable response body, also easily converted into a string
    class Body
      extend Forwardable
      include Enumerable
      def_delegator :to_s, :empty?

      def initialize(client)
        @client    = client
        @streaming = nil
        @contents  = nil
      end

      # (see HTTP::Client#readpartial)
      def readpartial(*args)
        stream!
        @client.readpartial(*args)
      end

      # Iterate over the body, allowing it to be enumerable
      def each
        while (chunk = readpartial)
          yield chunk
        end
      end

      # @return [String] eagerly consume the entire body as a string
      def to_s
        return @contents if @contents
        fail StateError, 'body is being streamed' unless @streaming.nil?

        begin
          @streaming = false
          @contents = ''
          while (chunk = @client.readpartial)
            @contents << chunk
          end
        rescue
          @contents = nil
          raise
        end

        @contents
      end
      alias_method :to_str, :to_s

      # Assert that the body is actively being streamed
      def stream!
        fail StateError, 'body has already been consumed' if @streaming == false
        @streaming = true
      end

      # Easier to interpret string inspect
      def inspect
        "#<#{self.class}:#{object_id.to_s(16)} @streaming=#{!!@streaming}>"
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
http-0.7.4 lib/http/response/body.rb
http-0.7.3 lib/http/response/body.rb
http-0.7.2 lib/http/response/body.rb
http-0.7.1 lib/http/response/body.rb
http-0.7.0 lib/http/response/body.rb