Class: HTTPX::Transcoder::Chunker::Decoder

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/httpx/transcoder/chunker.rb

Instance Method Summary collapse

Constructor Details

#initialize(buffer, trailers = false) ⇒ Decoder

Returns a new instance of Decoder.



42
43
44
45
46
47
48
49
# File 'lib/httpx/transcoder/chunker.rb', line 42

def initialize(buffer, trailers = false)
  @buffer = buffer
  @chunk_length = nil
  @chunk_buffer = "".b
  @finished = false
  @state = :length
  @trailers = trailers
end

Instance Method Details

#eachObject



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/httpx/transcoder/chunker.rb', line 55

def each
  loop do
    case @state
    when :length
      index = @buffer.index(CRLF)
      return unless index && index.positive?

      # Read hex-length
      hexlen = @buffer.slice!(0, index)
      hexlen[/\h/] || raise(Error, "wrong chunk size line: #{hexlen}")
      @chunk_length = hexlen.hex
      # check if is last chunk
      @finished = @chunk_length.zero?
      nextstate(:crlf)
    when :crlf
      crlf_size = @finished && !@trailers ? 4 : 2
      # consume CRLF
      return if @buffer.bytesize < crlf_size
      raise Error, "wrong chunked encoding format" unless @buffer.start_with?(CRLF * (crlf_size / 2))

      @buffer.slice!(0, crlf_size)
      if @chunk_length.nil?
        nextstate(:length)
      else
        return if @finished

        nextstate(:data)
      end
    when :data
      @chunk_buffer << (slice = @buffer.slice!(0, @chunk_length))
      @chunk_length -= slice.bytesize
      if @chunk_length.zero?
        yield @chunk_buffer unless @chunk_buffer.empty?
        @chunk_buffer.clear
        @chunk_length = nil
        nextstate(:crlf)
      end
    end
    break if @buffer.empty?
  end
end

#finished?Boolean

Returns:

  • (Boolean)


97
98
99
# File 'lib/httpx/transcoder/chunker.rb', line 97

def finished?
  @finished
end

#to_sObject



51
52
53
# File 'lib/httpx/transcoder/chunker.rb', line 51

def to_s
  @buffer
end