require "httpi/version"
require "httpi/request"
require "httpi/adapter"
# = HTTPI
#
# Executes HTTP requests using a predefined adapter.
module HTTPI
class << self
# Executes an HTTP GET request and returns an HTTPI::Response.
#
# ==== Example
#
# Accepts an HTTPI::Request and an optional adapter:
#
# request = HTTPI::Request.new :url => "http://example.com"
# HTTPI.get request, :httpclient
#
# ==== Shortcut
#
# You can also just pass a URL and an optional adapter if you don't
# need to configure the request:
#
# HTTPI.get "http://example.com", :curb
#
# ==== More control
#
# If you need more control over the request, you can access the HTTP
# client instance represented by your adapter in a block.
#
# HTTPI.get request do |http|
# http.follow_redirect_count = 3 # HTTPClient example
# end
def get(request, adapter = nil)
request = Request.new :url => request if request.kind_of? String
with adapter do |adapter|
yield adapter.client if block_given?
adapter.get request
end
end
# Executes an HTTP POST request and returns an HTTPI::Response.
#
# ==== Example
#
# Accepts an HTTPI::Request and an optional adapter:
#
# request = HTTPI::Request.new
# request.url = "http://example.com"
# request.body = "xml"
#
# HTTPI.post request, :httpclient
#
# ==== Shortcut
#
# You can also just pass a URL, a request body and an optional adapter
# if you don't need to configure the request:
#
# HTTPI.post "http://example.com", "xml", :curb
#
# ==== More control
#
# If you need more control over the request, you can access the HTTP
# client instance represented by your adapter in a block.
#
# HTTPI.post request do |http|
# http.use_ssl = true # Curb example
# end
def post(*args)
request, adapter = extract_post_args(args)
with adapter do |adapter|
yield adapter.client if block_given?
adapter.post request
end
end
private
# Checks whether +args+ contains of an HTTPI::Request or a URL
# and a request body plus an optional adapter and returns an Array with
# an HTTPI::Request and (if given) an adapter.
def extract_post_args(args)
return args if args[0].kind_of? Request
[Request.new(:url => args[0], :body => args[1]), args[2]]
end
# Accepts an +adapter+ (defaults to Adapter.use) and yields a
# new instance of the adapter to a given block.
def with(adapter)
adapter ||= Adapter.use
yield Adapter.find(adapter).new
end
end
end