|
|
@ -638,29 +638,44 @@ def cache_annotation(db, id, annotations)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
def proxy_file(response, env)
|
|
|
|
def proxy_file(response, env)
|
|
|
|
if !response.body_io?
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if response.headers.includes_word?("Content-Encoding", "gzip")
|
|
|
|
if response.headers.includes_word?("Content-Encoding", "gzip")
|
|
|
|
Gzip::Writer.open(env.response) do |deflate|
|
|
|
|
Gzip::Writer.open(env.response) do |deflate|
|
|
|
|
copy_in_chunks(response.body_io, deflate)
|
|
|
|
response.pipe(deflate)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
elsif response.headers.includes_word?("Content-Encoding", "deflate")
|
|
|
|
elsif response.headers.includes_word?("Content-Encoding", "deflate")
|
|
|
|
Flate::Writer.open(env.response) do |deflate|
|
|
|
|
Flate::Writer.open(env.response) do |deflate|
|
|
|
|
copy_in_chunks(response.body_io, deflate)
|
|
|
|
response.pipe(deflate)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
else
|
|
|
|
else
|
|
|
|
copy_in_chunks(response.body_io, env.response)
|
|
|
|
response.pipe(env.response)
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class HTTP::Client::Response
|
|
|
|
|
|
|
|
def pipe(io)
|
|
|
|
|
|
|
|
HTTP.serialize_body(io, headers, @body, @body_io, @version)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
# https://stackoverflow.com/a/44802810 <3
|
|
|
|
# Supports serialize_body without first writing headers
|
|
|
|
def copy_in_chunks(input, output, chunk_size = 4096)
|
|
|
|
module HTTP
|
|
|
|
size = 1
|
|
|
|
def self.serialize_body(io, headers, body, body_io, version)
|
|
|
|
while size > 0
|
|
|
|
if body
|
|
|
|
size = IO.copy(input, output, chunk_size)
|
|
|
|
io << body
|
|
|
|
Fiber.yield
|
|
|
|
elsif body_io
|
|
|
|
|
|
|
|
content_length = content_length(headers)
|
|
|
|
|
|
|
|
if content_length
|
|
|
|
|
|
|
|
copied = IO.copy(body_io, io)
|
|
|
|
|
|
|
|
if copied != content_length
|
|
|
|
|
|
|
|
raise ArgumentError.new("Content-Length header is #{content_length} but body had #{copied} bytes")
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
elsif Client::Response.supports_chunked?(version)
|
|
|
|
|
|
|
|
headers["Transfer-Encoding"] = "chunked"
|
|
|
|
|
|
|
|
serialize_chunked_body(io, body_io)
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
io << body
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|