Class: FunnelHttp::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/funnel_http/client.rb,
sig/funnel_http/client.rbs

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(default_request_header: {}) ⇒ Client

Returns a new instance of Client.

Parameters:

  • default_request_header (Hash{String => String, Array<String>}) (defaults to: {})
  • default_request_header: (fuzzy_header) (defaults to: {})


10
11
12
# File 'lib/funnel_http/client.rb', line 10

def initialize(default_request_header: {})
  @default_request_header = {"User-Agent" => USER_AGENT}.merge(default_request_header)
end

Instance Attribute Details

#default_request_headerHash{String => String, Array<String>}

Returns:

  • (Hash{String => String, Array<String>})


7
8
9
# File 'lib/funnel_http/client.rb', line 7

def default_request_header
  @default_request_header
end

Instance Method Details

#add_default_request_header(name, value) ⇒ Hash{String => String, Array<String>}

Add header to #default_request_header

Parameters:

  • name (String)

    Header name

  • value (String, Array<String>)

    Header value

Returns:



19
20
21
# File 'lib/funnel_http/client.rb', line 19

def add_default_request_header(name, value)
  default_request_header.merge!(name => value)
end

#ext_clientFunnelHttp::Ext::Client



148
149
150
# File 'lib/funnel_http/client.rb', line 148

def ext_client
  @ext_client ||= FunnelHttp::Ext::Client.new
end

#normalize_header(header) ⇒ Hash{String => Array<String>}

Returns Request header.

Parameters:

  • header (Hash{String => String, Array<String>}, nil)

    Request header

Returns:

  • (Hash{String => Array<String>})

    Request header



129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/funnel_http/client.rb', line 129

def normalize_header(header)
  full_header =
    if header
      default_request_header.dup.merge(header)
    else
      default_request_header.dup
    end

  # Workaround for Ruby::UnannotatedEmptyCollection on steep 1.9.0+
  result = {} #: strict_header

  full_header.each_with_object(result) do |(k, v), hash|
    # FIXME: Fails `steep check` when use Array(v)...
    # hash[k] = Array(v)
    hash[k] = v.is_a?(Array) ? v : Array(v)
  end
end

#normalize_requests(requests) ⇒ Array<Hash{Symbol => Object}>, ... #normalize_requests(request) ⇒ Array<Hash{Symbol => Object}>, ...

Overloads:

  • #normalize_requests(requests) ⇒ Array<Hash{Symbol => Object}>, ...

    Parameters:

    • requests (Array<Hash{Symbol => Object}>)

      Array of following Hash

    Options Hash (requests):

    • :method (String, Symbol)

      [required] Request method (e.g. :get, "POST")

    • :url (String)

      [required] Request url

    • :header (Hash{String => String, Array<String>}, nil)

      Request header

  • #normalize_requests(request) ⇒ Array<Hash{Symbol => Object}>, ...

    Parameters:

    • request (Hash{Symbol => Object})

    Options Hash (request):

    • :method (String, Symbol)

      [required] Request method (e.g. :get, "POST")

    • :url (String)

      [required] Request url

    • :header (Hash{String => String, Array<String>}, nil)

      Request header

Parameters:

  • arg (fuzzy_request, Array[fuzzy_request])

Returns:

  • (Array<Hash{Symbol => Object}>)

    Array of following Hash

  • (String)

    :method Request method (e.g. "POST")

  • (String)

    :url Request url

  • (Hash{String => Array<String>})

    :header Request header



100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/funnel_http/client.rb', line 100

def normalize_requests(arg)
  requests =
    case arg
    when Array
      arg
    when Hash
      [arg]
    else
      raise ArgumentError, "#{arg} must be Array or Hash"
    end

  requests.map do |request|
    raise ArgumentError, "#{arg} contains something other than Hash" unless request.is_a?(Hash)

    raise ArgumentError, "#{arg} key does not contain all :method and :url" if !request.key?(:method) || !request.key?(:url)

    {
      url: request[:url].to_s,
      method: request[:method].to_s.upcase,
      header: normalize_header(request[:header]),
      body: request[:body].freeze,
    }
  end
end

#perform(requests) ⇒ Array<Hash<Symbol => Object>>, ... #perform(request) ⇒ Array<Hash<Symbol => Object>>, ...

Note:

#perform doesn't raise errors when http requests returns error status code (4xx, 5xx)

perform HTTP requests in parallel

Overloads:

  • #perform(requests) ⇒ Array<Hash<Symbol => Object>>, ...

    Parameters:

    • requests (Array<Hash{Symbol => Object}>)

      Array of following Hash

    Options Hash (requests):

    • :method (String, Symbol)

      [required] Request method (e.g. :get, "POST")

    • :url (String)

      [required] Request url

    • :header (Hash{String => String, Array<String>}, nil)

      Request header

    • :body (String, nil)

      Request body

  • #perform(request) ⇒ Array<Hash<Symbol => Object>>, ...

    Parameters:

    • request (Hash{Symbol => Object})

    Options Hash (request):

    • :method (String, Symbol)

      [required] Request method (e.g. :get, "POST")

    • :url (String)

      [required] Request url

    • :header (Hash{String => String, Array<String>}, nil)

      Request header

    • :body (String, nil)

      Request body

Parameters:

  • requests (fuzzy_request, Array[fuzzy_request])

Returns:

  • (Array<Hash<Symbol => Object>>)

    Array of following Hash

  • (String)

    :url Request url

  • (Integer)

    :status_code

  • (String)

    :body Response body

  • (Hash{String => Array<String>})

    :header Response header



46
47
48
# File 'lib/funnel_http/client.rb', line 46

def perform(requests)
  ext_client.run_requests(normalize_requests(requests))
end

#perform(requests) ⇒ Array<Hash<Symbol => Object>>, ... #perform(request) ⇒ Array<Hash<Symbol => Object>>, ...

Note:

#perform! raise errors when http requests returns error status code (4xx, 5xx)

perform HTTP requests in parallel

Overloads:

  • #perform(requests) ⇒ Array<Hash<Symbol => Object>>, ...

    Parameters:

    • requests (Array<Hash{Symbol => Object}>)

      Array of following Hash

    Options Hash (requests):

    • :method (String, Symbol)

      [required] Request method (e.g. :get, "POST")

    • :url (String)

      [required] Request url

    • :header (Hash{String => String, Array<String>}, nil)

      Request header

    • :body (String, nil)

      Request body

  • #perform(request) ⇒ Array<Hash<Symbol => Object>>, ...

    Parameters:

    • request (Hash{Symbol => Object})

    Options Hash (request):

    • :method (String, Symbol)

      [required] Request method (e.g. :get, "POST")

    • :url (String)

      [required] Request url

    • :header (Hash{String => String, Array<String>}, nil)

      Request header

    • :body (String, nil)

      Request body

Parameters:

  • requests (fuzzy_request, Array[fuzzy_request])

Returns:

  • (Array<Hash<Symbol => Object>>)

    Array of following Hash

  • (String)

    :url Request url

  • (Integer)

    :status_code

  • (String)

    :body Response body

  • (Hash{String => Array<String>})

    :header Response header

Raises:



75
76
77
78
79
80
81
82
# File 'lib/funnel_http/client.rb', line 75

def perform!(requests)
  responses = perform(requests)

  error_responses = responses.select { |res| res[:status_code] >= 400 }
  raise HttpAggregateError, error_responses unless error_responses.empty?

  responses
end