Class: HTTPigeon::Request

Inherits:
Object
  • Object
show all
Defined in:
lib/httpigeon/request.rb

Constant Summary collapse

REQUEST_ID_HEADER =
'X-Request-Id'.freeze
ALLOWED_METHODS =
%i[get post put patch delete head options].freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(base_url:, options: nil, headers: nil, adapter: nil, logger: nil, event_type: nil, log_filters: nil, fuse_config: nil) ⇒ Request

Returns a new instance of Request.



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/httpigeon/request.rb', line 46

def initialize(base_url:, options: nil, headers: nil, adapter: nil, logger: nil, event_type: nil, log_filters: nil, fuse_config: nil)
  @base_url = URI.parse(base_url)

  request_headers = default_headers(request_id: SecureRandom.uuid).merge(headers.to_h)
  fuse_config_opts = { service_id: @base_url.host }.merge(fuse_config.to_h)
  @fuse = CircuitBreaker::Fuse.from_options(fuse_config_opts)

  base_connection = Faraday.new(url: @base_url.to_s).tap do |config|
    config.headers.deep_merge!(request_headers)
    config.options.merge!(options.to_h)
    config.response :circuit_breaker, fuse.config if HTTPigeon.mount_circuit_breaker
    config.response :httpigeon_logger, logger if logger.is_a?(HTTPigeon::Logger)
  end

  @connection = if block_given?
                  yield(base_connection) && base_connection
                else
                  base_connection.tap do |faraday|
                    faraday.headers.deep_merge!(request_headers)
                    faraday.options.merge!(options.to_h)
                    faraday.request :url_encoded
                    faraday.adapter adapter || Faraday.default_adapter
                    faraday.response :httpigeon_logger, default_logger(event_type, log_filters) unless logger.is_a?(HTTPigeon::Logger)
                  end
                end
end

Instance Attribute Details

#base_urlObject (readonly)

Returns the value of attribute base_url.



42
43
44
# File 'lib/httpigeon/request.rb', line 42

def base_url
  @base_url
end

#connectionObject (readonly)

Returns the value of attribute connection.



42
43
44
# File 'lib/httpigeon/request.rb', line 42

def connection
  @connection
end

#fuseObject (readonly)

Returns the value of attribute fuse.



42
43
44
# File 'lib/httpigeon/request.rb', line 42

def fuse
  @fuse
end

#responseObject (readonly)

Returns the value of attribute response.



42
43
44
# File 'lib/httpigeon/request.rb', line 42

def response
  @response
end

Class Method Details

.delete(endpoint, query = {}, headers = {}, event_type = nil, log_filters = []) ⇒ Object



34
35
36
37
38
39
# File 'lib/httpigeon/request.rb', line 34

def delete(endpoint, query = {}, headers = {}, event_type = nil, log_filters = [])
  request = new(base_url: endpoint, headers: headers, event_type: event_type, log_filters: log_filters)
  request.run(method: :delete, path: '', payload: query) do |req|
    yield(req) if block_given?
  end
end

.get(endpoint, query = {}, headers = {}, event_type = nil, log_filters = []) ⇒ Object



13
14
15
16
17
18
# File 'lib/httpigeon/request.rb', line 13

def get(endpoint, query = {}, headers = {}, event_type = nil, log_filters = [])
  request = new(base_url: endpoint, headers: headers, event_type: event_type, log_filters: log_filters)
  request.run(method: :get, path: '', payload: query) do |req|
    yield(req) if block_given?
  end
end

.post(endpoint, payload, headers = {}, event_type = nil, log_filters = []) ⇒ Object



20
21
22
23
24
25
# File 'lib/httpigeon/request.rb', line 20

def post(endpoint, payload, headers = {}, event_type = nil, log_filters = [])
  request = new(base_url: endpoint, headers: headers,  event_type: event_type, log_filters: log_filters)
  request.run(method: :post, path: '', payload: payload) do |req|
    yield(req) if block_given?
  end
end

.put(endpoint, payload, headers = {}, event_type = nil, log_filters = []) ⇒ Object



27
28
29
30
31
32
# File 'lib/httpigeon/request.rb', line 27

def put(endpoint, payload, headers = {}, event_type = nil, log_filters = [])
  request = new(base_url: endpoint, headers: headers, event_type: event_type, log_filters: log_filters)
  request.run(method: :put, path: '', payload: payload) do |req|
    yield(req) if block_given?
  end
end

Instance Method Details

#run(method: :get, path: '/', payload: {}) ⇒ Object

Raises:

  • (ArgumentError)


73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/httpigeon/request.rb', line 73

def run(method: :get, path: '/', payload: {})
  sym_method = method.to_sym

  raise ArgumentError, "Invalid or unsupported HTTP method: #{method}" unless ALLOWED_METHODS.include?(sym_method)

  unless [:get, :delete].include?(sym_method)
    payload = payload.presence&.to_json
    connection.headers['Content-Type'] = 'application/json'
  end

  connection.headers[REQUEST_ID_HEADER] = SecureRandom.uuid if HTTPigeon.auto_generate_request_id

  raw_response = if HTTPigeon.mount_circuit_breaker
                   fuse.execute(request_id: connection.headers[REQUEST_ID_HEADER]) do
                     connection.send(method, path, payload) do |request|
                       yield(request) if block_given?
                     end
                   end
                 else
                   connection.send(method, path, payload) do |request|
                     yield(request) if block_given?
                   end
                 end

  @response = HTTPigeon::Response.new(self, raw_response)
end