Module: TravelPayouts::Api::Request

Included in:
TravelPayouts::Api
Defined in:
lib/travelpayouts_api/request.rb

Instance Method Summary collapse

Instance Method Details

#convert_to_mash(hash) ⇒ Object



93
94
95
96
97
# File 'lib/travelpayouts_api/request.rb', line 93

def convert_to_mash(hash)
  return Hashie::Mash.new hash if hash.is_a? Hash
  return hash unless hash.is_a? Array
  hash.each{ |_,v| convert_to_mash v }
end

#param_values(params) ⇒ Object



52
53
54
55
56
# File 'lib/travelpayouts_api/request.rb', line 52

def param_values(params)
  return params unless params.is_a?(Hash) || params.is_a?(Array)
  return params.values.map{|v| param_values(v)}.flatten if params.is_a?(Hash)
  params.map{|p| param_values(p)}.flatten
end

#request(url, params, skip_parse: false) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
# File 'lib/travelpayouts_api/request.rb', line 7

def request(url, params, skip_parse: false)
  params[:currency] ||= config.currency
  params[:locale]   ||= config.locale

  params.delete_if{ |_, v| v == nil }

  data = RestClient.get url, request_headers.merge(params: params)
  skip_parse ? data : respond(data)
rescue RestClient::Exception => e
  err = Error.new(e.response, e.http_code)
  err.message = e.message
  raise err
end

#request_headers(include_content_type = false) ⇒ Object



64
65
66
67
68
69
70
71
72
# File 'lib/travelpayouts_api/request.rb', line 64

def request_headers(include_content_type = false)
  {
    x_access_token: config.token,
    accept_encoding: 'gzip, deflate',
    accept: :json
  }.tap do |headers|
    headers[:content_type] = 'application/json' if include_content_type
  end
end

#respond(resp) ⇒ Object



74
75
76
77
78
79
80
81
82
# File 'lib/travelpayouts_api/request.rb', line 74

def respond(resp)
  begin
    hash = JSON.parse(resp)
  rescue => _
    return resp
  end

  convert_to_mash hash
end

#run_request(url, params, headers, method) ⇒ Object



84
85
86
87
88
89
90
91
# File 'lib/travelpayouts_api/request.rb', line 84

def run_request(url, params, headers, method)
  return respond RestClient.post url, params.to_json, headers if method == :post
  respond RestClient.get url, headers.merge(params: params)
rescue RestClient::Exception => e
  err = Error.new(e.response, e.http_code)
  err.message = e.message
  raise err
end

#signature(params, marker = nil) ⇒ Object



58
59
60
61
62
# File 'lib/travelpayouts_api/request.rb', line 58

def signature(params, marker=nil)
  sign = marker ? [config.token, marker] : [config.token]
  values = sign + param_values(sort_params(params))
  Digest::MD5.hexdigest values.join(':')
end

#signed_flight_request(method, url, params) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/travelpayouts_api/request.rb', line 21

def signed_flight_request(method, url, params)
  params[:marker]   = config.marker.to_s
  params[:host]     = config.host
  params[:currency] ||= config.currency
  params[:locale]   ||= config.locale if params.has_key?(:locale)

  params.delete_if{ |_, v| v == nil }

  params[:signature] = signature(params)

  run_request(url, params, request_headers(true), method)
end

#signed_hotel_request(method, url, params) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
# File 'lib/travelpayouts_api/request.rb', line 34

def signed_hotel_request(method, url, params)
  params[:marker]   = config.marker.to_s
  params[:currency] ||= config.currency
  params[:lang]     ||= config.locale if params.has_key?(:lang)

  params.delete_if{ |_, v| v == nil }

  params[:signature] = signature(params, config.marker)

  run_request(url, params, request_headers(true), method)
end

#sort_params(params) ⇒ Object



46
47
48
49
50
# File 'lib/travelpayouts_api/request.rb', line 46

def sort_params(params)
  return params unless params.is_a?(Hash) || params.is_a?(Array)
  return Hash[params.sort.map{ |k,v| [k, sort_params(v)] }] if params.is_a?(Hash)
  params.map{|p| sort_params(p)}
end