Skip to content

Commit eb69e91

Browse files
committed
replace raw net-http calls with faraday, and allow implementors to provide an alternate Faraday configuration
1 parent afc4a85 commit eb69e91

File tree

3 files changed

+47
-16
lines changed

3 files changed

+47
-16
lines changed

lib/oai/client.rb

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# External dependencies
22
require 'uri'
3-
require 'net/http'
3+
require 'faraday'
44
require 'cgi'
55
require 'iconv'
66

@@ -67,6 +67,11 @@ class Client
6767
# back XML::Node objects
6868
#
6969
# client = OAI::Client.new 'http://example.com', :parser => 'libxml'
70+
#
71+
# You can configure the Faraday HTTP client by providing an alternate
72+
# Faraday instance:
73+
#
74+
# client = OAI::Client.new 'http://example.com', :http => Faraday.new { |c| }
7075
#
7176
# === HIGH PERFORMANCE
7277
#
@@ -77,7 +82,18 @@ def initialize(base_url, options={})
7782
@base = URI.parse base_url
7883
@debug = options.fetch(:debug, false)
7984
@parser = options.fetch(:parser, 'rexml')
85+
8086
@follow_redirects = options.fetch(:redirects, true)
87+
@http_client = options.fetch(:http, Faraday.new(@base))
88+
89+
if !options.key?(:http) and @follow_redirects
90+
91+
count = @folow_redirects if @folow_redirects.is_a? Fixnum
92+
count ||= 5
93+
94+
require 'faraday_middleware'
95+
@http_client.use FaradayMiddleware::FollowRedirects, :limit => count
96+
end
8197

8298
# load appropriate parser
8399
case @parser
@@ -207,21 +223,8 @@ def load_document(xml)
207223

208224
# Do the actual HTTP get, following any temporary redirects
209225
def get(uri)
210-
response = Net::HTTP.get_response(uri)
211-
case response
212-
when Net::HTTPSuccess
213-
return response.body
214-
when Net::HTTPMovedPermanently
215-
if @follow_redirects
216-
response = get(URI.parse(response['location']))
217-
else
218-
raise ArgumentError, "Permanently Redirected to [#{response['location']}]"
219-
end
220-
when Net::HTTPTemporaryRedirect
221-
response = get(URI.parse(response['location']))
222-
else
223-
raise ArgumentError, "#{response.code_type} [#{response.code}]"
224-
end
226+
response = @http_client.get uri
227+
response.body
225228
end
226229

227230
def debug(msg)

ruby-oai.gemspec

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ Gem::Specification.new do |s|
1212
s.executables = 'oai'
1313

1414
s.add_dependency('builder', '>=2.0.0')
15+
s.add_dependency('faraday')
16+
s.add_dependency('faraday_middleware')
1517
s.add_development_dependency('rake')
1618

1719
s.files = %w(README.md Rakefile) +

test/client/tc_http_client.rb

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
require 'test_helper'
2+
3+
class HttpClientTest < Test::Unit::TestCase
4+
5+
def test_pluggable_http_client
6+
oai_response = <<-eos
7+
<Identify>
8+
<repositoryName>Mock OAI Provider</repositoryName>
9+
<baseURL>http://nowhere.example.com</baseURL>
10+
</Identify>
11+
eos
12+
13+
faraday_stub = Faraday.new do |builder|
14+
builder.adapter :test do |stub|
15+
stub.get('/oai?verb=Identify') { [200, {}, oai_response] }
16+
end
17+
end
18+
client = OAI::Client.new 'http://localhost:3333/oai', :http => faraday_stub
19+
response = client.identify
20+
21+
assert_kind_of OAI::IdentifyResponse, response
22+
assert_equal 'Mock OAI Provider [http://nowhere.example.com]', response.to_s
23+
24+
end
25+
end
26+

0 commit comments

Comments
 (0)