Skip to content

Commit 8a2b351

Browse files
Add global option to set connection middlewares.
1 parent 9fb23b3 commit 8a2b351

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
protected
8490
attr_reader :connection
8591
end
@@ -92,6 +98,7 @@ def build
9298
configure_ssl
9399
configure_auth
94100
configure_adapter
101+
configure_middlewares
95102
configure_logging
96103
configure_headers
97104
connection
@@ -119,6 +126,7 @@ def build(options = {})
119126
configure_headers(options[:soap_action], options[:headers])
120127
configure_cookies(options[:cookies])
121128
configure_adapter
129+
configure_middlewares
122130
configure_logging
123131
configure_redirect_handling
124132
yield(connection) if block_given?

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
@@ -376,6 +393,23 @@ def new_soap_request
376393
new_soap_request.build
377394
end
378395
end
379-
end
380396

397+
describe "middlewares" do
398+
it "are set when specified" do
399+
globals.middlewares([[1], [2, "two", { two: 2 }], [3]])
400+
401+
middleware_setup = sequence('middleware_setup')
402+
http_connection.expects(:use).with(1).in_sequence(middleware_setup)
403+
http_connection.expects(:use).with(2, "two", two: 2).in_sequence(middleware_setup)
404+
http_connection.expects(:use).with(3).in_sequence(middleware_setup)
405+
406+
new_soap_request.build
407+
end
408+
409+
it "are not set otherwise" do
410+
http_connection.expects(:use).never
411+
new_soap_request.build
412+
end
413+
end
414+
end
381415
end

0 commit comments

Comments
 (0)