typhoeus 1.0.2 → 1.4.0
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.
- 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
|