To support streaming responses in a custom Faraday adapter, you must check if the user requested streaming via env.stream_response?. If true, use env.stream_response to obtain a callback that allows you to pass data chunks to the user.
When streaming, the response body is consumed by the callback, so it is recommended to set http_response.body = nil to avoid redundant memory usage. If streaming is not requested, perform the request normally.
module Faraday
class Adapter
class FlorpHttp < Faraday::Adapter
def call(env)
super
if env.stream_response? # check if the user wants to stream the response
# start a streaming response.
# on_data is a block that will let users consume the response body
http_response = env.stream_response do |&on_data|
# perform the request using FlorpHttp
# the block will be called for each chunk of data
FlorpHttp.perform_request(...) do |chunk|
on_data.call(chunk)
end
end
# the body is already consumed by the block
# so it's good practice to set it to nil
http_response.body = nil
else
# perform the request normally, no streaming.
http_response = FlorpHttp.perform_request(...)
end
save_response(env, http_response.status, http_response.body, http_response.headers, http_response.reason_phrase)
end
end
end
end