typhoeus 0.4.2 → 0.5.0.alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.md +86 -28
- data/Gemfile +17 -1
- data/README.md +20 -422
- data/Rakefile +21 -12
- data/lib/typhoeus.rb +58 -41
- data/lib/typhoeus/config.rb +14 -0
- data/lib/typhoeus/errors.rb +9 -0
- data/lib/typhoeus/errors/no_stub.rb +12 -0
- data/lib/typhoeus/errors/typhoeus_error.rb +8 -0
- data/lib/typhoeus/expectation.rb +126 -0
- data/lib/typhoeus/hydra.rb +31 -236
- data/lib/typhoeus/hydras/block_connection.rb +33 -0
- data/lib/typhoeus/hydras/easy_factory.rb +67 -0
- data/lib/typhoeus/hydras/easy_pool.rb +40 -0
- data/lib/typhoeus/hydras/memoizable.rb +53 -0
- data/lib/typhoeus/hydras/queueable.rb +46 -0
- data/lib/typhoeus/hydras/runnable.rb +18 -0
- data/lib/typhoeus/hydras/stubbable.rb +27 -0
- data/lib/typhoeus/request.rb +68 -243
- data/lib/typhoeus/requests/actions.rb +101 -0
- data/lib/typhoeus/requests/block_connection.rb +31 -0
- data/lib/typhoeus/requests/callbacks.rb +82 -0
- data/lib/typhoeus/requests/marshal.rb +21 -0
- data/lib/typhoeus/requests/memoizable.rb +36 -0
- data/lib/typhoeus/requests/operations.rb +52 -0
- data/lib/typhoeus/requests/responseable.rb +29 -0
- data/lib/typhoeus/requests/stubbable.rb +29 -0
- data/lib/typhoeus/response.rb +24 -118
- data/lib/typhoeus/responses/header.rb +50 -0
- data/lib/typhoeus/responses/informations.rb +43 -0
- data/lib/typhoeus/responses/legacy.rb +27 -0
- data/lib/typhoeus/responses/status.rb +78 -0
- data/lib/typhoeus/version.rb +3 -1
- metadata +34 -141
- data/lib/typhoeus/curl.rb +0 -453
- data/lib/typhoeus/easy.rb +0 -115
- data/lib/typhoeus/easy/auth.rb +0 -14
- data/lib/typhoeus/easy/callbacks.rb +0 -33
- data/lib/typhoeus/easy/ffi_helper.rb +0 -61
- data/lib/typhoeus/easy/infos.rb +0 -90
- data/lib/typhoeus/easy/options.rb +0 -115
- data/lib/typhoeus/easy/proxy.rb +0 -20
- data/lib/typhoeus/easy/ssl.rb +0 -82
- data/lib/typhoeus/filter.rb +0 -28
- data/lib/typhoeus/form.rb +0 -61
- data/lib/typhoeus/header.rb +0 -54
- data/lib/typhoeus/hydra/callbacks.rb +0 -24
- data/lib/typhoeus/hydra/connect_options.rb +0 -61
- data/lib/typhoeus/hydra/stubbing.rb +0 -68
- data/lib/typhoeus/hydra_mock.rb +0 -131
- data/lib/typhoeus/multi.rb +0 -146
- data/lib/typhoeus/param_processor.rb +0 -43
- data/lib/typhoeus/remote.rb +0 -306
- data/lib/typhoeus/remote_method.rb +0 -108
- data/lib/typhoeus/remote_proxy_object.rb +0 -50
- data/lib/typhoeus/utils.rb +0 -50
@@ -0,0 +1,33 @@
|
|
1
|
+
module Typhoeus
|
2
|
+
module Hydras
|
3
|
+
|
4
|
+
# This module handles the blocked connection request mode on
|
5
|
+
# the hydra side, where only stubbed requests
|
6
|
+
# are allowed.
|
7
|
+
# Connection blocking needs to be turned on:
|
8
|
+
# Typhoeus.configure do |config|
|
9
|
+
# config.block_connection = true
|
10
|
+
# end
|
11
|
+
#
|
12
|
+
# When trying to do real requests a NoStub error
|
13
|
+
# is raised.
|
14
|
+
module BlockConnection
|
15
|
+
|
16
|
+
# Overrides queue in order to check before if block connection
|
17
|
+
# is turned on. If thats the case a NoStub error is
|
18
|
+
# raised.
|
19
|
+
#
|
20
|
+
# @example Queue the request.
|
21
|
+
# hydra.queue(request)
|
22
|
+
#
|
23
|
+
# @param [ Request ] request The request to enqueue.
|
24
|
+
def queue(request)
|
25
|
+
if Typhoeus::Config.block_connection
|
26
|
+
raise Typhoeus::Errors::NoStub.new(request)
|
27
|
+
else
|
28
|
+
super
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module Typhoeus
|
2
|
+
module Hydras
|
3
|
+
|
4
|
+
# This is a Factory for easies to be used in the hydra.
|
5
|
+
# Before an easy is ready to be added to a multi, it needs
|
6
|
+
# to be prepared and the on_complete callback to be set.
|
7
|
+
# This is done by this class.
|
8
|
+
class EasyFactory
|
9
|
+
attr_reader :request, :hydra
|
10
|
+
|
11
|
+
# Create an easy factory.
|
12
|
+
#
|
13
|
+
# @example Create easy factory.
|
14
|
+
# Typhoeus::Hydras::EasyFactory.new(request, hydra)
|
15
|
+
#
|
16
|
+
# @param [ Request ] request The request to build an easy for.
|
17
|
+
# @param [ Hydra ] hydra The hydra to build an easy for.
|
18
|
+
def initialize(request, hydra)
|
19
|
+
@request = request
|
20
|
+
@hydra = hydra
|
21
|
+
end
|
22
|
+
|
23
|
+
# Return the easy in question.
|
24
|
+
#
|
25
|
+
# @example Return easy.
|
26
|
+
# easy_factory.easy
|
27
|
+
#
|
28
|
+
# @return [ Ethon::Easy ] The easy.
|
29
|
+
def easy
|
30
|
+
@easy ||= hydra.get_easy
|
31
|
+
end
|
32
|
+
|
33
|
+
# Fabricated and prepared easy.
|
34
|
+
#
|
35
|
+
# @example Prepared easy.
|
36
|
+
# easy_factory.get
|
37
|
+
#
|
38
|
+
# @return [ Ethon::Easy ] The prepared easy.
|
39
|
+
def get
|
40
|
+
easy.http_request(
|
41
|
+
request.url,
|
42
|
+
request.options.fetch(:method, :get),
|
43
|
+
request.options.reject{|k,_| k==:method}
|
44
|
+
)
|
45
|
+
easy.prepare
|
46
|
+
set_callback
|
47
|
+
easy
|
48
|
+
end
|
49
|
+
|
50
|
+
# Sets on_complete callback on easy in order to be able to
|
51
|
+
# track progress.
|
52
|
+
#
|
53
|
+
# @example Set callback.
|
54
|
+
# easy_factory.set_callback
|
55
|
+
#
|
56
|
+
# @return [ Ethon::Easy ] The easy.
|
57
|
+
def set_callback
|
58
|
+
easy.on_complete do |easy|
|
59
|
+
request.response = Response.new(easy.to_hash)
|
60
|
+
hydra.release_easy(easy)
|
61
|
+
hydra.queue(hydra.queued_requests.shift) unless hydra.queued_requests.empty?
|
62
|
+
request.execute_callbacks
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Typhoeus
|
2
|
+
module Hydras
|
3
|
+
|
4
|
+
# The easy pool stores already initialized
|
5
|
+
# easy handles for future use. This is useful
|
6
|
+
# because creating them is quite expensive.
|
7
|
+
module EasyPool
|
8
|
+
|
9
|
+
# Return the easy pool.
|
10
|
+
#
|
11
|
+
# @example Return easy pool.
|
12
|
+
# hydra.easy_pool
|
13
|
+
#
|
14
|
+
# @return [ Array ] The easy pool.
|
15
|
+
def easy_pool
|
16
|
+
@easy_pool ||= []
|
17
|
+
end
|
18
|
+
|
19
|
+
# Releases easy into pool. The easy handle is
|
20
|
+
# resetted before it gets back in.
|
21
|
+
#
|
22
|
+
# @example Release easy.
|
23
|
+
# hydra.release_easy(easy)
|
24
|
+
def release_easy(easy)
|
25
|
+
easy.reset
|
26
|
+
easy_pool << easy
|
27
|
+
end
|
28
|
+
|
29
|
+
# Return an easy from pool.
|
30
|
+
#
|
31
|
+
# @example Return easy.
|
32
|
+
# hydra.get_easy
|
33
|
+
#
|
34
|
+
# @return [ Ethon::Easy ] The easy.
|
35
|
+
def get_easy
|
36
|
+
easy_pool.pop || Ethon::Easy.new
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Typhoeus
|
2
|
+
module Hydras
|
3
|
+
|
4
|
+
# This module handles the GET request memoization
|
5
|
+
# on the hydra side. Memoization needs to be turned
|
6
|
+
# on:
|
7
|
+
# Typhoeus.configure do |config|
|
8
|
+
# config.memoize = true
|
9
|
+
# end
|
10
|
+
module Memoizable
|
11
|
+
|
12
|
+
# Return the memory.
|
13
|
+
#
|
14
|
+
# @example Return the memory.
|
15
|
+
# hydra.memory
|
16
|
+
#
|
17
|
+
# @return [ Hash ] The memory.
|
18
|
+
def memory
|
19
|
+
@memory ||= {}
|
20
|
+
end
|
21
|
+
|
22
|
+
# Overrides queue in order to check before if request
|
23
|
+
# is memoizable and already in memory. If thats the case,
|
24
|
+
# super is not called, instead the response is set and
|
25
|
+
# the on_complete callback called.
|
26
|
+
#
|
27
|
+
# @example Queue the request.
|
28
|
+
# hydra.queue(request)
|
29
|
+
#
|
30
|
+
# @param [ Request ] request The request to enqueue.
|
31
|
+
#
|
32
|
+
# @return [ Request ] The queued request.
|
33
|
+
def queue(request)
|
34
|
+
if request.memoizable? && memory.has_key?(request)
|
35
|
+
request.instance_variable_set(:@response, memory[request])
|
36
|
+
request.execute_callbacks
|
37
|
+
else
|
38
|
+
super
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# Overrides run to make sure the memory is cleared after
|
43
|
+
# each run.
|
44
|
+
#
|
45
|
+
# @example Run hydra.
|
46
|
+
# hydra.run
|
47
|
+
def run
|
48
|
+
super
|
49
|
+
memory.clear
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Typhoeus
|
2
|
+
module Hydras # :nodoc:
|
3
|
+
|
4
|
+
# This module handles the request queueing on
|
5
|
+
# hydra.
|
6
|
+
module Queueable
|
7
|
+
|
8
|
+
# Return the queued requests.
|
9
|
+
#
|
10
|
+
# @example Return queued requests.
|
11
|
+
# hydra.queued_requests
|
12
|
+
#
|
13
|
+
# @return [ Array ] The queued requests.
|
14
|
+
def queued_requests
|
15
|
+
@queued_requests ||= []
|
16
|
+
end
|
17
|
+
|
18
|
+
# Abort the current hydra run as good as
|
19
|
+
# possible. This means that it only
|
20
|
+
# clears the queued requests and can't do
|
21
|
+
# anything about already running requests.
|
22
|
+
#
|
23
|
+
# @example Abort hydra.
|
24
|
+
# hydra.abort
|
25
|
+
def abort
|
26
|
+
queued_requests.clear
|
27
|
+
end
|
28
|
+
|
29
|
+
# Enqueues a request in order to be performed
|
30
|
+
# by the hydra. This can even be done while
|
31
|
+
# the hydra is running. Also sets hydra on
|
32
|
+
# request.
|
33
|
+
#
|
34
|
+
# @example Queue request.
|
35
|
+
# hydra.queue(request)
|
36
|
+
def queue(request)
|
37
|
+
request.hydra = self
|
38
|
+
if multi.easy_handles.size < max_concurrency
|
39
|
+
multi.add(Hydras::EasyFactory.new(request, self).get)
|
40
|
+
else
|
41
|
+
queued_requests << request
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Typhoeus
|
2
|
+
module Hydras
|
3
|
+
|
4
|
+
# This module contains logic to run a hydra.
|
5
|
+
module Runnable
|
6
|
+
|
7
|
+
# Start the hydra run.
|
8
|
+
#
|
9
|
+
# @example Start hydra run.
|
10
|
+
# hydra.run
|
11
|
+
#
|
12
|
+
# @return [ Symbol ] Return value from multi.perform.
|
13
|
+
def run
|
14
|
+
multi.perform
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Typhoeus
|
2
|
+
module Hydras
|
3
|
+
|
4
|
+
# This module handles stubbing on the hydra side.
|
5
|
+
# It plays well with the block_connection configuration,
|
6
|
+
# which raises when you make a request which is not stubbed.
|
7
|
+
module Stubbable
|
8
|
+
|
9
|
+
# Override queue in order to check for matching expecations.
|
10
|
+
# When an expecation is found, super is not called. Instead a
|
11
|
+
# canned response is assigned to the request.
|
12
|
+
#
|
13
|
+
# @example Queue the request.
|
14
|
+
# hydra.queue(request)
|
15
|
+
def queue(request)
|
16
|
+
if expectation = Expectation.find_by(request)
|
17
|
+
request.response = expectation.response
|
18
|
+
request.response.mock = true
|
19
|
+
request.execute_callbacks
|
20
|
+
request.response
|
21
|
+
else
|
22
|
+
super
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/typhoeus/request.rb
CHANGED
@@ -1,266 +1,91 @@
|
|
1
|
-
require '
|
1
|
+
require 'typhoeus/requests/actions'
|
2
|
+
require 'typhoeus/requests/block_connection'
|
3
|
+
require 'typhoeus/requests/callbacks'
|
4
|
+
require 'typhoeus/requests/marshal'
|
5
|
+
require 'typhoeus/requests/memoizable'
|
6
|
+
require 'typhoeus/requests/operations'
|
7
|
+
require 'typhoeus/requests/responseable'
|
8
|
+
require 'typhoeus/requests/stubbable'
|
2
9
|
|
3
10
|
module Typhoeus
|
4
|
-
class Request
|
5
|
-
ACCESSOR_OPTIONS = [
|
6
|
-
:method,
|
7
|
-
:params,
|
8
|
-
:body,
|
9
|
-
:headers,
|
10
|
-
:cache_key_basis,
|
11
|
-
:connect_timeout,
|
12
|
-
:timeout,
|
13
|
-
:user_agent,
|
14
|
-
:response,
|
15
|
-
:cache_timeout,
|
16
|
-
:follow_location,
|
17
|
-
:max_redirects,
|
18
|
-
:proxy,
|
19
|
-
:proxy_username,
|
20
|
-
:proxy_password,
|
21
|
-
:disable_ssl_peer_verification,
|
22
|
-
:disable_ssl_host_verification,
|
23
|
-
:interface,
|
24
|
-
:ssl_cert,
|
25
|
-
:ssl_cert_type,
|
26
|
-
:ssl_key,
|
27
|
-
:ssl_key_type,
|
28
|
-
:ssl_key_password,
|
29
|
-
:ssl_cacert,
|
30
|
-
:ssl_capath,
|
31
|
-
:ssl_version,
|
32
|
-
:verbose,
|
33
|
-
:username,
|
34
|
-
:password,
|
35
|
-
:auth_method,
|
36
|
-
:proxy_auth_method,
|
37
|
-
:proxy_type
|
38
|
-
]
|
39
|
-
|
40
|
-
attr_accessor *ACCESSOR_OPTIONS
|
41
11
|
|
42
|
-
|
12
|
+
# This class represents a request.
|
13
|
+
class Request
|
14
|
+
extend Requests::Actions
|
15
|
+
include Requests::Callbacks::Types
|
16
|
+
include Requests::Callbacks
|
17
|
+
include Requests::Marshal
|
18
|
+
include Requests::Operations
|
19
|
+
include Requests::Responseable
|
20
|
+
include Requests::Memoizable
|
21
|
+
include Requests::BlockConnection
|
22
|
+
include Requests::Stubbable
|
23
|
+
|
24
|
+
attr_accessor :options, :url, :hydra, :original_options
|
25
|
+
|
26
|
+
# Create a new request.
|
43
27
|
#
|
44
|
-
#
|
45
|
-
#
|
46
|
-
# * +options+ : A hash containing options among :
|
47
|
-
# ** +:method+ : :get (default) / :post / :put
|
48
|
-
# ** +:params+ : params as a Hash
|
49
|
-
# ** +:body+
|
50
|
-
# ** +:timeout+ : timeout (ms)
|
51
|
-
# ** +:interface+ : interface or ip address (string)
|
52
|
-
# ** +:connect_timeout+ : connect timeout (ms)
|
53
|
-
# ** +:headers+ : headers as Hash
|
54
|
-
# ** +:cache_timeout+ : cache timeout (ms)
|
55
|
-
# ** +:follow_location
|
56
|
-
# ** +:max_redirects
|
57
|
-
# ** +:proxy
|
58
|
-
# ** +:disable_ssl_peer_verification
|
59
|
-
# ** +:disable_ssl_host_verification
|
60
|
-
# ** +:ssl_cert
|
61
|
-
# ** +:ssl_cert_type
|
62
|
-
# ** +:ssl_key
|
63
|
-
# ** +:ssl_key_type
|
64
|
-
# ** +:ssl_key_password
|
65
|
-
# ** +:ssl_cacert
|
66
|
-
# ** +:ssl_capath
|
67
|
-
# ** +:verbose
|
68
|
-
# ** +:username
|
69
|
-
# ** +:password
|
70
|
-
# ** +:auth_method
|
28
|
+
# @example Create a request.
|
29
|
+
# Request.new("www.example.com")
|
71
30
|
#
|
31
|
+
# @param [ String ] url The url to request.
|
32
|
+
# @param [ Hash ] options The options.
|
33
|
+
#
|
34
|
+
# #return [ Request ] The new request.
|
72
35
|
def initialize(url, options = {})
|
73
36
|
@url = url
|
74
|
-
@
|
75
|
-
@
|
76
|
-
@body = options[:body]
|
77
|
-
@timeout = safe_to_i(options[:timeout])
|
78
|
-
@connect_timeout = safe_to_i(options[:connect_timeout])
|
79
|
-
@interface = options[:interface]
|
80
|
-
@headers = options[:headers] || {}
|
81
|
-
|
82
|
-
@cache_timeout = safe_to_i(options[:cache_timeout])
|
83
|
-
@follow_location = options[:follow_location]
|
84
|
-
@max_redirects = options[:max_redirects]
|
85
|
-
@proxy = options[:proxy]
|
86
|
-
@proxy_type = options[:proxy_type]
|
87
|
-
@proxy_username = options[:proxy_username]
|
88
|
-
@proxy_password = options[:proxy_password]
|
89
|
-
@proxy_auth_method = options[:proxy_auth_method]
|
90
|
-
@disable_ssl_peer_verification = options[:disable_ssl_peer_verification]
|
91
|
-
@disable_ssl_host_verification = options[:disable_ssl_host_verification]
|
92
|
-
@ssl_cert = options[:ssl_cert]
|
93
|
-
@ssl_cert_type = options[:ssl_cert_type]
|
94
|
-
@ssl_key = options[:ssl_key]
|
95
|
-
@ssl_key_type = options[:ssl_key_type]
|
96
|
-
@ssl_key_password = options[:ssl_key_password]
|
97
|
-
@ssl_cacert = options[:ssl_cacert]
|
98
|
-
@ssl_capath = options[:ssl_capath]
|
99
|
-
@ssl_version = options[:ssl_version]
|
100
|
-
@verbose = options[:verbose]
|
101
|
-
@username = options[:username]
|
102
|
-
@password = options[:password]
|
103
|
-
@auth_method = options[:auth_method]
|
104
|
-
|
105
|
-
@on_complete = nil
|
106
|
-
@after_complete = nil
|
107
|
-
@handled_response = nil
|
108
|
-
end
|
109
|
-
|
110
|
-
LOCALHOST_ALIASES = %w[ localhost 127.0.0.1 0.0.0.0 ]
|
111
|
-
|
112
|
-
def localhost?
|
113
|
-
LOCALHOST_ALIASES.include?(parsed_uri.host)
|
114
|
-
end
|
115
|
-
|
116
|
-
def user_agent
|
117
|
-
headers['User-Agent']
|
118
|
-
end
|
119
|
-
|
120
|
-
def url
|
121
|
-
if [:post, :put].include?(@method)
|
122
|
-
@url
|
123
|
-
else
|
124
|
-
url = "#{@url}?#{params_string}"
|
125
|
-
url += "&#{URI.escape(@body)}" if @body
|
126
|
-
url.gsub("?&", "?").gsub(/\?$/, '')
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
def parsed_uri
|
131
|
-
@parsed_uri ||= URI.parse(@url)
|
132
|
-
end
|
37
|
+
@original_options = options
|
38
|
+
@options = options.dup
|
133
39
|
|
134
|
-
|
135
|
-
slash_location = @url.index('/', 8)
|
136
|
-
if slash_location
|
137
|
-
@url.slice(0, slash_location)
|
138
|
-
else
|
139
|
-
query_string_location = @url.index('?')
|
140
|
-
return query_string_location ? @url.slice(0, query_string_location) : @url
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
def host_domain
|
145
|
-
parsed_uri.host
|
146
|
-
end
|
147
|
-
|
148
|
-
def params_string
|
149
|
-
return nil unless params
|
150
|
-
traversal = Typhoeus::Utils.traverse_params_hash(params)
|
151
|
-
Typhoeus::Utils.traversal_to_param_string(traversal)
|
152
|
-
end
|
153
|
-
|
154
|
-
def on_complete(&block)
|
155
|
-
@on_complete = block
|
156
|
-
end
|
157
|
-
|
158
|
-
def on_complete=(proc)
|
159
|
-
@on_complete = proc
|
160
|
-
end
|
161
|
-
|
162
|
-
def after_complete(&block)
|
163
|
-
@after_complete = block
|
164
|
-
end
|
165
|
-
|
166
|
-
def after_complete=(proc)
|
167
|
-
@after_complete = proc
|
168
|
-
end
|
169
|
-
|
170
|
-
def call_handlers
|
171
|
-
if @on_complete
|
172
|
-
@handled_response = @on_complete.call(response)
|
173
|
-
call_after_complete
|
174
|
-
end
|
40
|
+
set_defaults
|
175
41
|
end
|
176
42
|
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
43
|
+
# Returns wether other is equal to self.
|
44
|
+
#
|
45
|
+
# @example Are request equal?
|
46
|
+
# request.eql?(other_request)
|
47
|
+
#
|
48
|
+
# @param [ Object ] other The object to check.
|
49
|
+
#
|
50
|
+
# @return [ Boolean ] Returns true if equals, else false.
|
51
|
+
def eql?(other)
|
52
|
+
self.class == other.class &&
|
53
|
+
self.url == other.url &&
|
54
|
+
fuzzy_hash_eql?(self.options, other.options)
|
183
55
|
end
|
184
56
|
|
185
|
-
|
186
|
-
|
57
|
+
# Overrides Object#hash.
|
58
|
+
#
|
59
|
+
# @return [ Integer ] The integer representing the request.
|
60
|
+
def hash
|
61
|
+
[ self.class, self.url, self.options ].hash
|
187
62
|
end
|
188
63
|
|
189
|
-
|
190
|
-
result = ":method => #{self.method.inspect},\n" <<
|
191
|
-
"\t:url => #{URI.parse(self.url).to_s}"
|
192
|
-
if self.body and !self.body.empty?
|
193
|
-
result << ",\n\t:body => #{self.body.inspect}"
|
194
|
-
end
|
64
|
+
protected
|
195
65
|
|
196
|
-
|
197
|
-
|
198
|
-
|
66
|
+
# Checks if two hashes are equal or not, discarding first-level hash order
|
67
|
+
#
|
68
|
+
# @param [ Hash ] left
|
69
|
+
# @param [ Hash ] right hash to check for equality
|
70
|
+
#
|
71
|
+
# @return [ Boolean ] Returns true if hashes have same values for same keys and same length,
|
72
|
+
# even if the keys are given in a different order.
|
73
|
+
def fuzzy_hash_eql?(left, right)
|
74
|
+
return true if (left == right)
|
199
75
|
|
200
|
-
|
201
|
-
|
76
|
+
(left.count == right.count) && left.inject(true) do |res, kvp|
|
77
|
+
res && (kvp[1] == right[kvp[0]])
|
202
78
|
end
|
203
|
-
|
204
|
-
result
|
205
|
-
end
|
206
|
-
|
207
|
-
def cache_key
|
208
|
-
Digest::SHA1.hexdigest(cache_key_basis || url)
|
209
|
-
end
|
210
|
-
|
211
|
-
def self.run(url, params)
|
212
|
-
r = new(url, params)
|
213
|
-
Typhoeus::Hydra.hydra.queue r
|
214
|
-
Typhoeus::Hydra.hydra.run
|
215
|
-
r.response
|
216
|
-
end
|
217
|
-
|
218
|
-
def self.get(url, params = {})
|
219
|
-
run(url, params.merge(:method => :get))
|
220
79
|
end
|
221
80
|
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
end
|
229
|
-
|
230
|
-
def self.delete(url, params = {})
|
231
|
-
run(url, params.merge(:method => :delete))
|
232
|
-
end
|
233
|
-
|
234
|
-
def self.head(url, params = {})
|
235
|
-
run(url, params.merge(:method => :head))
|
236
|
-
end
|
237
|
-
|
238
|
-
protected
|
239
|
-
|
240
|
-
# Return the important data needed to serialize this Request, except the
|
241
|
-
# `on_complete` and `after_complete` handlers, since they cannot be
|
242
|
-
# marshalled.
|
243
|
-
def marshal_dump
|
244
|
-
(instance_variables - ['@on_complete', '@after_complete', :@on_complete, :@after_complete]).map do |name|
|
245
|
-
[name, instance_variable_get(name)]
|
81
|
+
# Sets default header and verbose when turned on.
|
82
|
+
def set_defaults
|
83
|
+
if @options[:headers]
|
84
|
+
@options[:headers] = {'User-Agent' => Typhoeus::USER_AGENT}.merge(options[:headers])
|
85
|
+
else
|
86
|
+
@options[:headers] = {'User-Agent' => Typhoeus::USER_AGENT}
|
246
87
|
end
|
247
|
-
|
248
|
-
|
249
|
-
def marshal_load(attributes)
|
250
|
-
attributes.each { |name, value| instance_variable_set(name, value) }
|
251
|
-
end
|
252
|
-
|
253
|
-
def self.options
|
254
|
-
ACCESSOR_OPTIONS
|
255
|
-
end
|
256
|
-
|
257
|
-
private
|
258
|
-
|
259
|
-
def safe_to_i(value)
|
260
|
-
return value if value.is_a?(Fixnum)
|
261
|
-
return nil if value.nil?
|
262
|
-
return nil if value.respond_to?(:empty?) && value.empty?
|
263
|
-
value.to_i
|
88
|
+
@options[:verbose] = Typhoeus::Config.verbose if @options[:verbose].nil? && !Typhoeus::Config.verbose.nil?
|
264
89
|
end
|
265
90
|
end
|
266
91
|
end
|