2009-08-22 10:36:41 -04:00
require 'pathname'
2008-07-27 11:52:18 -04:00
require 'net/http'
require 'net/https'
2010-06-09 19:00:41 -04:00
require 'uri'
require 'zlib'
2011-07-07 10:29:02 -04:00
require 'multi_xml'
2018-10-20 12:49:14 -04:00
require 'mime/types'
2013-06-14 16:24:45 -04:00
require 'json'
2014-02-08 12:32:43 -05:00
require 'csv'
2008-11-08 13:59:57 -05:00
2011-04-15 18:29:55 -04:00
require 'httparty/module_inheritable_attributes'
require 'httparty/cookie_hash'
require 'httparty/net_digest_auth'
2011-04-16 14:43:20 -04:00
require 'httparty/version'
2012-08-13 19:36:35 -04:00
require 'httparty/connection_adapter'
2013-08-16 14:59:23 -04:00
require 'httparty/logger/logger'
2019-02-11 08:49:30 -05:00
require 'httparty/request/body'
require 'httparty/fragment_with_response'
require 'httparty/text_encoder'
2009-06-23 20:28:42 -04:00
2010-12-10 16:47:42 -05:00
# @see HTTParty::ClassMethods
2009-01-28 14:06:46 -05:00
module HTTParty
2008-07-27 11:52:18 -04:00
def self . included ( base )
base . extend ClassMethods
2014-12-25 04:58:37 -05:00
base . send :include , ModuleInheritableAttributes
2008-11-30 23:58:06 -05:00
base . send ( :mattr_inheritable , :default_options )
2009-06-23 20:28:42 -04:00
base . send ( :mattr_inheritable , :default_cookies )
2008-11-30 23:58:06 -05:00
base . instance_variable_set ( " @default_options " , { } )
2009-06-23 20:28:42 -04:00
base . instance_variable_set ( " @default_cookies " , CookieHash . new )
2008-07-27 11:52:18 -04:00
end
2009-11-09 22:09:33 -05:00
2011-01-12 14:30:31 -05:00
# == Common Request Options
2012-04-13 19:22:51 -04:00
# Request methods (get, post, patch, put, delete, head, options) all take a common set of options. These are:
2011-01-12 14:30:31 -05:00
#
2014-07-20 16:14:39 -04:00
# [:+body+:] Body of the request. If passed an object that responds to #to_hash, will try to normalize it first, by default passing it to ActiveSupport::to_params. Any other kind of object will get used as-is.
2011-01-12 14:30:31 -05:00
# [:+http_proxyaddr+:] Address of proxy server to use.
# [:+http_proxyport+:] Port of proxy server to use.
2012-03-28 11:51:31 -04:00
# [:+http_proxyuser+:] User for proxy server authentication.
# [:+http_proxypass+:] Password for proxy server authentication.
2011-01-12 14:30:31 -05:00
# [:+limit+:] Maximum number of redirects to follow. Takes precedences over :+no_follow+.
2014-07-20 16:14:39 -04:00
# [:+query+:] Query string, or an object that responds to #to_hash representing it. Normalized according to the same rules as :+body+. If you specify this on a POST, you must use an object which responds to #to_hash. See also HTTParty::ClassMethods.default_params.
2011-01-12 14:30:31 -05:00
# [:+timeout+:] Timeout for opening connection and reading data.
2013-09-24 13:44:36 -04:00
# [:+local_host:] Local address to bind to before connecting.
# [:+local_port:] Local port to bind to before connecting.
2016-08-02 08:40:37 -04:00
# [:+body_stream:] Allow streaming to a REST server to specify a body_stream.
2015-07-06 11:52:46 -04:00
# [:+stream_body:] Allow for streaming large files without loading them into memory.
2018-10-31 01:03:05 -04:00
# [:+multipart:] Force content-type to be multipart
2011-01-12 14:30:31 -05:00
#
# There are also another set of options with names corresponding to various class methods. The methods in question are those that let you set a class-wide default, and the options override the defaults on a request-by-request basis. Those options are:
# * :+base_uri+: see HTTParty::ClassMethods.base_uri.
# * :+basic_auth+: see HTTParty::ClassMethods.basic_auth. Only one of :+basic_auth+ and :+digest_auth+ can be used at a time; if you try using both, you'll get an ArgumentError.
# * :+debug_output+: see HTTParty::ClassMethods.debug_output.
# * :+digest_auth+: see HTTParty::ClassMethods.digest_auth. Only one of :+basic_auth+ and :+digest_auth+ can be used at a time; if you try using both, you'll get an ArgumentError.
# * :+format+: see HTTParty::ClassMethods.format.
2014-07-20 16:14:39 -04:00
# * :+headers+: see HTTParty::ClassMethods.headers. Must be a an object which responds to #to_hash.
2011-01-12 14:30:31 -05:00
# * :+maintain_method_across_redirects+: see HTTParty::ClassMethods.maintain_method_across_redirects.
# * :+no_follow+: see HTTParty::ClassMethods.no_follow.
# * :+parser+: see HTTParty::ClassMethods.parser.
2015-05-14 02:12:27 -04:00
# * :+uri_adapter+: see HTTParty::ClassMethods.uri_adapter
2012-08-13 19:36:35 -04:00
# * :+connection_adapter+: see HTTParty::ClassMethods.connection_adapter.
2011-01-12 14:30:31 -05:00
# * :+pem+: see HTTParty::ClassMethods.pem.
# * :+query_string_normalizer+: see HTTParty::ClassMethods.query_string_normalizer
# * :+ssl_ca_file+: see HTTParty::ClassMethods.ssl_ca_file.
2012-08-13 19:36:35 -04:00
# * :+ssl_ca_path+: see HTTParty::ClassMethods.ssl_ca_path.
2011-01-12 14:30:31 -05:00
2008-12-06 22:47:01 -05:00
module ClassMethods
2013-08-16 14:59:23 -04:00
# Turns on logging
#
# class Foo
# include HTTParty
# logger Logger.new('http_logger'), :info, :apache
# end
2015-04-18 06:27:50 -04:00
def logger ( logger , level = :info , format = :apache )
2013-08-16 14:59:23 -04:00
default_options [ :logger ] = logger
default_options [ :log_level ] = level
default_options [ :log_format ] = format
end
2015-12-28 16:14:12 -05:00
# Raises HTTParty::ResponseError if response's code matches this statuses
#
# class Foo
# include HTTParty
# raise_on [404, 500]
# end
def raise_on ( codes = [ ] )
default_options [ :raise_on ] = * codes
end
2009-01-31 01:14:04 -05:00
# Allows setting http proxy information to be used
#
# class Foo
# include HTTParty
2012-03-28 11:51:31 -04:00
# http_proxy 'http://foo.com', 80, 'user', 'pass'
2009-01-31 01:14:04 -05:00
# end
2015-04-18 06:27:50 -04:00
def http_proxy ( addr = nil , port = nil , user = nil , pass = nil )
2008-11-08 13:59:57 -05:00
default_options [ :http_proxyaddr ] = addr
default_options [ :http_proxyport ] = port
2012-03-28 11:51:31 -04:00
default_options [ :http_proxyuser ] = user
default_options [ :http_proxypass ] = pass
2008-08-18 15:48:54 -04:00
end
2009-11-09 22:09:33 -05:00
2009-01-31 01:14:04 -05:00
# Allows setting a base uri to be used for each request.
# Will normalize uri to include http, etc.
#
# class Foo
# include HTTParty
# base_uri 'twitter.com'
# end
2015-04-18 06:27:50 -04:00
def base_uri ( uri = nil )
2008-11-08 13:59:57 -05:00
return default_options [ :base_uri ] unless uri
2008-12-06 23:41:28 -05:00
default_options [ :base_uri ] = HTTParty . normalize_base_uri ( uri )
2008-07-27 14:44:18 -04:00
end
2009-11-09 22:09:33 -05:00
2009-01-31 01:14:04 -05:00
# Allows setting basic authentication username and password.
#
# class Foo
# include HTTParty
# basic_auth 'username', 'password'
# end
2008-07-27 14:44:18 -04:00
def basic_auth ( u , p )
2014-05-15 16:45:32 -04:00
default_options [ :basic_auth ] = { username : u , password : p }
2008-07-27 11:52:18 -04:00
end
2009-11-09 22:09:33 -05:00
2010-02-09 21:50:53 -05:00
# Allows setting digest authentication username and password.
#
# class Foo
# include HTTParty
# digest_auth 'username', 'password'
# end
def digest_auth ( u , p )
2014-05-15 16:45:32 -04:00
default_options [ :digest_auth ] = { username : u , password : p }
2010-02-09 21:50:53 -05:00
end
2010-12-10 16:47:42 -05:00
# Do not send rails style query strings.
2016-09-11 01:31:10 -04:00
# Specifically, don't use bracket notation when sending an array
2010-12-10 16:47:42 -05:00
#
# For a query:
2014-05-15 16:45:32 -04:00
# get '/', query: {selected_ids: [1,2,3]}
2010-12-10 16:47:42 -05:00
#
# The default query string looks like this:
# /?selected_ids[]=1&selected_ids[]=2&selected_ids[]=3
#
# Call `disable_rails_query_string_format` to transform the query string
# into:
# /?selected_ids=1&selected_ids=2&selected_ids=3
#
# @example
# class Foo
# include HTTParty
# disable_rails_query_string_format
# end
def disable_rails_query_string_format
query_string_normalizer Request :: NON_RAILS_QUERY_STRING_NORMALIZER
end
2009-01-31 01:14:04 -05:00
# Allows setting default parameters to be appended to each request.
# Great for api keys and such.
#
# class Foo
# include HTTParty
2014-05-15 16:45:32 -04:00
# default_params api_key: 'secret', another: 'foo'
2009-01-31 01:14:04 -05:00
# end
2015-04-18 06:27:50 -04:00
def default_params ( h = { } )
2016-04-01 09:31:01 -04:00
raise ArgumentError , 'Default params must be an object which responds to #to_hash' unless h . respond_to? ( :to_hash )
2008-11-08 13:59:57 -05:00
default_options [ :default_params ] || = { }
default_options [ :default_params ] . merge! ( h )
2008-07-28 12:08:21 -04:00
end
2009-11-09 22:09:33 -05:00
2010-04-12 04:45:27 -04:00
# Allows setting a default timeout for all HTTP calls
# Timeout is specified in seconds.
#
# class Foo
# include HTTParty
# default_timeout 10
# end
def default_timeout ( t )
2011-02-17 13:55:48 -05:00
raise ArgumentError , 'Timeout must be an integer or float' unless t && ( t . is_a? ( Integer ) || t . is_a? ( Float ) )
2010-04-12 04:45:27 -04:00
default_options [ :timeout ] = t
end
2014-03-10 11:35:24 -04:00
# Allows setting a default open_timeout for all HTTP calls in seconds
#
# class Foo
# include HTTParty
# open_timeout 10
# end
def open_timeout ( t )
2014-03-13 10:01:05 -04:00
raise ArgumentError , 'open_timeout must be an integer or float' unless t && ( t . is_a? ( Integer ) || t . is_a? ( Float ) )
default_options [ :open_timeout ] = t
2014-03-10 11:35:24 -04:00
end
# Allows setting a default read_timeout for all HTTP calls in seconds
#
# class Foo
# include HTTParty
# read_timeout 10
# end
def read_timeout ( t )
2014-03-13 07:00:32 -04:00
raise ArgumentError , 'read_timeout must be an integer or float' unless t && ( t . is_a? ( Integer ) || t . is_a? ( Float ) )
default_options [ :read_timeout ] = t
2014-03-10 11:35:24 -04:00
end
2010-01-24 22:59:55 -05:00
# Set an output stream for debugging, defaults to $stderr.
# The output stream is passed on to Net::HTTP#set_debug_output.
#
# class Foo
# include HTTParty
# debug_output $stderr
# end
def debug_output ( stream = $stderr )
default_options [ :debug_output ] = stream
end
2010-04-10 23:50:49 -04:00
# Allows setting HTTP headers to be used for each request.
2009-01-31 01:14:04 -05:00
#
# class Foo
# include HTTParty
# headers 'Accept' => 'text/html'
# end
2017-04-12 18:01:29 -04:00
def headers ( h = nil )
if h
raise ArgumentError , 'Headers must be an object which responds to #to_hash' unless h . respond_to? ( :to_hash )
default_options [ :headers ] || = { }
default_options [ :headers ] . merge! ( h . to_hash )
else
default_options [ :headers ] || { }
end
2008-07-28 12:08:21 -04:00
end
2009-01-28 23:54:42 -05:00
2015-04-18 06:27:50 -04:00
def cookies ( h = { } )
2016-04-01 09:31:01 -04:00
raise ArgumentError , 'Cookies must be an object which responds to #to_hash' unless h . respond_to? ( :to_hash )
2009-06-23 20:28:42 -04:00
default_cookies . add_cookies ( h )
2009-01-28 23:54:42 -05:00
end
2009-11-09 22:09:33 -05:00
2011-01-18 15:36:56 -05:00
# Proceed to the location header when an HTTP response dictates a redirect.
# Redirects are always followed by default.
#
# @example
# class Foo
# include HTTParty
# base_uri 'http://google.com'
# follow_redirects true
# end
def follow_redirects ( value = true )
default_options [ :follow_redirects ] = value
end
2009-01-31 01:14:04 -05:00
# Allows setting the format with which to parse.
# Must be one of the allowed formats ie: json, xml
#
# class Foo
# include HTTParty
# format :json
# end
2009-12-05 21:00:36 -05:00
def format ( f = nil )
if f . nil?
default_options [ :format ]
else
parser ( Parser ) if parser . nil?
default_options [ :format ] = f
validate_format
end
2008-07-28 12:40:40 -04:00
end
2009-11-09 22:09:33 -05:00
2010-01-29 16:57:35 -05:00
# Declare whether or not to follow redirects. When true, an
# {HTTParty::RedirectionTooDeep} error will raise upon encountering a
# redirect. You can then gain access to the response object via
# HTTParty::RedirectionTooDeep#response.
#
# @see HTTParty::ResponseError#response
#
# @example
# class Foo
# include HTTParty
# base_uri 'http://google.com'
# no_follow true
# end
#
# begin
# Foo.get('/')
# rescue HTTParty::RedirectionTooDeep => e
# puts e.response.body
# end
def no_follow ( value = false )
default_options [ :no_follow ] = value
end
2010-02-09 22:02:15 -05:00
# Declare that you wish to maintain the chosen HTTP method across redirects.
2015-08-22 14:03:18 -04:00
# The default behavior is to follow redirects via the GET method, except
# if you are making a HEAD request, in which case the default is to
# follow all redirects with HEAD requests.
2010-02-09 22:02:15 -05:00
# If you wish to maintain the original method, you can set this option to true.
#
# @example
# class Foo
# include HTTParty
# base_uri 'http://google.com'
# maintain_method_across_redirects true
# end
def maintain_method_across_redirects ( value = true )
default_options [ :maintain_method_across_redirects ] = value
end
2014-07-31 08:26:35 -04:00
# Declare that you wish to resend the full HTTP request across redirects,
# even on redirects that should logically become GET requests.
# A 303 redirect in HTTP signifies that the redirected url should normally
# retrieved using a GET request, for instance, it is the output of a previous
# POST. maintain_method_across_redirects respects this behavior, but you
# can force HTTParty to resend_on_redirect even on 303 responses.
#
# @example
# class Foo
# include HTTParty
# base_uri 'http://google.com'
# resend_on_redirect
# end
def resend_on_redirect ( value = true )
default_options [ :resend_on_redirect ] = value
end
2009-11-19 18:03:59 -05:00
# Allows setting a PEM file to be used
#
# class Foo
# include HTTParty
2010-11-24 12:27:45 -05:00
# pem File.read('/home/user/my.pem'), "optional password"
2009-11-19 18:03:59 -05:00
# end
2015-04-18 06:27:50 -04:00
def pem ( pem_contents , password = nil )
2009-11-20 17:45:06 -05:00
default_options [ :pem ] = pem_contents
2010-11-24 12:27:45 -05:00
default_options [ :pem_password ] = password
2009-11-19 18:03:59 -05:00
end
2013-10-22 06:45:03 -04:00
# Allows setting a PKCS12 file to be used
#
# class Foo
# include HTTParty
# pkcs12 File.read('/home/user/my.p12'), "password"
# end
def pkcs12 ( p12_contents , password )
default_options [ :p12 ] = p12_contents
default_options [ :p12_password ] = password
end
2010-10-29 09:09:47 -04:00
# Override the way query strings are normalized.
# Helpful for overriding the default rails normalization of Array queries.
#
# For a query:
2014-05-15 16:45:32 -04:00
# get '/', query: {selected_ids: [1,2,3]}
2010-10-29 09:09:47 -04:00
#
# The default query string normalizer returns:
# /?selected_ids[]=1&selected_ids[]=2&selected_ids[]=3
#
# Let's change it to this:
# /?selected_ids=1&selected_ids=2&selected_ids=3
#
# Pass a Proc to the query normalizer which accepts the yielded query.
#
# @example Modifying Array query strings
# class ServiceWrapper
# include HTTParty
#
# query_string_normalizer proc { |query|
# query.map do |key, value|
# value.map {|v| "#{key}=#{v}"}
# end.join('&')
# }
# end
#
2010-12-10 16:47:42 -05:00
# @param [Proc] normalizer custom query string normalizer.
# @yield [Hash, String] query string
# @yieldreturn [Array] an array that will later be joined with '&'
2010-10-29 09:09:47 -04:00
def query_string_normalizer ( normalizer )
default_options [ :query_string_normalizer ] = normalizer
end
2012-11-30 14:08:17 -05:00
# Allows setting of SSL version to use. This only works in Ruby 1.9+.
2012-08-20 09:08:25 -04:00
# You can get a list of valid versions from OpenSSL::SSL::SSLContext::METHODS.
#
# class Foo
# include HTTParty
# ssl_version :SSLv3
# end
def ssl_version ( version )
default_options [ :ssl_version ] = version
end
2012-11-30 14:08:17 -05:00
# Allows setting of SSL ciphers to use. This only works in Ruby 1.9+.
# You can get a list of valid specific ciphers from OpenSSL::Cipher.ciphers.
2013-04-18 08:09:21 -04:00
# You also can specify a cipher suite here, listed here at openssl.org:
2012-11-30 14:08:17 -05:00
# http://www.openssl.org/docs/apps/ciphers.html#CIPHER_SUITE_NAMES
#
# class Foo
# include HTTParty
# ciphers "RC4-SHA"
# end
def ciphers ( cipher_names )
default_options [ :ciphers ] = cipher_names
end
2013-07-11 16:28:57 -04:00
# Allows setting an OpenSSL certificate authority file. The file
# should contain one or more certificates in PEM format.
#
# Setting this option enables certificate verification. All
# certificates along a chain must be available in ssl_ca_file or
# ssl_ca_path for verification to succeed.
#
2010-07-08 22:21:38 -04:00
#
# class Foo
# include HTTParty
# ssl_ca_file '/etc/ssl/certs/ca-certificates.crt'
# end
def ssl_ca_file ( path )
default_options [ :ssl_ca_file ] = path
end
2013-07-11 16:28:57 -04:00
# Allows setting an OpenSSL certificate authority path (directory).
#
# Setting this option enables certificate verification. All
# certificates along a chain must be available in ssl_ca_file or
# ssl_ca_path for verification to succeed.
2010-07-08 22:21:38 -04:00
#
# class Foo
# include HTTParty
# ssl_ca_path '/etc/ssl/certs/'
# end
def ssl_ca_path ( path )
default_options [ :ssl_ca_path ] = path
end
2009-09-08 23:34:21 -04:00
# Allows setting a custom parser for the response.
#
# class Foo
# include HTTParty
# parser Proc.new {|data| ...}
# end
2010-01-27 02:27:11 -05:00
def parser ( custom_parser = nil )
if custom_parser . nil?
2009-12-05 21:00:36 -05:00
default_options [ :parser ]
else
2010-01-27 02:27:11 -05:00
default_options [ :parser ] = custom_parser
2009-12-05 21:00:36 -05:00
validate_format
end
2009-09-08 23:34:21 -04:00
end
2009-11-09 22:09:33 -05:00
2015-05-14 02:12:27 -04:00
# Allows setting a custom URI adapter.
#
# class Foo
# include HTTParty
# uri_adapter Addressable::URI
# end
def uri_adapter ( uri_adapter )
raise ArgumentError , 'The URI adapter should respond to #parse' unless uri_adapter . respond_to? ( :parse )
default_options [ :uri_adapter ] = uri_adapter
end
2012-08-13 19:36:35 -04:00
# Allows setting a custom connection_adapter for the http connections
2012-08-10 17:01:50 -04:00
#
2012-08-13 19:36:35 -04:00
# @example
# class Foo
# include HTTParty
# connection_adapter Proc.new {|uri, options| ... }
# end
#
# @example provide optional configuration for your connection_adapter
2012-08-10 17:01:50 -04:00
# class Foo
# include HTTParty
2014-05-15 16:45:32 -04:00
# connection_adapter Proc.new {|uri, options| ... }, {foo: :bar}
2012-08-10 17:01:50 -04:00
# end
#
2012-08-13 19:36:35 -04:00
# @see HTTParty::ConnectionAdapter
def connection_adapter ( custom_adapter = nil , options = nil )
if custom_adapter . nil?
default_options [ :connection_adapter ]
2012-08-10 17:01:50 -04:00
else
2012-08-13 19:36:35 -04:00
default_options [ :connection_adapter ] = custom_adapter
default_options [ :connection_adapter_options ] = options
2012-08-10 17:01:50 -04:00
end
end
2009-01-31 01:14:04 -05:00
# Allows making a get request to a url.
#
# class Foo
# include HTTParty
# end
2009-11-09 22:09:33 -05:00
#
2009-01-31 01:14:04 -05:00
# # Simple get with full url
# Foo.get('http://foo.com/resource.json')
2009-11-09 22:09:33 -05:00
#
2009-01-31 01:14:04 -05:00
# # Simple get with full url and query parameters
# # ie: http://foo.com/resource.json?limit=10
2014-05-15 16:45:32 -04:00
# Foo.get('http://foo.com/resource.json', query: {limit: 10})
2015-04-18 06:27:50 -04:00
def get ( path , options = { } , & block )
2012-02-15 14:46:01 -05:00
perform_request Net :: HTTP :: Get , path , options , & block
2008-07-27 14:44:18 -04:00
end
2009-11-09 22:09:33 -05:00
2009-01-31 01:14:04 -05:00
# Allows making a post request to a url.
#
# class Foo
# include HTTParty
# end
2009-11-09 22:09:33 -05:00
#
2009-01-31 01:14:04 -05:00
# # Simple post with full url and setting the body
2014-05-15 16:45:32 -04:00
# Foo.post('http://foo.com/resources', body: {bar: 'baz'})
2009-01-31 01:14:04 -05:00
#
2009-11-09 22:09:33 -05:00
# # Simple post with full url using :query option,
2016-05-19 14:37:05 -04:00
# # which appends the parameters to the URI.
2014-05-15 16:45:32 -04:00
# Foo.post('http://foo.com/resources', query: {bar: 'baz'})
2015-04-18 06:27:50 -04:00
def post ( path , options = { } , & block )
2012-02-15 14:46:01 -05:00
perform_request Net :: HTTP :: Post , path , options , & block
2008-07-27 14:44:18 -04:00
end
2008-07-28 12:40:40 -04:00
2012-04-13 19:22:51 -04:00
# Perform a PATCH request to a path
2015-04-18 06:27:50 -04:00
def patch ( path , options = { } , & block )
2012-04-13 19:22:51 -04:00
perform_request Net :: HTTP :: Patch , path , options , & block
end
2010-01-29 16:57:27 -05:00
# Perform a PUT request to a path
2015-04-18 06:27:50 -04:00
def put ( path , options = { } , & block )
2012-02-15 14:46:01 -05:00
perform_request Net :: HTTP :: Put , path , options , & block
2008-07-27 14:44:18 -04:00
end
2008-07-28 12:40:40 -04:00
2010-01-29 16:57:27 -05:00
# Perform a DELETE request to a path
2015-04-18 06:27:50 -04:00
def delete ( path , options = { } , & block )
2012-02-15 14:46:01 -05:00
perform_request Net :: HTTP :: Delete , path , options , & block
2008-07-27 14:44:18 -04:00
end
2009-11-09 22:09:33 -05:00
2013-01-17 00:01:17 -05:00
# Perform a MOVE request to a path
2015-04-18 06:27:50 -04:00
def move ( path , options = { } , & block )
2013-01-17 00:01:17 -05:00
perform_request Net :: HTTP :: Move , path , options , & block
end
2013-02-07 09:34:32 -05:00
# Perform a COPY request to a path
2015-04-18 06:27:50 -04:00
def copy ( path , options = { } , & block )
2013-02-07 09:34:32 -05:00
perform_request Net :: HTTP :: Copy , path , options , & block
end
2010-01-29 16:57:27 -05:00
# Perform a HEAD request to a path
2015-04-18 06:27:50 -04:00
def head ( path , options = { } , & block )
2015-08-24 18:46:07 -04:00
ensure_method_maintained_across_redirects options
2012-02-15 14:46:01 -05:00
perform_request Net :: HTTP :: Head , path , options , & block
2009-11-22 23:18:29 -05:00
end
2010-01-29 16:57:27 -05:00
# Perform an OPTIONS request to a path
2015-04-18 06:27:50 -04:00
def options ( path , options = { } , & block )
2012-02-15 14:46:01 -05:00
perform_request Net :: HTTP :: Options , path , options , & block
2009-11-22 23:18:29 -05:00
end
2016-03-11 02:43:38 -05:00
# Perform a MKCOL request to a path
def mkcol ( path , options = { } , & block )
perform_request Net :: HTTP :: Mkcol , path , options , & block
end
2018-05-02 16:26:33 -04:00
def lock ( path , options = { } , & block )
perform_request Net :: HTTP :: Lock , path , options , & block
end
def unlock ( path , options = { } , & block )
perform_request Net :: HTTP :: Unlock , path , options , & block
end
2015-04-17 19:03:33 -04:00
attr_reader :default_options
2008-11-08 13:59:57 -05:00
2008-07-27 11:52:18 -04:00
private
2009-12-05 21:00:36 -05:00
2015-08-24 18:46:07 -04:00
def ensure_method_maintained_across_redirects ( options )
2016-01-13 16:42:39 -05:00
unless options . key? ( :maintain_method_across_redirects )
2015-08-24 18:46:07 -04:00
options [ :maintain_method_across_redirects ] = true
end
end
2015-04-18 07:44:56 -04:00
def perform_request ( http_method , path , options , & block ) #:nodoc:
options = ModuleInheritableAttributes . hash_deep_dup ( default_options ) . merge ( options )
process_headers ( options )
process_cookies ( options )
Request . new ( http_method , path , options ) . perform ( & block )
end
2009-01-28 23:54:42 -05:00
2015-04-18 07:44:56 -04:00
def process_headers ( options )
2018-12-06 12:26:42 -05:00
if options [ :headers ]
if headers . any?
options [ :headers ] = headers . merge ( options [ :headers ] )
end
2018-11-11 07:39:38 -05:00
options [ :headers ] = Utils . stringify_keys ( process_dynamic_headers ( options [ :headers ] ) )
2014-02-08 23:02:18 -05:00
end
2015-04-18 07:44:56 -04:00
end
2014-02-08 23:02:18 -05:00
2018-08-17 12:53:27 -04:00
def process_dynamic_headers ( headers )
2018-08-27 00:28:31 -04:00
headers . each_with_object ( { } ) do | header , processed_headers |
key , value = header
processed_headers [ key ] = value . respond_to? ( :call ) ? value . call : value
2018-08-17 13:28:38 -04:00
end
2018-08-17 12:53:27 -04:00
end
2015-04-18 07:44:56 -04:00
def process_cookies ( options ) #:nodoc:
return unless options [ :cookies ] || default_cookies . any?
options [ :headers ] || = headers . dup
options [ :headers ] [ " cookie " ] = cookies . merge ( options . delete ( :cookies ) || { } ) . to_cookie_string
end
2009-12-05 21:00:36 -05:00
2015-04-18 07:44:56 -04:00
def validate_format
if format && parser . respond_to? ( :supports_format? ) && ! parser . supports_format? ( format )
2018-10-08 07:44:44 -04:00
supported_format_names = parser . supported_formats . map ( & :to_s ) . sort . join ( ', ' )
raise UnsupportedFormat , " ' #{ format . inspect } ' Must be one of: #{ supported_format_names } "
2009-12-05 21:00:36 -05:00
end
2015-04-18 07:44:56 -04:00
end
2008-07-27 11:52:18 -04:00
end
2008-12-05 16:13:11 -05:00
2008-12-06 23:41:28 -05:00
def self . normalize_base_uri ( url ) #:nodoc:
2009-03-03 11:13:41 -05:00
normalized_url = url . dup
2012-05-04 18:26:55 -04:00
use_ssl = ( normalized_url =~ / ^https / ) || ( normalized_url =~ / :443 \ b / )
2009-03-03 11:13:41 -05:00
ends_with_slash = normalized_url =~ / \/ $ /
2009-11-09 22:09:33 -05:00
2009-03-03 11:13:41 -05:00
normalized_url . chop! if ends_with_slash
normalized_url . gsub! ( / ^https?: \/ \/ /i , '' )
2009-11-09 22:09:33 -05:00
2009-03-03 11:13:41 -05:00
" http #{ 's' if use_ssl } :// #{ normalized_url } "
2008-12-06 23:41:28 -05:00
end
2009-11-09 22:09:33 -05:00
2009-01-30 23:18:27 -05:00
class Basement #:nodoc:
2008-12-05 16:13:11 -05:00
include HTTParty
end
2009-11-09 22:09:33 -05:00
2012-02-15 14:46:01 -05:00
def self . get ( * args , & block )
Basement . get ( * args , & block )
2008-12-05 16:13:11 -05:00
end
2009-11-09 22:09:33 -05:00
2012-02-15 14:46:01 -05:00
def self . post ( * args , & block )
Basement . post ( * args , & block )
2008-12-05 16:13:11 -05:00
end
2012-04-13 19:22:51 -04:00
def self . patch ( * args , & block )
Basement . patch ( * args , & block )
end
2012-02-15 14:46:01 -05:00
def self . put ( * args , & block )
Basement . put ( * args , & block )
2008-12-05 16:13:11 -05:00
end
2012-02-15 14:46:01 -05:00
def self . delete ( * args , & block )
Basement . delete ( * args , & block )
2008-12-05 16:13:11 -05:00
end
2009-11-22 23:18:29 -05:00
2013-01-17 00:01:17 -05:00
def self . move ( * args , & block )
Basement . move ( * args , & block )
end
2013-04-18 08:09:21 -04:00
2013-02-07 09:34:32 -05:00
def self . copy ( * args , & block )
2014-02-07 15:02:23 -05:00
Basement . copy ( * args , & block )
2013-02-07 09:34:32 -05:00
end
2012-02-15 14:46:01 -05:00
def self . head ( * args , & block )
Basement . head ( * args , & block )
2009-11-22 23:18:29 -05:00
end
2012-02-15 14:46:01 -05:00
def self . options ( * args , & block )
Basement . options ( * args , & block )
2009-11-22 23:18:29 -05:00
end
2008-11-08 12:05:59 -05:00
end
2008-12-06 22:01:42 -05:00
2011-09-13 12:29:26 -04:00
require 'httparty/hash_conversions'
2018-11-11 07:39:38 -05:00
require 'httparty/utils'
2011-04-15 18:29:55 -04:00
require 'httparty/exceptions'
require 'httparty/parser'
require 'httparty/request'
require 'httparty/response'