lib/httpx/transcoder/chunker.rb in httpx-0.3.1 vs lib/httpx/transcoder/chunker.rb in httpx-0.4.0
- old
+ new
@@ -16,10 +16,11 @@
@raw = body
end
def each
return enum_for(__method__) unless block_given?
+
@raw.each do |chunk|
yield "#{chunk.bytesize.to_s(16)}#{CRLF}#{chunk}#{CRLF}"
end
yield "0#{CRLF}#{CRLF}"
end
@@ -55,10 +56,11 @@
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
@@ -67,14 +69,16 @@
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