From fd1007ae33336cb41a1009fcdf2f0682f60d4bed Mon Sep 17 00:00:00 2001 From: Matt Date: Sun, 1 Aug 2021 09:01:13 +0100 Subject: [PATCH] Use external Rack adapter (#1296) --- faraday.gemspec | 1 + lib/faraday.rb | 1 + lib/faraday/adapter.rb | 3 +- lib/faraday/adapter/rack.rb | 75 ------------------------------------- lib/faraday/autoload.rb | 3 +- 5 files changed, 4 insertions(+), 79 deletions(-) delete mode 100644 lib/faraday/adapter/rack.rb diff --git a/faraday.gemspec b/faraday.gemspec index 3a5409233..8350de04f 100644 --- a/faraday.gemspec +++ b/faraday.gemspec @@ -22,6 +22,7 @@ Gem::Specification.new do |spec| # rubocop:disable Metrics/BlockLength spec.add_dependency 'faraday-net_http', '~> 1.0' spec.add_dependency 'faraday-net_http_persistent', '~> 1.1' spec.add_dependency 'faraday-patron', '~> 1.0' + spec.add_dependency 'faraday-rack', '~> 1.0' spec.add_dependency 'multipart-post', '>= 1.2', '< 3' spec.add_dependency 'ruby2_keywords', '>= 0.0.4' diff --git a/lib/faraday.rb b/lib/faraday.rb index bc03961ca..cf8d716bd 100644 --- a/lib/faraday.rb +++ b/lib/faraday.rb @@ -36,6 +36,7 @@ require 'faraday/net_http' require 'faraday/net_http_persistent' require 'faraday/patron' +require 'faraday/rack' # This is the main namespace for Faraday. # diff --git a/lib/faraday/adapter.rb b/lib/faraday/adapter.rb index 4a60e19b0..44828c7df 100644 --- a/lib/faraday/adapter.rb +++ b/lib/faraday/adapter.rb @@ -11,8 +11,7 @@ class Adapter register_middleware File.expand_path('adapter', __dir__), test: [:Test, 'test'], - typhoeus: [:Typhoeus, 'typhoeus'], - rack: [:Rack, 'rack'] + typhoeus: [:Typhoeus, 'typhoeus'] # This module marks an Adapter as supporting parallel requests. module Parallelism diff --git a/lib/faraday/adapter/rack.rb b/lib/faraday/adapter/rack.rb deleted file mode 100644 index 6a237ee13..000000000 --- a/lib/faraday/adapter/rack.rb +++ /dev/null @@ -1,75 +0,0 @@ -# frozen_string_literal: true - -module Faraday - class Adapter - # Sends requests to a Rack app. - # - # @example - # - # class MyRackApp - # def call(env) - # [200, {'Content-Type' => 'text/html'}, ["hello world"]] - # end - # end - # - # Faraday.new do |conn| - # conn.adapter :rack, MyRackApp.new - # end - class Rack < Faraday::Adapter - dependency 'rack/test' - - # not prefixed with "HTTP_" - SPECIAL_HEADERS = %w[CONTENT_LENGTH CONTENT_TYPE].freeze - - def initialize(faraday_app, rack_app) - super(faraday_app) - mock_session = ::Rack::MockSession.new(rack_app) - @session = ::Rack::Test::Session.new(mock_session) - end - - def call(env) - super - rack_env = build_rack_env(env) - - env[:request_headers]&.each do |name, value| - name = name.upcase.tr('-', '_') - name = "HTTP_#{name}" unless SPECIAL_HEADERS.include? name - rack_env[name] = value - end - - timeout = request_timeout(:open, env[:request]) - timeout ||= request_timeout(:read, env[:request]) - response = if timeout - Timer.timeout(timeout, Faraday::TimeoutError) do - execute_request(env, rack_env) - end - else - execute_request(env, rack_env) - end - - if (req = env[:request]).stream_response? - warn "Streaming downloads for #{self.class.name} " \ - 'are not yet implemented.' - req.on_data.call(response.body, response.body.bytesize) - end - - save_response(env, response.status, response.body, response.headers) - @app.call env - end - - private - - def execute_request(env, rack_env) - @session.request(env[:url].to_s, rack_env) - end - - def build_rack_env(env) - { - method: env[:method], - input: env[:body].respond_to?(:read) ? env[:body].read : env[:body], - 'rack.url_scheme' => env[:url].scheme - } - end - end - end -end diff --git a/lib/faraday/autoload.rb b/lib/faraday/autoload.rb index 7fcbe2620..76a0e0e51 100644 --- a/lib/faraday/autoload.rb +++ b/lib/faraday/autoload.rb @@ -59,8 +59,7 @@ class Adapter extend AutoloadHelper autoload_all 'faraday/adapter', Typhoeus: 'typhoeus', - Test: 'test', - Rack: 'rack' + Test: 'test' end # Request represents a single HTTP request for a Faraday adapter to make.