typhoeus 0.1.9 → 0.1.10
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.
- data/lib/typhoeus/hydra.rb +34 -16
 - data/lib/typhoeus.rb +7 -7
 - metadata +1 -1
 
    
        data/lib/typhoeus/hydra.rb
    CHANGED
    
    | 
         @@ -1,48 +1,57 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module Typhoeus
         
     | 
| 
       2 
2 
     | 
    
         
             
              class Hydra
         
     | 
| 
       3 
     | 
    
         
            -
                def initialize( 
     | 
| 
      
 3 
     | 
    
         
            +
                def initialize(options = {})
         
     | 
| 
       4 
4 
     | 
    
         
             
                  @memoize_requests = true
         
     | 
| 
       5 
5 
     | 
    
         
             
                  @multi       = Multi.new
         
     | 
| 
       6 
6 
     | 
    
         
             
                  @easy_pool   = []
         
     | 
| 
      
 7 
     | 
    
         
            +
                  initial_pool_size = options[:initial_pool_size] || 10
         
     | 
| 
      
 8 
     | 
    
         
            +
                  @max_concurrency = options[:max_concurrency] || 200
         
     | 
| 
       7 
9 
     | 
    
         
             
                  initial_pool_size.times { @easy_pool << Easy.new }
         
     | 
| 
       8 
10 
     | 
    
         
             
                  @stubs       = []
         
     | 
| 
       9 
11 
     | 
    
         
             
                  @memoized_requests = {}
         
     | 
| 
       10 
12 
     | 
    
         
             
                  @retrieved_from_cache = {}
         
     | 
| 
      
 13 
     | 
    
         
            +
                  @queued_requests = []
         
     | 
| 
      
 14 
     | 
    
         
            +
                  @running_requests = 0
         
     | 
| 
       11 
15 
     | 
    
         
             
                end
         
     | 
| 
       12 
16 
     | 
    
         | 
| 
       13 
17 
     | 
    
         
             
                def self.hydra
         
     | 
| 
       14 
18 
     | 
    
         
             
                  @hydra ||= new
         
     | 
| 
       15 
19 
     | 
    
         
             
                end
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
       17 
21 
     | 
    
         
             
                def self.hydra=(val)
         
     | 
| 
       18 
22 
     | 
    
         
             
                  @hydra = val
         
     | 
| 
       19 
23 
     | 
    
         
             
                end
         
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
       21 
25 
     | 
    
         
             
                def clear_stubs
         
     | 
| 
       22 
26 
     | 
    
         
             
                  @stubs = []
         
     | 
| 
       23 
27 
     | 
    
         
             
                end
         
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
       25 
29 
     | 
    
         
             
                def fire_and_forget
         
     | 
| 
      
 30 
     | 
    
         
            +
                  @queued_requests.each {|r| queue(r, false)}
         
     | 
| 
       26 
31 
     | 
    
         
             
                  @multi.fire_and_forget
         
     | 
| 
       27 
32 
     | 
    
         
             
                end
         
     | 
| 
       28 
33 
     | 
    
         | 
| 
       29 
     | 
    
         
            -
                def queue(request)
         
     | 
| 
      
 34 
     | 
    
         
            +
                def queue(request, obey_concurrency_limit = true)
         
     | 
| 
       30 
35 
     | 
    
         
             
                  return if assign_to_stub(request)
         
     | 
| 
       31 
36 
     | 
    
         | 
| 
       32 
     | 
    
         
            -
                  if  
     | 
| 
       33 
     | 
    
         
            -
                     
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
      
 37 
     | 
    
         
            +
                  if @running_requests >= @max_concurrency && obey_concurrency_limit
         
     | 
| 
      
 38 
     | 
    
         
            +
                    @queued_requests << request
         
     | 
| 
      
 39 
     | 
    
         
            +
                  else
         
     | 
| 
      
 40 
     | 
    
         
            +
                    if request.method == :get
         
     | 
| 
      
 41 
     | 
    
         
            +
                      if @memoize_requests && @memoized_requests.has_key?(request.url)
         
     | 
| 
      
 42 
     | 
    
         
            +
                        if response = @retrieved_from_cache[request.url]
         
     | 
| 
      
 43 
     | 
    
         
            +
                          request.response = response
         
     | 
| 
      
 44 
     | 
    
         
            +
                          request.call_handlers
         
     | 
| 
      
 45 
     | 
    
         
            +
                        else
         
     | 
| 
      
 46 
     | 
    
         
            +
                          @memoized_requests[request.url] << request
         
     | 
| 
      
 47 
     | 
    
         
            +
                        end
         
     | 
| 
       37 
48 
     | 
    
         
             
                      else
         
     | 
| 
       38 
     | 
    
         
            -
                        @memoized_requests[request.url]  
     | 
| 
      
 49 
     | 
    
         
            +
                        @memoized_requests[request.url] = [] if @memoize_requests
         
     | 
| 
      
 50 
     | 
    
         
            +
                        get_from_cache_or_queue(request)
         
     | 
| 
       39 
51 
     | 
    
         
             
                      end
         
     | 
| 
       40 
52 
     | 
    
         
             
                    else
         
     | 
| 
       41 
     | 
    
         
            -
                      @memoized_requests[request.url] = [] if @memoize_requests
         
     | 
| 
       42 
53 
     | 
    
         
             
                      get_from_cache_or_queue(request)
         
     | 
| 
       43 
54 
     | 
    
         
             
                    end
         
     | 
| 
       44 
     | 
    
         
            -
                  else
         
     | 
| 
       45 
     | 
    
         
            -
                    get_from_cache_or_queue(request)
         
     | 
| 
       46 
55 
     | 
    
         
             
                  end
         
     | 
| 
       47 
56 
     | 
    
         
             
                end
         
     | 
| 
       48 
57 
     | 
    
         | 
| 
         @@ -57,7 +66,7 @@ module Typhoeus 
     | 
|
| 
       57 
66 
     | 
    
         
             
                  @memoized_requests = {}
         
     | 
| 
       58 
67 
     | 
    
         
             
                  @retrieved_from_cache = {}
         
     | 
| 
       59 
68 
     | 
    
         
             
                end
         
     | 
| 
       60 
     | 
    
         
            -
             
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
       61 
70 
     | 
    
         
             
                def disable_memoization
         
     | 
| 
       62 
71 
     | 
    
         
             
                  @memoize_requests = false
         
     | 
| 
       63 
72 
     | 
    
         
             
                end
         
     | 
| 
         @@ -105,6 +114,7 @@ module Typhoeus 
     | 
|
| 
       105 
114 
     | 
    
         
             
                private :get_from_cache_or_queue
         
     | 
| 
       106 
115 
     | 
    
         | 
| 
       107 
116 
     | 
    
         
             
                def get_easy_object(request)
         
     | 
| 
      
 117 
     | 
    
         
            +
                  @running_requests += 1
         
     | 
| 
       108 
118 
     | 
    
         
             
                  easy = @easy_pool.pop || Easy.new
         
     | 
| 
       109 
119 
     | 
    
         
             
                  easy.url          = request.url
         
     | 
| 
       110 
120 
     | 
    
         
             
                  easy.method       = request.method
         
     | 
| 
         @@ -113,10 +123,12 @@ module Typhoeus 
     | 
|
| 
       113 
123 
     | 
    
         
             
                  easy.request_body = request.body    if request.body
         
     | 
| 
       114 
124 
     | 
    
         
             
                  easy.timeout      = request.timeout if request.timeout
         
     | 
| 
       115 
125 
     | 
    
         
             
                  easy.on_success do |easy|
         
     | 
| 
      
 126 
     | 
    
         
            +
                    queue_next
         
     | 
| 
       116 
127 
     | 
    
         
             
                    handle_request(request, response_from_easy(easy, request))
         
     | 
| 
       117 
128 
     | 
    
         
             
                    release_easy_object(easy)
         
     | 
| 
       118 
129 
     | 
    
         
             
                  end
         
     | 
| 
       119 
130 
     | 
    
         
             
                  easy.on_failure do |easy|
         
     | 
| 
      
 131 
     | 
    
         
            +
                    queue_next
         
     | 
| 
       120 
132 
     | 
    
         
             
                    handle_request(request, response_from_easy(easy, request))
         
     | 
| 
       121 
133 
     | 
    
         
             
                    release_easy_object(easy)
         
     | 
| 
       122 
134 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -125,6 +137,12 @@ module Typhoeus 
     | 
|
| 
       125 
137 
     | 
    
         
             
                end
         
     | 
| 
       126 
138 
     | 
    
         
             
                private :get_easy_object
         
     | 
| 
       127 
139 
     | 
    
         | 
| 
      
 140 
     | 
    
         
            +
                def queue_next
         
     | 
| 
      
 141 
     | 
    
         
            +
                  @running_requests -= 1
         
     | 
| 
      
 142 
     | 
    
         
            +
                  queue(@queued_requests.pop) unless @queued_requests.empty?
         
     | 
| 
      
 143 
     | 
    
         
            +
                end
         
     | 
| 
      
 144 
     | 
    
         
            +
                private :queue_next
         
     | 
| 
      
 145 
     | 
    
         
            +
             
     | 
| 
       128 
146 
     | 
    
         
             
                def release_easy_object(easy)
         
     | 
| 
       129 
147 
     | 
    
         
             
                  easy.reset
         
     | 
| 
       130 
148 
     | 
    
         
             
                  @easy_pool.push easy
         
     | 
| 
         @@ -175,7 +193,7 @@ module Typhoeus 
     | 
|
| 
       175 
193 
     | 
    
         
             
                def and_return(val)
         
     | 
| 
       176 
194 
     | 
    
         
             
                  @response = val
         
     | 
| 
       177 
195 
     | 
    
         
             
                end
         
     | 
| 
       178 
     | 
    
         
            -
             
     | 
| 
      
 196 
     | 
    
         
            +
             
     | 
| 
       179 
197 
     | 
    
         
             
                def matches?(request)
         
     | 
| 
       180 
198 
     | 
    
         
             
                  if url.kind_of?(String)
         
     | 
| 
       181 
199 
     | 
    
         
             
                    request.method == method && request.url == url
         
     | 
    
        data/lib/typhoeus.rb
    CHANGED
    
    | 
         @@ -14,23 +14,23 @@ require 'typhoeus/request' 
     | 
|
| 
       14 
14 
     | 
    
         
             
            require 'typhoeus/hydra'
         
     | 
| 
       15 
15 
     | 
    
         | 
| 
       16 
16 
     | 
    
         
             
            module Typhoeus
         
     | 
| 
       17 
     | 
    
         
            -
              VERSION = "0.1. 
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
      
 17 
     | 
    
         
            +
              VERSION = "0.1.10"
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
       19 
19 
     | 
    
         
             
              def self.easy_object_pool
         
     | 
| 
       20 
20 
     | 
    
         
             
                @easy_objects ||= []
         
     | 
| 
       21 
21 
     | 
    
         
             
              end
         
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
       23 
23 
     | 
    
         
             
              def self.init_easy_object_pool
         
     | 
| 
       24 
24 
     | 
    
         
             
                20.times do
         
     | 
| 
       25 
25 
     | 
    
         
             
                  easy_object_pool << Typhoeus::Easy.new
         
     | 
| 
       26 
26 
     | 
    
         
             
                end
         
     | 
| 
       27 
27 
     | 
    
         
             
              end
         
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
       29 
29 
     | 
    
         
             
              def self.release_easy_object(easy)
         
     | 
| 
       30 
30 
     | 
    
         
             
                easy.reset
         
     | 
| 
       31 
31 
     | 
    
         
             
                easy_object_pool << easy
         
     | 
| 
       32 
32 
     | 
    
         
             
              end
         
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
       34 
34 
     | 
    
         
             
              def self.get_easy_object
         
     | 
| 
       35 
35 
     | 
    
         
             
                if easy_object_pool.empty?
         
     | 
| 
       36 
36 
     | 
    
         
             
                  Typhoeus::Easy.new
         
     | 
| 
         @@ -38,12 +38,12 @@ module Typhoeus 
     | 
|
| 
       38 
38 
     | 
    
         
             
                  easy_object_pool.pop
         
     | 
| 
       39 
39 
     | 
    
         
             
                end
         
     | 
| 
       40 
40 
     | 
    
         
             
              end
         
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
       42 
42 
     | 
    
         
             
              def self.add_easy_request(easy_object)
         
     | 
| 
       43 
43 
     | 
    
         
             
                Thread.current[:curl_multi] ||= Typhoeus::Multi.new
         
     | 
| 
       44 
44 
     | 
    
         
             
                Thread.current[:curl_multi].add(easy_object)
         
     | 
| 
       45 
45 
     | 
    
         
             
              end
         
     | 
| 
       46 
     | 
    
         
            -
             
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
       47 
47 
     | 
    
         
             
              def self.perform_easy_requests
         
     | 
| 
       48 
48 
     | 
    
         
             
                multi = Thread.current[:curl_multi]
         
     | 
| 
       49 
49 
     | 
    
         
             
                start_time = Time.now
         
     |