Class: Wikidotrb::Util::RequestUtil

Inherits:
Object
  • Object
show all
Defined in:
lib/wikidotrb/util/requestutil.rb

Class Method Summary collapse

Class Method Details

.request(client:, method:, urls:, return_exceptions: false) ⇒ Array<HTTPX::Response, Exception>

Sends HTTP requests to multiple URLs concurrently

Parameters:

  • client (Client)

    The client instance

  • method (String)

    HTTP request method ("GET" or "POST")

  • urls (Array<String>)

    List of URLs to request

  • return_exceptions (Boolean) (defaults to: false)

    Whether to return exceptions instead of raising them

Returns:

  • (Array<HTTPX::Response, Exception>)

    List of responses or exceptions



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/wikidotrb/util/requestutil.rb', line 15

def self.request(client:, method:, urls:, return_exceptions: false)
  config = client.amc_client.config
  semaphore = Concurrent::Semaphore.new(config.semaphore_limit)

  # Create asynchronous tasks for each request
  tasks = urls.map do |url|
    Concurrent::Promises.future do
      semaphore.acquire

      begin
        case method.upcase
        when "GET"
          response = HTTPX.get(url)
        when "POST"
          response = HTTPX.post(url)
        else
          raise ArgumentError, "Invalid method"
        end

        response
      rescue StandardError => e
        e
      ensure
        semaphore.release
      end
    end
  end

  # Wait for all tasks to complete
  results = Concurrent::Promises.zip(*tasks).value!

  # Return results based on return_exceptions option
  return_exceptions ? results : results.each { |r| raise r if r.is_a?(Exception) }
end