Class: Pinot::JsonHttpTransport

Inherits:
Object
  • Object
show all
Defined in:
lib/pinot/transport.rb

Constant Summary collapse

DEFAULT_HEADERS =
{
  "Content-Type" => "application/json; charset=utf-8"
}.freeze

Instance Method Summary collapse

Constructor Details

#initialize(http_client:, extra_headers: {}, timeout_ms: nil, logger: nil) ⇒ JsonHttpTransport

Returns a new instance of JsonHttpTransport.



111
112
113
114
115
116
# File 'lib/pinot/transport.rb', line 111

def initialize(http_client:, extra_headers: {}, timeout_ms: nil, logger: nil)
  @http_client = http_client
  @extra_headers = extra_headers
  @timeout_ms = timeout_ms
  @logger = logger
end

Instance Method Details

#execute(broker_address, request) ⇒ Object



118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# File 'lib/pinot/transport.rb', line 118

def execute(broker_address, request)
  logger.debug "Pinot query to #{broker_address}: #{request.query}"

  url = build_url(broker_address, request.query_format)
  body = build_body(request)
  headers = DEFAULT_HEADERS
    .merge(@extra_headers)
    .merge("X-Correlation-Id" => SecureRandom.uuid)

  resp = @http_client.post(url, body: body, headers: headers)

  unless resp.code.to_i == 200
    logger.error "Pinot broker returned HTTP #{resp.code}"
    raise TransportError, "http exception with HTTP status code #{resp.code}"
  end

  begin
    BrokerResponse.from_json(resp.body)
  rescue JSON::ParserError => e
    raise e.message
  end
end