typhoeus 0.5.0.rc → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Changelog
2
2
 
3
- ## 0.5.0.pre
3
+ ## 0.5.0
4
4
 
5
5
  [Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.4.2...master)
6
6
 
@@ -8,18 +8,13 @@ Major Changes:
8
8
 
9
9
  * Ethon integration
10
10
  * Params are url params and a body is always a body for every request type
11
- * Request parameter and body are properly encoded (only POST multiform body is not)
12
- * No more header sanitizing
13
-
14
- Before: `:headers => { 'user_agent' => 'Custom' }` was modified to
15
- `:headers => { 'User-Agent' => 'Custom' }`
16
-
17
11
  * The options you can set might have a slightly other names, as Ethon sticks to
18
12
  libcurl names. See
19
13
  [Easy.new](http://rubydoc.info/github/typhoeus/ethon/Ethon/Easy#initialize-instance_method)
20
14
  for a description.
21
- * The following classes were deleted because they do not seemed to be uesed at all. If that
22
- turns out to be wrong, they will be restored: `Typhoeus::Filter`, `Typhoeus::Remote`, `Typhoeus::RemoteMethod`, `Typhoeus::RemoteProxyObject`
15
+ * Request parameter and body are properly encoded (only POST multiform body is not)
16
+ * No more header sanitizing. Before: `:headers => { 'user_agent' => 'Custom' }` was modified to
17
+ `:headers => { 'User-Agent' => 'Custom' }`
23
18
  * `Typhoeus::Easy` and `Typhoeus::Multi` are now `Ethon::Easy` and `Ethon::Multi`
24
19
 
25
20
  * Request shortcuts: `Typhoeus.get("www.google.de")`
@@ -30,20 +25,23 @@ Typhoeus.configure do |config|
30
25
  config.memoize = true
31
26
  end
32
27
  ```
33
- * No more Response#headers_hash, instead response#header returning the last
28
+ * No more `Response#headers_hash`, instead `Response#headers` returning the last
34
29
  header and response#redirections returning the responses with headers
35
30
  generated through redirections
36
31
  * Instead of defining the same callbacks on every request, you can define global callbacks:
37
-
38
32
  ```ruby
39
33
  Typhoeus.on_complete { p "yay" }
40
34
  ```
41
-
42
35
  * The stubbing interface changed slightly. You now have the same syntax as for requests:
43
-
44
36
  ```ruby
45
37
  Typhoeus.stub(url, options).and_return(response)
46
38
  ```
39
+ * The following things were removed because they do not seemed to be used at all. Ping me if you disagree!
40
+ * `Typhoeus::Filter`
41
+ * `Typhoeus::Remote`
42
+ * `Typhoeus::RemoteMethod`
43
+ * `Typhoeus::RemoteProxyObject`
44
+ * build in cache interface
47
45
 
48
46
  Enhancements:
49
47
 
data/Gemfile CHANGED
@@ -8,6 +8,7 @@ group :development, :test do
8
8
 
9
9
  gem "sinatra", "~> 1.3"
10
10
  gem "json"
11
+ gem "faraday", "~> 0.8.4"
11
12
 
12
13
  if RUBY_PLATFORM == "java"
13
14
  gem "spoon"
@@ -15,5 +16,6 @@ group :development, :test do
15
16
 
16
17
  unless ENV["CI"]
17
18
  gem "guard-rspec", "~> 0.7"
19
+ gem 'rb-fsevent', '~> 0.9.1'
18
20
  end
19
21
  end
data/README.md CHANGED
@@ -7,20 +7,29 @@ Like a modern code version of the mythical beast with 100 serpent heads, Typhoeu
7
7
  Single request:
8
8
 
9
9
  ```ruby
10
- Typhoeus.get("www.example.com")
10
+ Typhoeus.get("www.example.com", followlocation: true)
11
11
  ```
12
12
 
13
13
  Parallel requests:
14
14
 
15
15
  ```ruby
16
16
  hydra = Typhoeus::Hydra.new
17
- 10.times.map{ hydra.queue(Typhoeus::Request.new("www.example.com")) }
17
+ 10.times.map{ hydra.queue(Typhoeus::Request.new("www.example.com", followlocation: true)) }
18
18
  hydra.run
19
19
  ```
20
20
 
21
+ ## Installation
22
+
23
+ ```
24
+ gem install typhoeus --pre
25
+ ```
26
+ ```
27
+ gem "typhoeus", git: "git://github.com/typhoeus/typhoeus.git"
28
+ ```
29
+
21
30
  ## Project Tracking
22
31
 
23
- * [Documentation](http://rubydoc.info/github/typhoeus/typhoeus) (github master)
32
+ * [Documentation](http://rubydoc.info/github/typhoeus/typhoeus/frames/Typhoeus) (github master)
24
33
  * [Website](http://typhoeus.github.com/) (v0.4.2)
25
34
  * [Mailinglist](http://groups.google.com/group/typhoeus)
26
35
 
data/lib/typhoeus.rb CHANGED
@@ -10,13 +10,23 @@ require 'typhoeus/response'
10
10
  require 'typhoeus/version'
11
11
 
12
12
  # Typhoeus is a http client library based on Ethon which
13
- # wraps libcurl.
13
+ # wraps libcurl. Sitting on top of libcurl make Typhoeus
14
+ # very reliable and fast.
15
+ #
16
+ # There are some gems using Typhoeus like
17
+ # {https://github.com/myronmarston/vcr VCR},
18
+ # {https://github.com/bblimke/webmock Webmock} or
19
+ # {https://github.com/technoweenie/faraday Faraday}. VCR
20
+ # and Webmock are providing their own adapter
21
+ # whereas Faraday relies on {Faraday::Adapter::Typhoeus}
22
+ # since Typhoeus version 0.5.
14
23
  #
15
24
  # @example (see Typhoeus::Request)
16
25
  # @example (see Typhoeus::Hydra)
17
26
  #
18
27
  # @see Typhoeus::Request
19
28
  # @see Typhoeus::Hydra
29
+ # @see Faraday::Adapter::Typhoeus
20
30
  #
21
31
  # @since 0.5.0
22
32
  module Typhoeus
@@ -0,0 +1,136 @@
1
+ require 'faraday'
2
+
3
+ module Faraday # :nodoc:
4
+ class Adapter # :nodoc:
5
+
6
+ # Adapter to use Faraday with Typhoeus.
7
+ #
8
+ # @example Use Typhoeus.
9
+ # require 'faraday'
10
+ # require 'typhoeus'
11
+ # require 'typhoeus/adapters/faraday'
12
+ #
13
+ # conn = Faraday.new(url: "www.example.com") do |faraday|
14
+ # faraday.adapter :typhoeus
15
+ # end
16
+ #
17
+ # response = conn.get("/")
18
+ class Typhoeus < Faraday::Adapter
19
+ self.supports_parallel = true
20
+
21
+ # Setup Hydra with provided options.
22
+ #
23
+ # @example Setup Hydra.
24
+ # Faraday::Adapter::Typhoeus.setup_parallel_manager
25
+ # #=> #<Typhoeus::Hydra ... >
26
+ #
27
+ # @param (see Typhoeus::Hydra#initialize)
28
+ # @option (see Typhoeus::Hydra#initialize)
29
+ #
30
+ # @return [ Typhoeus::Hydra ] The hydra.
31
+ def self.setup_parallel_manager(options = {})
32
+ ::Typhoeus::Hydra.new(options)
33
+ end
34
+
35
+ dependency 'typhoeus'
36
+
37
+ # Hook into Faraday and perform the request with Typhoeus.
38
+ #
39
+ # @param [ Hash ] env The environment.
40
+ #
41
+ # @return [ void ]
42
+ def call(env)
43
+ super
44
+ perform_request env
45
+ @app.call env
46
+ end
47
+
48
+ private
49
+
50
+ def perform_request(env)
51
+ if parallel?(env)
52
+ env[:parallel_manager].queue request(env)
53
+ else
54
+ request(env).run
55
+ end
56
+ end
57
+
58
+ def request(env)
59
+ read_body env
60
+
61
+ req = ::Typhoeus::Request.new(
62
+ env[:url].to_s,
63
+ :method => env[:method],
64
+ :body => env[:body],
65
+ :headers => env[:request_headers]
66
+ )
67
+
68
+ configure_ssl req, env
69
+ configure_proxy req, env
70
+ configure_timeout req, env
71
+ configure_socket req, env
72
+
73
+ req.on_complete do |resp|
74
+ if resp.timed_out?
75
+ if parallel?(env)
76
+ # TODO: error callback in async mode
77
+ else
78
+ raise Faraday::Error::TimeoutError, "request timed out"
79
+ end
80
+ end
81
+
82
+ save_response(env, resp.code, resp.body) do |response_headers|
83
+ response_headers.parse resp.response_headers
84
+ end
85
+ # in async mode, :response is initialized at this point
86
+ env[:response].finish(env) if parallel?(env)
87
+ end
88
+
89
+ req
90
+ end
91
+
92
+ def read_body(env)
93
+ env[:body] = env[:body].read if env[:body].respond_to? :read
94
+ end
95
+
96
+ def configure_ssl(req, env)
97
+ ssl = env[:ssl]
98
+
99
+ ssl_verifyhost = (ssl && ssl.fetch(:verify, true)) ? 2 : 0
100
+ req.options[:ssl_verifyhost] = ssl_verifyhost
101
+ req.options[:sslversion] = ssl[:version] if ssl[:version]
102
+ req.options[:sslcert] = ssl[:client_cert_file] if ssl[:client_cert_file]
103
+ req.options[:sslkey] = ssl[:client_key_file] if ssl[:client_key_file]
104
+ req.options[:cainfo] = ssl[:ca_file] if ssl[:ca_file]
105
+ req.options[:capath] = ssl[:ca_path] if ssl[:ca_path]
106
+ end
107
+
108
+ def configure_proxy(req, env)
109
+ proxy = env[:request][:proxy]
110
+ return unless proxy
111
+
112
+ req.options[:proxy] = "#{proxy[:uri].host}:#{proxy[:uri].port}"
113
+
114
+ if proxy[:username] && proxy[:password]
115
+ req.options[:proxyuserpwd] = "#{proxy[:username]}:#{proxy[:password]}"
116
+ end
117
+ end
118
+
119
+ def configure_timeout(req, env)
120
+ env_req = env[:request]
121
+ req.options[:timeout_ms] = (env_req[:timeout] * 1000) if env_req[:timeout]
122
+ req.options[:connecttimeout_ms] = (env_req[:open_timeout] * 1000) if env_req[:open_timeout]
123
+ end
124
+
125
+ def configure_socket(req, env)
126
+ if bind = env[:request][:bind]
127
+ req.options[:interface] = bind[:host]
128
+ end
129
+ end
130
+
131
+ def parallel?(env)
132
+ !!env[:parallel_manager]
133
+ end
134
+ end
135
+ end
136
+ end
@@ -35,6 +35,9 @@ module Typhoeus
35
35
  # requests = (0..9).map{ Typhoeus::Request.new("www.example.com") }
36
36
  # requests.each{ |request| hydra.queue(request) }
37
37
  # hydra.run
38
+ #
39
+ # @note Callbacks are going to delay the request
40
+ # execution.
38
41
  class Hydra
39
42
  include Hydra::EasyPool
40
43
  include Hydra::Queueable
@@ -45,7 +48,7 @@ module Typhoeus
45
48
  include Hydra::Before
46
49
 
47
50
  # @example Set max_concurrency.
48
- # Typhoeus::Hydra.new(:max_concurrency => 20)
51
+ # Typhoeus::Hydra.new(max_concurrency: 20)
49
52
  attr_reader :max_concurrency
50
53
 
51
54
  # @api private
@@ -75,7 +78,7 @@ module Typhoeus
75
78
  # Typhoeus::Hydra.new
76
79
  #
77
80
  # @example Create a hydra with max_concurrency.
78
- # Typhoeus::Hydra.new(:max_concurrency => 20)
81
+ # Typhoeus::Hydra.new(max_concurrency: 20)
79
82
  #
80
83
  # @param [ Hash ] options The options hash.
81
84
  #
@@ -67,26 +67,26 @@ module Typhoeus
67
67
  # @example Request with url parameters.
68
68
  # response = Typhoeus::Request.new(
69
69
  # "www.example.com",
70
- # :params => {:a => 1}
70
+ # params: {a: 1}
71
71
  # ).run
72
72
  #
73
73
  # @example Request with a body.
74
74
  # response = Typhoeus::Request.new(
75
75
  # "www.example.com",
76
- # :body => {:b => 2}
76
+ # body: {b: 2}
77
77
  # ).run
78
78
  #
79
79
  # @example Request with parameters and body.
80
80
  # response = Typhoeus::Request.new(
81
81
  # "www.example.com",
82
- # :params => {:a => 1},
83
- # :body => {:b => 2}
82
+ # params: {a: 1},
83
+ # body: {b: 2}
84
84
  # ).run
85
85
  #
86
86
  # @example Create a request and allow follow redirections.
87
87
  # response = Typhoeus::Request.new(
88
88
  # "www.example.com",
89
- # :followlocation => true
89
+ # followlocation: true
90
90
  # ).run
91
91
  #
92
92
  # @param [ String ] url The url to request.
@@ -99,7 +99,7 @@ module Typhoeus
99
99
  #
100
100
  # @return [ Typhoeus::Request ] The request.
101
101
  #
102
- # @note See {Ethon::Easy#initialize} for more options.
102
+ # @note See {http://rubydoc.info/github/typhoeus/ethon/Ethon/Easy#initialize-instance_method Ethon::Easy#initialize} for more options.
103
103
  #
104
104
  # @see Typhoeus::Hydra
105
105
  # @see Typhoeus::Response
@@ -19,7 +19,7 @@ module Typhoeus
19
19
  #
20
20
  # @note (see Typhoeus::Request#initialize)
21
21
  def get(url, options = {})
22
- Request.run(url, options.merge(:method => :get))
22
+ Request.new(url, options.merge(:method => :get)).run
23
23
  end
24
24
 
25
25
  # Make a post request.
@@ -35,7 +35,7 @@ module Typhoeus
35
35
  #
36
36
  # @note (see Typhoeus::Request#initialize)
37
37
  def post(url, options = {})
38
- Request.run(url, options.merge(:method => :post))
38
+ Request.new(url, options.merge(:method => :post)).run
39
39
  end
40
40
 
41
41
  # Make a put request.
@@ -54,7 +54,7 @@ module Typhoeus
54
54
  #
55
55
  # @note (see Typhoeus::Request#initialize)
56
56
  def put(url, options = {})
57
- Request.run(url, options.merge(:method => :put))
57
+ Request.new(url, options.merge(:method => :put)).run
58
58
  end
59
59
 
60
60
  # Make a delete request.
@@ -70,7 +70,7 @@ module Typhoeus
70
70
  #
71
71
  # @note (see Typhoeus::Request#initialize)
72
72
  def delete(url, options = {})
73
- Request.run(url, options.merge(:method => :delete))
73
+ Request.new(url, options.merge(:method => :delete)).run
74
74
  end
75
75
 
76
76
  # Make a head request.
@@ -86,7 +86,7 @@ module Typhoeus
86
86
  #
87
87
  # @note (see Typhoeus::Request#initialize)
88
88
  def head(url, options = {})
89
- Request.run(url, options.merge(:method => :head))
89
+ Request.new(url, options.merge(:method => :head)).run
90
90
  end
91
91
 
92
92
  # Make a patch request.
@@ -102,7 +102,7 @@ module Typhoeus
102
102
  #
103
103
  # @note (see Typhoeus::Request#initialize)
104
104
  def patch(url, options = {})
105
- Request.run(url, options.merge(:method => :patch))
105
+ Request.new(url, options.merge(:method => :patch)).run
106
106
  end
107
107
 
108
108
  # Make a options request.
@@ -118,7 +118,7 @@ module Typhoeus
118
118
  #
119
119
  # @note (see Typhoeus::Request#initialize)
120
120
  def options(url, options = {})
121
- Request.run(url, options.merge(:method => :options))
121
+ Request.new(url, options.merge(:method => :options)).run
122
122
  end
123
123
  end
124
124
  end
@@ -42,9 +42,9 @@ module Typhoeus
42
42
  # @return [ Boolean ] True if blocked, false else.
43
43
  def blocked?
44
44
  if block_connection.nil?
45
- Typhoeus::Config.block_connection
45
+ Typhoeus::Config.block_connection
46
46
  else
47
- block_connection
47
+ block_connection
48
48
  end
49
49
  end
50
50
  end
@@ -20,6 +20,10 @@ module Typhoeus
20
20
  # request.on_complete.clear
21
21
  # request.execute_callbacks
22
22
  # #=> []
23
+ #
24
+ # @note If you're using the Hydra to execute multiple
25
+ # requests, then callbacks are delaying the
26
+ # request execution.
23
27
  module Callbacks
24
28
 
25
29
  module Types # :nodoc:
@@ -5,29 +5,6 @@ module Typhoeus
5
5
  # to make a single request.
6
6
  module Operations
7
7
 
8
- # :nodoc:
9
- def self.included(base)
10
- base.extend ClassMethods
11
- end
12
-
13
- module ClassMethods # :nodoc:
14
-
15
- # Shortcut to perform a single request.
16
- #
17
- # @example Perform request.
18
- # Request.run("www.example.com")
19
- #
20
- # @param [ String ] url The url to request.
21
- # @param [ Hash ] options The options hash.
22
- #
23
- # @return [ Response ] The response.
24
- #
25
- # @deprecated
26
- def run(url, options = {})
27
- new(url, options).run
28
- end
29
- end
30
-
31
8
  # Run a request.
32
9
  #
33
10
  # @example Run a request.
@@ -36,11 +13,16 @@ module Typhoeus
36
13
  # @return [ Response ] The response.
37
14
  def run
38
15
  easy = Typhoeus.get_easy
39
- easy.http_request(
40
- url,
41
- options.fetch(:method, :get),
42
- options.reject{|k,_| k==:method}
43
- )
16
+ begin
17
+ easy.http_request(
18
+ 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
44
26
  easy.prepare
45
27
  easy.perform
46
28
  finish(Response.new(easy.to_hash))
@@ -66,6 +48,39 @@ module Typhoeus
66
48
  execute_callbacks
67
49
  response
68
50
  end
51
+
52
+ private
53
+
54
+ def provide_help(option)
55
+ renamed = {
56
+ :connect_timeout => :connecttimeout,
57
+ :follow_location => :followlocation,
58
+ :max_redirects => :maxredirs,
59
+ :proxy_username => :proxyuserpwd,
60
+ :proxy_password => :proxyuserpwd,
61
+ :disable_ssl_peer_verification => :ssl_verifypeer,
62
+ :disable_ssl_host_verification => :ssl_verifyhost,
63
+ :ssl_cert => :sslcert,
64
+ :ssl_cert_type => :sslcerttype,
65
+ :ssl_key => :sslkey,
66
+ :ssl_key_type => :sslkeytype,
67
+ :ssl_key_password => :keypasswd,
68
+ :ssl_cacert => :cainfo,
69
+ :ssl_capath => :capath,
70
+ :ssl_version => :sslversion,
71
+ :username => :userpwd,
72
+ :password => :userpwd,
73
+ :auth_method => :httpauth,
74
+ :proxy_auth_method => :proxyauth,
75
+ :proxy_type => :proxytype
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
69
84
  end
70
85
  end
71
86
  end
@@ -14,7 +14,7 @@ module Typhoeus
14
14
  # @example Get request.
15
15
  # request = Typhoeus::Request.get("www.example.com")
16
16
  # response = request.run
17
- # response == request.response
17
+ # request == response.request
18
18
  # #=> true
19
19
  #
20
20
  # @return [ Typhoeus::Request ]
@@ -42,6 +42,9 @@ module Typhoeus
42
42
  @headers = options[:headers]
43
43
  end
44
44
 
45
+ # Returns wether this request is mocked
46
+ # or not.
47
+ #
45
48
  # @api private
46
49
  def mock
47
50
  defined?(@mock) ? @mock : options[:mock]
@@ -23,23 +23,26 @@ module Typhoeus
23
23
  # header.parse
24
24
  def parse
25
25
  raw.lines.each do |header|
26
- unless header =~ /^HTTP\/1.[01]/
27
- parts = header.split(':', 2)
28
- unless parts.empty?
29
- parts.map(&:strip!)
30
- if self.has_key?(parts[0])
31
- self[parts[0]] = [self[parts[0]]] unless self[parts[0]].kind_of? Array
32
- self[parts[0]] << parts[1]
33
- else
34
- self[parts[0]] = parts[1]
35
- end
36
- end
37
- end
26
+ next if header.empty? || header =~ /^HTTP\/1.[01]/
27
+ process_line(header)
38
28
  end
39
29
  end
40
30
 
41
31
  private
42
32
 
33
+ # Processes line and saves the result.
34
+ #
35
+ # @return [ void ]
36
+ def process_line(header)
37
+ key, value = header.split(':', 2).map(&:strip)
38
+ if self.has_key?(key)
39
+ self[key] = [self[key]] unless self[key].is_a? Array
40
+ self[key] << value
41
+ else
42
+ self[key] = value
43
+ end
44
+ end
45
+
43
46
  # Returns the raw header or empty string.
44
47
  #
45
48
  # @example Return raw header.
@@ -20,7 +20,7 @@ module Typhoeus
20
20
  # Except when responding to a HEAD request, the server SHOULD include an entity containing
21
21
  # an explanation of the error situation [...]
22
22
  # This means 'HTTP/1.1 404' is as valid as 'HTTP/1.1 404 Not Found' and we have to handle it.
23
-
23
+ #
24
24
  # Regexp doc: http://rubular.com/r/eAr1oVYsVa
25
25
  if first_header_line != nil and first_header_line[/\d{3} (.*)$/, 1] != nil
26
26
  @status_message = first_header_line[/\d{3} (.*)$/, 1].chomp
@@ -73,7 +73,13 @@ module Typhoeus
73
73
 
74
74
  # :nodoc:
75
75
  def first_header_line
76
- @first_header_line ||= response_headers.to_s.split("\n").first
76
+ @first_header_line ||= begin
77
+ if response_headers.to_s.include?("\r\n\r\n")
78
+ response_headers.to_s.split("\r\n\r\n").last.split("\r\n").first
79
+ else
80
+ response_headers.to_s.split("\r\n").first
81
+ end
82
+ end
77
83
  end
78
84
  end
79
85
  end
@@ -1,5 +1,5 @@
1
1
  module Typhoeus
2
2
 
3
3
  # The current Typhoeus version.
4
- VERSION = '0.5.0.rc'
4
+ VERSION = '0.5.0'
5
5
  end
metadata CHANGED
@@ -1,8 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: typhoeus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0.rc
5
- prerelease: 6
4
+ version: 0.5.0
5
+ prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - David Balatero
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2012-10-06 00:00:00.000000000 Z
14
+ date: 2012-10-30 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.0
23
+ version: 0.5.2
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.0
31
+ version: 0.5.2
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:
@@ -37,6 +37,7 @@ executables: []
37
37
  extensions: []
38
38
  extra_rdoc_files: []
39
39
  files:
40
+ - lib/typhoeus/adapters/faraday.rb
40
41
  - lib/typhoeus/config.rb
41
42
  - lib/typhoeus/errors/no_stub.rb
42
43
  - lib/typhoeus/errors/typhoeus_error.rb
@@ -86,7 +87,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
86
87
  version: '0'
87
88
  segments:
88
89
  - 0
89
- hash: -3871520876617813232
90
+ hash: -2522351330136258713
90
91
  required_rubygems_version: !ruby/object:Gem::Requirement
91
92
  none: false
92
93
  requirements: