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.



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

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

Instance Method Details

#eachObject



54
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
# File 'lib/httpx/transcoder/chunker.rb', line 54

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)


93
94
95
# File 'lib/httpx/transcoder/chunker.rb', line 93

def finished?
  @finished
end

#to_sObject



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

def to_s
  @buffer
end