typhoeus 0.5.4 → 0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +17 -3
- data/README.md +3 -3
- data/lib/typhoeus.rb +2 -1
- data/lib/typhoeus/adapters/faraday.rb +5 -5
- data/lib/typhoeus/easy_factory.rb +115 -0
- data/lib/typhoeus/expectation.rb +7 -7
- data/lib/typhoeus/hydra.rb +0 -3
- data/lib/typhoeus/hydra/addable.rb +1 -1
- data/lib/typhoeus/pool.rb +51 -0
- data/lib/typhoeus/request.rb +10 -2
- data/lib/typhoeus/request/operations.rb +1 -47
- data/lib/typhoeus/version.rb +1 -1
- metadata +7 -7
- data/lib/typhoeus/hydra/easy_factory.rb +0 -78
- data/lib/typhoeus/hydra/easy_pool.rb +0 -42
data/CHANGELOG.md
CHANGED
@@ -2,7 +2,21 @@
|
|
2
2
|
|
3
3
|
## Master
|
4
4
|
|
5
|
-
[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.5.
|
5
|
+
[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.5.5...master)
|
6
|
+
|
7
|
+
## 0.6
|
8
|
+
|
9
|
+
Enhancements:
|
10
|
+
|
11
|
+
* `Request#url` now also contains the url parameters.
|
12
|
+
* Use updated ethon version which provides access to protocols and redir_protocols in response to [libcurl SASL buffer overflow vulnerability](http://curl.haxx.se/docs/adv_20130206.html)
|
13
|
+
|
14
|
+
Bugfixes:
|
15
|
+
|
16
|
+
* Corrected ssl options for the faraday adapter.
|
17
|
+
* Benchmark is working again.
|
18
|
+
|
19
|
+
[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.5.4...v0.5.5)
|
6
20
|
|
7
21
|
## 0.5.4
|
8
22
|
|
@@ -18,8 +32,8 @@ Enhancements:
|
|
18
32
|
* Rename parameter `url` to `base_url`. See discussion here: [\#250](https://github.com/typhoeus/typhoeus/issues/250).
|
19
33
|
([bkimble](https://github.com/bkimble), [\#256](https://github.com/typhoeus/typhoeus/pull/256))
|
20
34
|
* Provide O(1) header access.
|
21
|
-
* Work around
|
22
|
-
(
|
35
|
+
* Work around ruby 1.8.7 limitations.
|
36
|
+
([Chris Johnson](https://github.com/findchris), [\#227](https://github.com/typhoeus/typhoeus/pull/227) )
|
23
37
|
* Provide symbol access.
|
24
38
|
|
25
39
|
## 0.5.3
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Typhoeus [![Build Status](https://secure.travis-ci.org/typhoeus/typhoeus.png)](http://travis-ci.org/typhoeus/typhoeus)
|
1
|
+
# Typhoeus [![Build Status](https://secure.travis-ci.org/typhoeus/typhoeus.png)](http://travis-ci.org/typhoeus/typhoeus) [<img src="https://codeclimate.com/github/typhoeus/typhoeus.png" height="13" width="89" />](https://codeclimate.com/github/typhoeus/typhoeus)
|
2
2
|
|
3
3
|
Like a modern code version of the mythical beast with 100 serpent heads, Typhoeus runs HTTP requests in parallel while cleanly encapsulating handling logic.
|
4
4
|
|
@@ -39,9 +39,9 @@ gem "typhoeus"
|
|
39
39
|
|
40
40
|
Copyright © 2009-2010 [Paul Dix](http://www.pauldix.net/)
|
41
41
|
|
42
|
-
Copyright © 2011 [David Balatero](https://github.com/dbalatero/)
|
42
|
+
Copyright © 2011-2012 [David Balatero](https://github.com/dbalatero/)
|
43
43
|
|
44
|
-
Copyright © 2012 [Hans Hasselberg](http://
|
44
|
+
Copyright © 2012-2013 [Hans Hasselberg](http://github.com/i0rek/)
|
45
45
|
|
46
46
|
Permission is hereby granted, free of charge, to any person obtaining a
|
47
47
|
copy of this software and associated documentation files (the "Software"),
|
data/lib/typhoeus.rb
CHANGED
@@ -2,9 +2,11 @@ require 'digest/sha2'
|
|
2
2
|
require 'ethon'
|
3
3
|
|
4
4
|
require 'typhoeus/config'
|
5
|
+
require 'typhoeus/easy_factory'
|
5
6
|
require 'typhoeus/errors'
|
6
7
|
require 'typhoeus/expectation'
|
7
8
|
require 'typhoeus/hydra'
|
9
|
+
require 'typhoeus/pool'
|
8
10
|
require 'typhoeus/request'
|
9
11
|
require 'typhoeus/response'
|
10
12
|
require 'typhoeus/version'
|
@@ -42,7 +44,6 @@ end
|
|
42
44
|
# @since 0.5.0
|
43
45
|
module Typhoeus
|
44
46
|
extend self
|
45
|
-
extend Hydra::EasyPool
|
46
47
|
extend Request::Actions
|
47
48
|
extend Request::Callbacks::Types
|
48
49
|
|
@@ -98,11 +98,11 @@ module Faraday # :nodoc:
|
|
98
98
|
|
99
99
|
ssl_verifyhost = (ssl && ssl.fetch(:verify, true)) ? 2 : 0
|
100
100
|
req.options[:ssl_verifyhost] = ssl_verifyhost
|
101
|
-
req.options[:sslversion] = ssl[:version]
|
102
|
-
req.options[:sslcert] = ssl[:
|
103
|
-
req.options[:sslkey] = ssl[:
|
104
|
-
req.options[:cainfo] = ssl[:ca_file]
|
105
|
-
req.options[:capath] = ssl[:ca_path]
|
101
|
+
req.options[:sslversion] = ssl[:version] if ssl[:version]
|
102
|
+
req.options[:sslcert] = ssl[:client_cert] if ssl[:client_cert]
|
103
|
+
req.options[:sslkey] = ssl[:client_key] if ssl[:client_key]
|
104
|
+
req.options[:cainfo] = ssl[:ca_file] if ssl[:ca_file]
|
105
|
+
req.options[:capath] = ssl[:ca_path] if ssl[:ca_path]
|
106
106
|
end
|
107
107
|
|
108
108
|
def configure_proxy(req, env)
|
@@ -0,0 +1,115 @@
|
|
1
|
+
module Typhoeus
|
2
|
+
|
3
|
+
# This is a Factory for easies to be used in the hydra.
|
4
|
+
# Before an easy is ready to be added to a multi the
|
5
|
+
# on_complete callback to be set.
|
6
|
+
# This is done by this class.
|
7
|
+
#
|
8
|
+
# @api private
|
9
|
+
class EasyFactory
|
10
|
+
|
11
|
+
# Returns the request provided.
|
12
|
+
#
|
13
|
+
# @return [ Typhoeus::Request ]
|
14
|
+
attr_reader :request
|
15
|
+
|
16
|
+
# Returns the hydra provided.
|
17
|
+
#
|
18
|
+
# @return [ Typhoeus::Hydra ]
|
19
|
+
attr_reader :hydra
|
20
|
+
|
21
|
+
# Create an easy factory.
|
22
|
+
#
|
23
|
+
# @example Create easy factory.
|
24
|
+
# Typhoeus::Hydra::EasyFactory.new(request, hydra)
|
25
|
+
#
|
26
|
+
# @param [ Request ] request The request to build an easy for.
|
27
|
+
# @param [ Hydra ] hydra The hydra to build an easy for.
|
28
|
+
def initialize(request, hydra = nil)
|
29
|
+
@request = request
|
30
|
+
@hydra = hydra
|
31
|
+
end
|
32
|
+
|
33
|
+
# Return the easy in question.
|
34
|
+
#
|
35
|
+
# @example Return easy.
|
36
|
+
# easy_factory.easy
|
37
|
+
#
|
38
|
+
# @return [ Ethon::Easy ] The easy.
|
39
|
+
def easy
|
40
|
+
@easy ||= Typhoeus::Pool.get
|
41
|
+
end
|
42
|
+
|
43
|
+
# Fabricated easy.
|
44
|
+
#
|
45
|
+
# @example Prepared easy.
|
46
|
+
# easy_factory.get
|
47
|
+
#
|
48
|
+
# @return [ Ethon::Easy ] The easy.
|
49
|
+
def get
|
50
|
+
begin
|
51
|
+
easy.http_request(
|
52
|
+
request.base_url,
|
53
|
+
request.options.fetch(:method, :get),
|
54
|
+
request.options.reject{|k,_| k==:method}
|
55
|
+
)
|
56
|
+
rescue Ethon::Errors::InvalidOption => e
|
57
|
+
help = provide_help(e.message.match(/:\s(\w+)/)[1])
|
58
|
+
raise $!, "#{$!}#{help}", $!.backtrace
|
59
|
+
end
|
60
|
+
set_callback
|
61
|
+
easy
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
# Sets on_complete callback on easy in order to be able to
|
67
|
+
# track progress.
|
68
|
+
#
|
69
|
+
# @example Set callback.
|
70
|
+
# easy_factory.set_callback
|
71
|
+
#
|
72
|
+
# @return [ Ethon::Easy ] The easy.
|
73
|
+
def set_callback
|
74
|
+
easy.on_complete do |easy|
|
75
|
+
request.finish(Response.new(easy.to_hash))
|
76
|
+
Typhoeus::Pool.release(easy)
|
77
|
+
if hydra && !hydra.queued_requests.empty?
|
78
|
+
hydra.add(hydra.queued_requests.shift)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def provide_help(option)
|
84
|
+
renamed = {
|
85
|
+
:auth_method => :httpauth,
|
86
|
+
:connect_timeout => :connecttimeout,
|
87
|
+
:disable_ssl_host_verification => :ssl_verifyhost,
|
88
|
+
:disable_ssl_peer_verification => :ssl_verifypeer,
|
89
|
+
:encoding => :accept_encoding,
|
90
|
+
:follow_location => :followlocation,
|
91
|
+
:max_redirects => :maxredirs,
|
92
|
+
:password => :userpwd,
|
93
|
+
:proxy_auth_method => :proxyauth,
|
94
|
+
:proxy_password => :proxyuserpwd,
|
95
|
+
:proxy_type => :proxytype,
|
96
|
+
:proxy_username => :proxyuserpwd,
|
97
|
+
:ssl_cacert => :cainfo,
|
98
|
+
:ssl_capath => :capath,
|
99
|
+
:ssl_cert => :sslcert,
|
100
|
+
:ssl_cert_type => :sslcerttype,
|
101
|
+
:ssl_key => :sslkey,
|
102
|
+
:ssl_key_password => :keypasswd,
|
103
|
+
:ssl_key_type => :sslkeytype,
|
104
|
+
:ssl_version => :sslversion,
|
105
|
+
:username => :userpwd
|
106
|
+
}
|
107
|
+
removed = [:cache_key_basis, :cache_timout, :user_agent]
|
108
|
+
if new_option = renamed[option.to_sym]
|
109
|
+
"\nPlease try #{new_option} instead of #{option}." if new_option
|
110
|
+
elsif removed.include?(option.to_sym)
|
111
|
+
"\nThe option #{option} was removed."
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
data/lib/typhoeus/expectation.rb
CHANGED
@@ -63,12 +63,12 @@ module Typhoeus
|
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
66
|
-
# Creates an
|
66
|
+
# Creates an expectation.
|
67
67
|
#
|
68
|
-
# @example Create
|
68
|
+
# @example Create expectation.
|
69
69
|
# Typhoeus::Expectation.new(base_url)
|
70
70
|
#
|
71
|
-
# @return [ Expectation ] The created
|
71
|
+
# @return [ Expectation ] The created expectation.
|
72
72
|
#
|
73
73
|
# @api private
|
74
74
|
def initialize(base_url, options = {})
|
@@ -78,11 +78,11 @@ module Typhoeus
|
|
78
78
|
@from = nil
|
79
79
|
end
|
80
80
|
|
81
|
-
# Set from value to mark an
|
81
|
+
# Set from value to mark an expectaion. Useful for
|
82
82
|
# other libraries, eg. webmock.
|
83
83
|
#
|
84
|
-
# @example Mark
|
85
|
-
#
|
84
|
+
# @example Mark expectation.
|
85
|
+
# expectation.from(:webmock)
|
86
86
|
#
|
87
87
|
# @param [ String ] value Value to set.
|
88
88
|
#
|
@@ -95,7 +95,7 @@ module Typhoeus
|
|
95
95
|
end
|
96
96
|
|
97
97
|
# Specify what should be returned,
|
98
|
-
# when this
|
98
|
+
# when this expectation is hit.
|
99
99
|
#
|
100
100
|
# @example Add response.
|
101
101
|
# expectation.and_return(response)
|
data/lib/typhoeus/hydra.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
require 'typhoeus/hydra/addable'
|
2
2
|
require 'typhoeus/hydra/before'
|
3
3
|
require 'typhoeus/hydra/block_connection'
|
4
|
-
require 'typhoeus/hydra/easy_factory'
|
5
|
-
require 'typhoeus/hydra/easy_pool'
|
6
4
|
require 'typhoeus/hydra/memoizable'
|
7
5
|
require 'typhoeus/hydra/queueable'
|
8
6
|
require 'typhoeus/hydra/runnable'
|
@@ -40,7 +38,6 @@ module Typhoeus
|
|
40
38
|
# @note Callbacks are going to delay the request
|
41
39
|
# execution.
|
42
40
|
class Hydra
|
43
|
-
include Hydra::EasyPool
|
44
41
|
include Hydra::Addable
|
45
42
|
include Hydra::Runnable
|
46
43
|
include Hydra::Memoizable
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Typhoeus
|
2
|
+
|
3
|
+
# The easy pool stores already initialized
|
4
|
+
# easy handles for future use. This is useful
|
5
|
+
# because creating them is quite expensive.
|
6
|
+
#
|
7
|
+
# @api private
|
8
|
+
module Pool
|
9
|
+
extend self
|
10
|
+
|
11
|
+
# Return the easy pool.
|
12
|
+
#
|
13
|
+
# @example Return easy pool.
|
14
|
+
# hydra.easy_pool
|
15
|
+
#
|
16
|
+
# @return [ Array<Ethon::Easy> ] The easy pool.
|
17
|
+
def easies
|
18
|
+
@easies ||= []
|
19
|
+
end
|
20
|
+
|
21
|
+
# Releases easy into pool. The easy handle is
|
22
|
+
# resetted before it gets back in.
|
23
|
+
#
|
24
|
+
# @example Release easy.
|
25
|
+
# hydra.release_easy(easy)
|
26
|
+
def release(easy)
|
27
|
+
easy.reset
|
28
|
+
easies << easy
|
29
|
+
end
|
30
|
+
|
31
|
+
# Return an easy from pool.
|
32
|
+
#
|
33
|
+
# @example Return easy.
|
34
|
+
# hydra.get_easy
|
35
|
+
#
|
36
|
+
# @return [ Ethon::Easy ] The easy.
|
37
|
+
def get
|
38
|
+
easies.pop || Ethon::Easy.new
|
39
|
+
end
|
40
|
+
|
41
|
+
def clear
|
42
|
+
easies.clear
|
43
|
+
end
|
44
|
+
|
45
|
+
def with_easy(&block)
|
46
|
+
easy = get
|
47
|
+
yield easy
|
48
|
+
release easy
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/lib/typhoeus/request.rb
CHANGED
@@ -111,9 +111,17 @@ module Typhoeus
|
|
111
111
|
|
112
112
|
set_defaults
|
113
113
|
end
|
114
|
-
|
114
|
+
|
115
|
+
# Return the url.
|
116
|
+
# In contrast to base_url which returns the value you specified, url returns
|
117
|
+
# the full url including the parameters.
|
118
|
+
#
|
119
|
+
# @example Get the url.
|
120
|
+
# request.url
|
121
|
+
#
|
122
|
+
# @since 0.5.5
|
115
123
|
def url
|
116
|
-
|
124
|
+
EasyFactory.new(self).get.url
|
117
125
|
end
|
118
126
|
|
119
127
|
# Returns wether other is equal to self.
|
@@ -12,20 +12,8 @@ module Typhoeus
|
|
12
12
|
#
|
13
13
|
# @return [ Response ] The response.
|
14
14
|
def run
|
15
|
-
easy =
|
16
|
-
begin
|
17
|
-
easy.http_request(
|
18
|
-
base_url,
|
19
|
-
options.fetch(:method, :get),
|
20
|
-
options.reject{|k,_| k==:method}
|
21
|
-
)
|
22
|
-
rescue Ethon::Errors::InvalidOption => e
|
23
|
-
help = provide_help(e.message.match(/:\s(\w+)/)[1])
|
24
|
-
raise $!, "#{$!}#{help}", $!.backtrace
|
25
|
-
end
|
15
|
+
easy = EasyFactory.new(self).get
|
26
16
|
easy.perform
|
27
|
-
finish(Response.new(easy.to_hash))
|
28
|
-
Typhoeus.release_easy(easy)
|
29
17
|
response
|
30
18
|
end
|
31
19
|
|
@@ -47,40 +35,6 @@ module Typhoeus
|
|
47
35
|
execute_callbacks
|
48
36
|
response
|
49
37
|
end
|
50
|
-
|
51
|
-
private
|
52
|
-
|
53
|
-
def provide_help(option)
|
54
|
-
renamed = {
|
55
|
-
:auth_method => :httpauth,
|
56
|
-
:connect_timeout => :connecttimeout,
|
57
|
-
:disable_ssl_host_verification => :ssl_verifyhost,
|
58
|
-
:disable_ssl_peer_verification => :ssl_verifypeer,
|
59
|
-
:encoding => :accept_encoding,
|
60
|
-
:follow_location => :followlocation,
|
61
|
-
:max_redirects => :maxredirs,
|
62
|
-
:password => :userpwd,
|
63
|
-
:proxy_auth_method => :proxyauth,
|
64
|
-
:proxy_password => :proxyuserpwd,
|
65
|
-
:proxy_type => :proxytype,
|
66
|
-
:proxy_username => :proxyuserpwd,
|
67
|
-
:ssl_cacert => :cainfo,
|
68
|
-
:ssl_capath => :capath,
|
69
|
-
:ssl_cert => :sslcert,
|
70
|
-
:ssl_cert_type => :sslcerttype,
|
71
|
-
:ssl_key => :sslkey,
|
72
|
-
:ssl_key_password => :keypasswd,
|
73
|
-
:ssl_key_type => :sslkeytype,
|
74
|
-
:ssl_version => :sslversion,
|
75
|
-
:username => :userpwd
|
76
|
-
}
|
77
|
-
removed = [:cache_key_basis, :cache_timout, :user_agent]
|
78
|
-
if new_option = renamed[option.to_sym]
|
79
|
-
"\nPlease try #{new_option} instead of #{option}." if new_option
|
80
|
-
elsif removed.include?(option.to_sym)
|
81
|
-
"\nThe option #{option} was removed."
|
82
|
-
end
|
83
|
-
end
|
84
38
|
end
|
85
39
|
end
|
86
40
|
end
|
data/lib/typhoeus/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: typhoeus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.6'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2013-
|
14
|
+
date: 2013-02-10 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: ethon
|
@@ -20,7 +20,7 @@ dependencies:
|
|
20
20
|
requirements:
|
21
21
|
- - ~>
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version: 0.5.
|
23
|
+
version: 0.5.8
|
24
24
|
type: :runtime
|
25
25
|
prerelease: false
|
26
26
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -28,7 +28,7 @@ dependencies:
|
|
28
28
|
requirements:
|
29
29
|
- - ~>
|
30
30
|
- !ruby/object:Gem::Version
|
31
|
-
version: 0.5.
|
31
|
+
version: 0.5.8
|
32
32
|
description: Like a modern code version of the mythical beast with 100 serpent heads,
|
33
33
|
Typhoeus runs HTTP requests in parallel while cleanly encapsulating handling logic.
|
34
34
|
email:
|
@@ -42,6 +42,7 @@ files:
|
|
42
42
|
- lib/rack/typhoeus.rb
|
43
43
|
- lib/typhoeus/adapters/faraday.rb
|
44
44
|
- lib/typhoeus/config.rb
|
45
|
+
- lib/typhoeus/easy_factory.rb
|
45
46
|
- lib/typhoeus/errors/no_stub.rb
|
46
47
|
- lib/typhoeus/errors/typhoeus_error.rb
|
47
48
|
- lib/typhoeus/errors.rb
|
@@ -49,13 +50,12 @@ files:
|
|
49
50
|
- lib/typhoeus/hydra/addable.rb
|
50
51
|
- lib/typhoeus/hydra/before.rb
|
51
52
|
- lib/typhoeus/hydra/block_connection.rb
|
52
|
-
- lib/typhoeus/hydra/easy_factory.rb
|
53
|
-
- lib/typhoeus/hydra/easy_pool.rb
|
54
53
|
- lib/typhoeus/hydra/memoizable.rb
|
55
54
|
- lib/typhoeus/hydra/queueable.rb
|
56
55
|
- lib/typhoeus/hydra/runnable.rb
|
57
56
|
- lib/typhoeus/hydra/stubbable.rb
|
58
57
|
- lib/typhoeus/hydra.rb
|
58
|
+
- lib/typhoeus/pool.rb
|
59
59
|
- lib/typhoeus/railtie.rb
|
60
60
|
- lib/typhoeus/request/actions.rb
|
61
61
|
- lib/typhoeus/request/before.rb
|
@@ -92,7 +92,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
92
92
|
version: '0'
|
93
93
|
segments:
|
94
94
|
- 0
|
95
|
-
hash: -
|
95
|
+
hash: -3606414127018895493
|
96
96
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
97
97
|
none: false
|
98
98
|
requirements:
|
@@ -1,78 +0,0 @@
|
|
1
|
-
module Typhoeus
|
2
|
-
class Hydra
|
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 the
|
6
|
-
# on_complete callback to be set.
|
7
|
-
# This is done by this class.
|
8
|
-
#
|
9
|
-
# @api private
|
10
|
-
class EasyFactory
|
11
|
-
|
12
|
-
# Returns the request provided.
|
13
|
-
#
|
14
|
-
# @return [ Typhoeus::Request ]
|
15
|
-
attr_reader :request
|
16
|
-
|
17
|
-
# Returns the hydra provided.
|
18
|
-
#
|
19
|
-
# @return [ Typhoeus::Hydra ]
|
20
|
-
attr_reader :hydra
|
21
|
-
|
22
|
-
# Create an easy factory.
|
23
|
-
#
|
24
|
-
# @example Create easy factory.
|
25
|
-
# Typhoeus::Hydra::EasyFactory.new(request, hydra)
|
26
|
-
#
|
27
|
-
# @param [ Request ] request The request to build an easy for.
|
28
|
-
# @param [ Hydra ] hydra The hydra to build an easy for.
|
29
|
-
def initialize(request, hydra)
|
30
|
-
@request = request
|
31
|
-
@hydra = hydra
|
32
|
-
end
|
33
|
-
|
34
|
-
# Return the easy in question.
|
35
|
-
#
|
36
|
-
# @example Return easy.
|
37
|
-
# easy_factory.easy
|
38
|
-
#
|
39
|
-
# @return [ Ethon::Easy ] The easy.
|
40
|
-
def easy
|
41
|
-
@easy ||= hydra.get_easy
|
42
|
-
end
|
43
|
-
|
44
|
-
# Fabricated easy.
|
45
|
-
#
|
46
|
-
# @example Prepared easy.
|
47
|
-
# easy_factory.get
|
48
|
-
#
|
49
|
-
# @return [ Ethon::Easy ] The easy.
|
50
|
-
def get
|
51
|
-
easy.http_request(
|
52
|
-
request.base_url,
|
53
|
-
request.options.fetch(:method, :get),
|
54
|
-
request.options.reject{|k,_| k==:method}
|
55
|
-
)
|
56
|
-
set_callback
|
57
|
-
easy
|
58
|
-
end
|
59
|
-
|
60
|
-
private
|
61
|
-
|
62
|
-
# Sets on_complete callback on easy in order to be able to
|
63
|
-
# track progress.
|
64
|
-
#
|
65
|
-
# @example Set callback.
|
66
|
-
# easy_factory.set_callback
|
67
|
-
#
|
68
|
-
# @return [ Ethon::Easy ] The easy.
|
69
|
-
def set_callback
|
70
|
-
easy.on_complete do |easy|
|
71
|
-
request.finish(Response.new(easy.to_hash))
|
72
|
-
hydra.release_easy(easy)
|
73
|
-
hydra.add(hydra.queued_requests.shift) unless hydra.queued_requests.empty?
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
module Typhoeus
|
2
|
-
class Hydra
|
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
|
-
#
|
8
|
-
# @api private
|
9
|
-
module EasyPool
|
10
|
-
|
11
|
-
# Return the easy pool.
|
12
|
-
#
|
13
|
-
# @example Return easy pool.
|
14
|
-
# hydra.easy_pool
|
15
|
-
#
|
16
|
-
# @return [ Array<Ethon::Easy> ] The easy pool.
|
17
|
-
def easy_pool
|
18
|
-
@easy_pool ||= []
|
19
|
-
end
|
20
|
-
|
21
|
-
# Releases easy into pool. The easy handle is
|
22
|
-
# resetted before it gets back in.
|
23
|
-
#
|
24
|
-
# @example Release easy.
|
25
|
-
# hydra.release_easy(easy)
|
26
|
-
def release_easy(easy)
|
27
|
-
easy.reset
|
28
|
-
easy_pool << easy
|
29
|
-
end
|
30
|
-
|
31
|
-
# Return an easy from pool.
|
32
|
-
#
|
33
|
-
# @example Return easy.
|
34
|
-
# hydra.get_easy
|
35
|
-
#
|
36
|
-
# @return [ Ethon::Easy ] The easy.
|
37
|
-
def get_easy
|
38
|
-
easy_pool.pop || Ethon::Easy.new
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|