From 44626254dfed2fc7cce6a74bf423f3effb3e9692 Mon Sep 17 00:00:00 2001 From: Mike Rogers Date: Sun, 11 Jul 2021 15:55:40 -0500 Subject: [PATCH] feat: Adding support for streamed responses Issue: https://github.com/lostisland/faraday-net_http_persistent/issues/5 This adds support for a streamed response and is based on the implementation I saw https://github.com/lostisland/faraday-net_http/blob/9534fd19bd4898f28361ea60dbc3867edadc15ad/lib/faraday/adapter/net_http.rb#L106-L120 --- lib/faraday/adapter/net_http_persistent.rb | 21 ++++++++++++++++++- .../adapter/net_http_persistent_spec.rb | 2 +- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/lib/faraday/adapter/net_http_persistent.rb b/lib/faraday/adapter/net_http_persistent.rb index eb5c597..e978bbc 100644 --- a/lib/faraday/adapter/net_http_persistent.rb +++ b/lib/faraday/adapter/net_http_persistent.rb @@ -50,7 +50,26 @@ def proxy_uri(env) end def perform_request(http, env) - http.request env[:url], create_request(env) + if env[:request].stream_response? + size = 0 + yielded = false + + http_response = http.request(env[:url], create_request(env)) do |response| + response.read_body do |chunk| + if chunk.bytesize.positive? || size.positive? + yielded = true + size += chunk.bytesize + env[:request].on_data.call(chunk, size) + end + end + end + + env[:request].on_data.call(+"", 0) unless yielded + http_response.body = nil + http_response + else + http.request(env[:url], create_request(env)) + end rescue Errno::ETIMEDOUT, Net::OpenTimeout => e raise Faraday::TimeoutError, e rescue Net::HTTP::Persistent::Error => e diff --git a/spec/faraday/adapter/net_http_persistent_spec.rb b/spec/faraday/adapter/net_http_persistent_spec.rb index 37e013f..f7512da 100644 --- a/spec/faraday/adapter/net_http_persistent_spec.rb +++ b/spec/faraday/adapter/net_http_persistent_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true RSpec.describe Faraday::Adapter::NetHttpPersistent do - features :request_body_on_query_methods, :reason_phrase_parse, :compression, :trace_method + features :request_body_on_query_methods, :reason_phrase_parse, :compression, :trace_method, :streaming it_behaves_like "an adapter"