fixing the chunk feature for request bodies (HTTP/1)

This commit is contained in:
HoneyryderChuck 2018-01-28 22:01:20 +00:00
parent 54d5b42d90
commit 526418f5e5
4 changed files with 21 additions and 6 deletions

View File

@ -134,6 +134,10 @@ module HTTPX
def set_request_headers(request)
request.headers["host"] ||= request.authority
request.headers["connection"] ||= "keep-alive"
if !request.headers.key?("content-length") &&
request.body.bytesize == Float::INFINITY
request.chunk!
end
end
def headline_uri(request)

View File

@ -38,6 +38,8 @@ module HTTPX
def_delegator :@body, :<<
def_delegator :@body, :empty?
def_delegator :@body, :chunk!
def initialize(verb, uri, options = {})
@verb = verb.to_s.downcase.to_sym
@ -114,7 +116,7 @@ module HTTPX
end
return if @body.nil?
@headers["content-type"] ||= @body.content_type
@headers["content-length"] = @body.bytesize unless chunked?
@headers["content-length"] = @body.bytesize unless unbounded_body?
end
def each(&block)
@ -132,6 +134,7 @@ module HTTPX
def empty?
return true if @body.nil?
return false if chunked?
bytesize.zero?
end
@ -154,9 +157,17 @@ module HTTPX
encoded
end
def unbounded_body?
chunked? || @body.bytesize == Float::INFINITY
end
def chunked?
@headers["transfer-encoding"] == "chunked"
end
def chunk!
@headers.add("transfer-encoding", "chunked")
end
end
def transition(nextstate)

View File

@ -15,15 +15,15 @@ module HTTPX::Transcoder
@raw = body
end
def bytesize
def bytesize
if @raw.respond_to?(:bytesize)
@raw.bytesize
elsif @raw.respond_to?(:to_ary)
@raw.map(&:bytesize).reduce(0, :+)
elsif @raw.respond_to?(:size)
@raw.size || Float::INFINITY
elsif @raw.respond_to?(:each)
Float::INFINITY
elsif @raw.respond_to?(:size)
@raw.size
else
raise Error, "cannot determine size of body: #{@raw.inspect}"
end

View File

@ -28,8 +28,8 @@ module HTTPX::Transcoder
end
end
def encode(json)
Encoder.new(json)
def encode(chunks)
Encoder.new(chunks)
end
end
register "chunker", Chunker