pauldix-typhoeus 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/typhoeus/hydra.rb +32 -25
- metadata +1 -1
data/lib/typhoeus/hydra.rb
CHANGED
@@ -5,18 +5,24 @@ module Typhoeus
|
|
5
5
|
@easy_pool = []
|
6
6
|
@mocks = []
|
7
7
|
@memoized_requests = {}
|
8
|
+
@retrieved_from_cache = {}
|
8
9
|
end
|
9
|
-
|
10
|
+
|
10
11
|
def self.hydra
|
11
12
|
@hydra ||= new
|
12
13
|
end
|
13
14
|
|
14
15
|
def queue(request)
|
15
16
|
return if assign_to_mock(request)
|
16
|
-
|
17
|
+
|
17
18
|
if request.method == :get
|
18
19
|
if @memoized_requests.has_key? request.url
|
19
|
-
@
|
20
|
+
if response = @retrieved_from_cache[request.url]
|
21
|
+
request.response = response
|
22
|
+
request.call_handlers
|
23
|
+
else
|
24
|
+
@memoized_requests[request.url] << request
|
25
|
+
end
|
20
26
|
else
|
21
27
|
@memoized_requests[request.url] = []
|
22
28
|
get_from_cache_or_queue(request)
|
@@ -35,41 +41,42 @@ module Typhoeus
|
|
35
41
|
end
|
36
42
|
@multi.perform
|
37
43
|
@memoized_requests = {}
|
44
|
+
@retrieved_from_cache = {}
|
38
45
|
end
|
39
|
-
|
46
|
+
|
40
47
|
def cache_getter(&block)
|
41
48
|
@cache_getter = block
|
42
49
|
end
|
43
|
-
|
50
|
+
|
44
51
|
def cache_setter(&block)
|
45
52
|
@cache_setter = block
|
46
53
|
end
|
47
|
-
|
54
|
+
|
48
55
|
def on_complete(&block)
|
49
56
|
@on_complete = block
|
50
57
|
end
|
51
|
-
|
58
|
+
|
52
59
|
def on_complete=(proc)
|
53
60
|
@on_complete = proc
|
54
61
|
end
|
55
|
-
|
62
|
+
|
56
63
|
def mock(method, url)
|
57
64
|
@mocks << HydraMock.new(url, method)
|
58
65
|
@mocks.last
|
59
66
|
end
|
60
|
-
|
67
|
+
|
61
68
|
def assign_to_mock(request)
|
62
69
|
m = @mocks.detect {|mck| mck.method == request.method && mck.url == request.url}
|
63
70
|
m && m.add_request(request)
|
64
71
|
end
|
65
72
|
private :assign_to_mock
|
66
|
-
|
73
|
+
|
67
74
|
def get_from_cache_or_queue(request)
|
68
75
|
if @cache_getter
|
69
76
|
val = @cache_getter.call(request)
|
70
77
|
if val
|
71
|
-
request.
|
72
|
-
request
|
78
|
+
@retrieved_from_cache[request.url] = val
|
79
|
+
handle_request(request, val, false)
|
73
80
|
else
|
74
81
|
@multi.add(get_easy_object(request))
|
75
82
|
end
|
@@ -78,7 +85,7 @@ module Typhoeus
|
|
78
85
|
end
|
79
86
|
end
|
80
87
|
private :get_from_cache_or_queue
|
81
|
-
|
88
|
+
|
82
89
|
def get_easy_object(request)
|
83
90
|
easy = @easy_pool.pop || Easy.new
|
84
91
|
easy.url = request.url
|
@@ -98,21 +105,21 @@ module Typhoeus
|
|
98
105
|
easy
|
99
106
|
end
|
100
107
|
private :get_easy_object
|
101
|
-
|
108
|
+
|
102
109
|
def release_easy_object(easy)
|
103
110
|
easy.reset
|
104
111
|
@easy_pool.push easy
|
105
112
|
end
|
106
113
|
private :release_easy_object
|
107
|
-
|
108
|
-
def handle_request(request, response)
|
114
|
+
|
115
|
+
def handle_request(request, response, live_request = true)
|
109
116
|
request.response = response
|
110
117
|
|
111
|
-
if
|
112
|
-
@cache_setter.call(request)
|
113
|
-
end
|
118
|
+
if live_request && request.cache_timeout && @cache_setter
|
119
|
+
@cache_setter.call(request)
|
120
|
+
end
|
114
121
|
@on_complete.call(response) if @on_complete
|
115
|
-
|
122
|
+
|
116
123
|
request.call_handlers
|
117
124
|
if requests = @memoized_requests[request.url]
|
118
125
|
requests.each do |r|
|
@@ -122,7 +129,7 @@ module Typhoeus
|
|
122
129
|
end
|
123
130
|
end
|
124
131
|
private :handle_request
|
125
|
-
|
132
|
+
|
126
133
|
def response_from_easy(easy, request)
|
127
134
|
Response.new(:code => easy.response_code,
|
128
135
|
:headers => easy.response_header,
|
@@ -132,20 +139,20 @@ module Typhoeus
|
|
132
139
|
end
|
133
140
|
private :response_from_easy
|
134
141
|
end
|
135
|
-
|
142
|
+
|
136
143
|
class HydraMock
|
137
144
|
attr_reader :url, :method, :response, :requests
|
138
|
-
|
145
|
+
|
139
146
|
def initialize(url, method)
|
140
147
|
@url = url
|
141
148
|
@method = method
|
142
149
|
@requests = []
|
143
150
|
end
|
144
|
-
|
151
|
+
|
145
152
|
def add_request(request)
|
146
153
|
@requests << request
|
147
154
|
end
|
148
|
-
|
155
|
+
|
149
156
|
def and_return(val)
|
150
157
|
@response = val
|
151
158
|
end
|