Skip to content

Commit 45476ca

Browse files
amartinfraguaspcai
andauthored
Add global option to set connection middlewares. (#1026)
Co-authored-by: Peter Cai <[email protected]>
1 parent 12a283e commit 45476ca

File tree

4 files changed

+77
-2
lines changed

4 files changed

+77
-2
lines changed

lib/savon/options.rb

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ def initialize(options = {})
9292
:convert_attributes_to => lambda { |k,v| [k,v] },
9393
:multipart => false,
9494
:adapter => nil,
95+
:middlewares => [],
9596
:use_wsa_headers => false,
9697
:no_message_tag => false,
9798
:follow_redirects => false,
@@ -384,6 +385,25 @@ def no_message_tag(bool)
384385
def follow_redirects(follow_redirects)
385386
@options[:follow_redirects] = follow_redirects
386387
end
388+
389+
# Provide middlewares for Faraday connections.
390+
# The argument is an array, with each element being another array
391+
# that contains the middleware class and its arguments, in the same way
392+
# as a normal call to Faraday::RackBuilder#use
393+
#
394+
# See https://lostisland.github.io/faraday/#/middleware/index?id=using-middleware
395+
# For example:
396+
#
397+
# client = Savon.client(
398+
# middlewares: [
399+
# [Faraday::Request::UrlEncoded],
400+
# [Faraday::Response::Logger, { bodies: true }],
401+
# [Faraday::Adapter::NetHttp]
402+
# ]
403+
# )
404+
def middlewares(middlewares)
405+
@options[:middlewares] = middlewares
406+
end
387407
end
388408

389409
class LocalOptions < Options

lib/savon/request.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,12 @@ def configure_logging
8080
connection.response(:logger, @globals[:logger], headers: @globals[:log_headers]) if @globals[:log]
8181
end
8282

83+
def configure_middlewares
84+
@globals[:middlewares].each do |middleware_args|
85+
connection.use(*middleware_args)
86+
end
87+
end
88+
8389
def configure_gzip
8490
if connection.headers['Accept-Encoding'] && connection.headers['Accept-Encoding'].include?('gzip')
8591
connection.request :gzip
@@ -98,6 +104,7 @@ def build
98104
configure_ssl
99105
configure_auth
100106
configure_adapter
107+
configure_middlewares
101108
configure_logging
102109
configure_headers
103110
configure_gzip
@@ -126,6 +133,7 @@ def build(options = {})
126133
configure_headers(options[:soap_action], options[:headers])
127134
configure_cookies(options[:cookies])
128135
configure_adapter
136+
configure_middlewares
129137
configure_logging
130138
configure_redirect_handling
131139
configure_gzip

spec/savon/options_spec.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -947,6 +947,19 @@ def to_s
947947
end
948948
end
949949

950+
context "global :middlewares" do
951+
let(:middlewares) { [[1],[2],[3]] }
952+
953+
it "adds middlewares to the connection" do
954+
middleware_setup = sequence('middleware_setup')
955+
Faraday::Connection.any_instance.expects(:use).with(1).in_sequence(middleware_setup)
956+
Faraday::Connection.any_instance.expects(:use).with(2).in_sequence(middleware_setup)
957+
Faraday::Connection.any_instance.expects(:use).with(3).in_sequence(middleware_setup)
958+
959+
client = new_client(:endpoint => @server.url, :middlewares => middlewares)
960+
end
961+
end
962+
950963
context "global and request :soap_header" do
951964
it "merges the headers if both were provided as Hashes" do
952965
global_soap_header = {

spec/savon/request_spec.rb

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,8 +178,25 @@ def new_wsdl_request
178178
new_wsdl_request.build
179179
end
180180
end
181-
end
182181

182+
describe "middlewares" do
183+
it "are set when specified" do
184+
globals.middlewares([[1], [2, "two", { two: 2 }], [3]])
185+
186+
middleware_setup = sequence('middleware_setup')
187+
http_connection.expects(:use).with(1).in_sequence(middleware_setup)
188+
http_connection.expects(:use).with(2, "two", two: 2).in_sequence(middleware_setup)
189+
http_connection.expects(:use).with(3).in_sequence(middleware_setup)
190+
191+
new_wsdl_request.build
192+
end
193+
194+
it "are not set otherwise" do
195+
http_connection.expects(:use).never
196+
new_wsdl_request.build
197+
end
198+
end
199+
end
183200
end
184201

185202
RSpec.describe Savon::SOAPRequest do
@@ -398,6 +415,23 @@ def new_soap_request
398415
new_soap_request.build
399416
end
400417
end
401-
end
402418

419+
describe "middlewares" do
420+
it "are set when specified" do
421+
globals.middlewares([[1], [2, "two", { two: 2 }], [3]])
422+
423+
middleware_setup = sequence('middleware_setup')
424+
http_connection.expects(:use).with(1).in_sequence(middleware_setup)
425+
http_connection.expects(:use).with(2, "two", two: 2).in_sequence(middleware_setup)
426+
http_connection.expects(:use).with(3).in_sequence(middleware_setup)
427+
428+
new_soap_request.build
429+
end
430+
431+
it "are not set otherwise" do
432+
http_connection.expects(:use).never
433+
new_soap_request.build
434+
end
435+
end
436+
end
403437
end

0 commit comments

Comments
 (0)