typhoeus 1.0.2 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +11 -8
- data/CHANGELOG.md +29 -1
- data/CONTRIBUTING.md +4 -0
- data/Gemfile +10 -3
- data/README.md +66 -41
- data/lib/typhoeus/adapters/faraday.rb +29 -9
- data/lib/typhoeus/cache/dalli.rb +28 -0
- data/lib/typhoeus/cache/rails.rb +28 -0
- data/lib/typhoeus/cache/redis.rb +35 -0
- data/lib/typhoeus/config.rb +8 -1
- data/lib/typhoeus/easy_factory.rb +7 -2
- data/lib/typhoeus/hydra/cacheable.rb +1 -1
- data/lib/typhoeus/request/actions.rb +7 -7
- data/lib/typhoeus/request/cacheable.rb +14 -3
- data/lib/typhoeus/request/callbacks.rb +21 -3
- data/lib/typhoeus/request/marshal.rb +2 -2
- data/lib/typhoeus/request/streamable.rb +1 -1
- data/lib/typhoeus/request.rb +2 -0
- data/lib/typhoeus/response/header.rb +12 -5
- data/lib/typhoeus/response/informations.rb +7 -3
- data/lib/typhoeus/response/status.rb +22 -2
- data/lib/typhoeus/response.rb +1 -1
- data/lib/typhoeus/version.rb +1 -1
- data/lib/typhoeus.rb +19 -3
- data/spec/typhoeus/adapters/faraday_spec.rb +237 -191
- data/spec/typhoeus/cache/dalli_spec.rb +41 -0
- data/spec/typhoeus/cache/redis_spec.rb +41 -0
- data/spec/typhoeus/config_spec.rb +1 -1
- data/spec/typhoeus/easy_factory_spec.rb +6 -0
- data/spec/typhoeus/hydra/cacheable_spec.rb +31 -1
- data/spec/typhoeus/pool_spec.rb +4 -2
- data/spec/typhoeus/request/cacheable_spec.rb +24 -0
- data/spec/typhoeus/request/callbacks_spec.rb +2 -2
- data/spec/typhoeus/request/marshal_spec.rb +1 -1
- data/spec/typhoeus/request_spec.rb +21 -3
- data/spec/typhoeus/response/header_spec.rb +51 -1
- data/spec/typhoeus/response/informations_spec.rb +12 -1
- data/spec/typhoeus/response/status_spec.rb +54 -0
- metadata +10 -3
@@ -10,7 +10,7 @@ module Typhoeus
|
|
10
10
|
# Setting an on_body callback will cause the response body to be empty.
|
11
11
|
#
|
12
12
|
# @example Set on_body.
|
13
|
-
# request.on_body { |
|
13
|
+
# request.on_body { |body_chunk, response| puts "Got #{body_chunk.bytesize} bytes" }
|
14
14
|
#
|
15
15
|
# @param [ Block ] block The block to execute.
|
16
16
|
#
|
data/lib/typhoeus/request.rb
CHANGED
@@ -212,8 +212,10 @@ module Typhoeus
|
|
212
212
|
default_user_agent = Config.user_agent || Typhoeus::USER_AGENT
|
213
213
|
|
214
214
|
options[:headers] = {'User-Agent' => default_user_agent}.merge(options[:headers] || {})
|
215
|
+
options[:headers]['Expect'] ||= ''
|
215
216
|
options[:verbose] = Typhoeus::Config.verbose if options[:verbose].nil? && !Typhoeus::Config.verbose.nil?
|
216
217
|
options[:maxredirs] ||= 50
|
218
|
+
options[:proxy] = Typhoeus::Config.proxy unless options.has_key?(:proxy) || Typhoeus::Config.proxy.nil?
|
217
219
|
end
|
218
220
|
end
|
219
221
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'delegate'
|
2
|
+
|
1
3
|
module Typhoeus
|
2
4
|
class Response
|
3
5
|
|
@@ -6,7 +8,7 @@ module Typhoeus
|
|
6
8
|
# Values can be strings (normal case) or arrays of strings (for duplicates headers)
|
7
9
|
#
|
8
10
|
# @api private
|
9
|
-
class Header < Hash
|
11
|
+
class Header < DelegateClass(Hash)
|
10
12
|
|
11
13
|
# Create a new header.
|
12
14
|
#
|
@@ -15,10 +17,14 @@ module Typhoeus
|
|
15
17
|
#
|
16
18
|
# @param [ String ] raw The raw header.
|
17
19
|
def initialize(raw)
|
20
|
+
super({})
|
18
21
|
@raw = raw
|
19
22
|
@sanitized = {}
|
20
23
|
parse
|
21
|
-
|
24
|
+
end
|
25
|
+
|
26
|
+
def [](key)
|
27
|
+
fetch(key) { @sanitized[key.to_s.downcase] }
|
22
28
|
end
|
23
29
|
|
24
30
|
# Parses the raw header.
|
@@ -32,8 +38,9 @@ module Typhoeus
|
|
32
38
|
process_pair(k, v)
|
33
39
|
end
|
34
40
|
when String
|
35
|
-
raw.
|
36
|
-
|
41
|
+
raw.split(/\r?\n(?!\s)/).each do |header|
|
42
|
+
header.strip!
|
43
|
+
next if header.empty? || header.start_with?( 'HTTP/' )
|
37
44
|
process_line(header)
|
38
45
|
end
|
39
46
|
end
|
@@ -46,7 +53,7 @@ module Typhoeus
|
|
46
53
|
# @return [ void ]
|
47
54
|
def process_line(header)
|
48
55
|
key, value = header.split(':', 2)
|
49
|
-
process_pair(key.strip, value.strip)
|
56
|
+
process_pair(key.strip, (value ? value.strip.gsub(/\r?\n\s*/, ' ') : ''))
|
50
57
|
end
|
51
58
|
|
52
59
|
# Sets key value pair for self and @sanitized.
|
@@ -47,9 +47,13 @@ module Typhoeus
|
|
47
47
|
def response_headers
|
48
48
|
return options[:response_headers] if options[:response_headers]
|
49
49
|
if mock? && h = options[:headers]
|
50
|
-
|
51
|
-
|
52
|
-
|
50
|
+
status_code = return_code || "200"
|
51
|
+
reason_phrase = status_code == "200" ? "OK" : "Mock Reason Phrase"
|
52
|
+
status_line = "HTTP/1.1 #{status_code} #{reason_phrase}"
|
53
|
+
actual_headers = h.map{ |k,v| [k, v.respond_to?(:join) ? v.join(',') : v] }.
|
54
|
+
map{ |e| "#{e.first}: #{e.last}" }
|
55
|
+
|
56
|
+
[status_line, *actual_headers].join("\r\n")
|
53
57
|
end
|
54
58
|
end
|
55
59
|
|
@@ -39,14 +39,24 @@ module Typhoeus
|
|
39
39
|
@http_version ||= first_header_line ? first_header_line[/HTTP\/(\S+)/, 1] : nil
|
40
40
|
end
|
41
41
|
|
42
|
-
# Return
|
42
|
+
# Return whether the response is a success.
|
43
43
|
#
|
44
44
|
# @example Return if the response was successful.
|
45
45
|
# response.success?
|
46
46
|
#
|
47
47
|
# @return [ Boolean ] Return true if successful, false else.
|
48
48
|
def success?
|
49
|
-
(mock || return_code == :ok) && response_code &&
|
49
|
+
(mock || return_code == :ok) && response_code && has_good_response_code?
|
50
|
+
end
|
51
|
+
|
52
|
+
# Return whether the response is a failure.
|
53
|
+
#
|
54
|
+
# @example Return if the response was failed.
|
55
|
+
# response.failure?
|
56
|
+
#
|
57
|
+
# @return [ Boolean ] Return true if failure, false else.
|
58
|
+
def failure?
|
59
|
+
(mock || return_code == :internal_server_error) && response_code && has_bad_response_code?
|
50
60
|
end
|
51
61
|
|
52
62
|
# Return wether the response is modified.
|
@@ -81,6 +91,16 @@ module Typhoeus
|
|
81
91
|
end
|
82
92
|
end
|
83
93
|
end
|
94
|
+
|
95
|
+
# :nodoc:
|
96
|
+
def has_good_response_code?
|
97
|
+
response_code >= 200 && response_code < 300
|
98
|
+
end
|
99
|
+
|
100
|
+
# :nodoc:
|
101
|
+
def has_bad_response_code?
|
102
|
+
!has_good_response_code?
|
103
|
+
end
|
84
104
|
end
|
85
105
|
end
|
86
106
|
end
|
data/lib/typhoeus/response.rb
CHANGED
@@ -14,7 +14,7 @@ module Typhoeus
|
|
14
14
|
# Remembers the corresponding request.
|
15
15
|
#
|
16
16
|
# @example Get request.
|
17
|
-
# request = Typhoeus::Request.
|
17
|
+
# request = Typhoeus::Request.new("www.example.com")
|
18
18
|
# response = request.run
|
19
19
|
# request == response.request
|
20
20
|
# #=> true
|
data/lib/typhoeus/version.rb
CHANGED
data/lib/typhoeus.rb
CHANGED
@@ -17,6 +17,21 @@ if defined?(Rack)
|
|
17
17
|
require "rack/typhoeus"
|
18
18
|
end
|
19
19
|
|
20
|
+
# If the Redis gem is available, load the redis cache adapter
|
21
|
+
if defined?(Redis)
|
22
|
+
require "typhoeus/cache/redis"
|
23
|
+
end
|
24
|
+
|
25
|
+
# If the Dalli gem is available, load the Dalli cache adapter
|
26
|
+
if defined?(Dalli)
|
27
|
+
require "typhoeus/cache/dalli"
|
28
|
+
end
|
29
|
+
|
30
|
+
# If we are using Rails, load the Rails cache adapter
|
31
|
+
if defined?(Rails)
|
32
|
+
require "typhoeus/cache/rails"
|
33
|
+
end
|
34
|
+
|
20
35
|
# If we are using Rails, then we will include the Typhoeus railtie.
|
21
36
|
# if defined?(Rails)
|
22
37
|
# require "typhoeus/railtie"
|
@@ -112,11 +127,12 @@ module Typhoeus
|
|
112
127
|
# #=> :ok
|
113
128
|
# end
|
114
129
|
#
|
115
|
-
# @
|
116
|
-
#
|
130
|
+
# @yield Yields control to the block after disabling block_connection.
|
131
|
+
# Afterwards, the block_connection is set to its original
|
132
|
+
# value.
|
117
133
|
# @return [ Object ] Returns the return value of the block.
|
118
134
|
#
|
119
|
-
# @see Typhoeus::Config
|
135
|
+
# @see Typhoeus::Config.block_connection
|
120
136
|
def self.with_connection
|
121
137
|
old = Config.block_connection
|
122
138
|
Config.block_connection = false
|