Module: EasyPost

Defined in:
lib/easypost.rb,
lib/easypost/version.rb

Defined Under Namespace

Modules: Util Classes: Address, ApiKey, Batch, Brand, CarrierAccount, CarrierType, CustomsInfo, CustomsItem, EasyPostObject, Error, Event, Insurance, Order, Parcel, Pickup, PickupRate, PostageLabel, Rate, Refund, Report, Resource, ScanForm, Shipment, TaxIdentifier, Tracker, User, Webhook

Constant Summary collapse

VERSION =
File.open(File.expand_path('../../VERSION', __dir__)).read.strip

Class Method Summary collapse

Class Method Details

.api_baseObject

Get the API base.



59
60
61
# File 'lib/easypost.rb', line 59

def self.api_base
  @api_base
end

.api_base=(api_base) ⇒ Object

Set the API base.



54
55
56
# File 'lib/easypost.rb', line 54

def self.api_base=(api_base)
  @api_base = api_base
end

.api_keyObject

Get the ApiKey.



49
50
51
# File 'lib/easypost.rb', line 49

def self.api_key
  @api_key
end

.api_key=(api_key) ⇒ Object

Set the ApiKey.



44
45
46
# File 'lib/easypost.rb', line 44

def self.api_key=(api_key)
  @api_key = api_key
end

.http_configObject

Get the HTTP config.



82
83
84
# File 'lib/easypost.rb', line 82

def self.http_config
  @http_config ||= reset_http_config
end

.http_config=(http_config_params) ⇒ Object

Set the HTTP config.



87
88
89
# File 'lib/easypost.rb', line 87

def self.http_config=(http_config_params)
  http_config.merge!(http_config_params)
end

.make_client(uri) ⇒ Object

Create an EasyPost Client.



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/easypost.rb', line 92

def self.make_client(uri)
  client = if http_config[:proxy]
             proxy_uri = URI(http_config[:proxy])
             Net::HTTP.new(
               uri.host,
               uri.port,
               proxy_uri.host,
               proxy_uri.port,
               proxy_uri.user,
               proxy_uri.password,
             )
           else
             Net::HTTP.new(uri.host, uri.port)
           end
  client.use_ssl = true

  http_config.each do |name, value|
    # Discrepancies between RestClient and Net::HTTP.
    case name
    when :verify_ssl
      name = :verify_mode
    when :timeout
      name = :read_timeout
    end

    # Handled in the creation of the client.
    if name == :proxy
      next
    end

    client.send("#{name}=", value)
  end

  client
end

.make_request(method, path, api_key = nil, body = nil) ⇒ Object

Make an HTTP request.



129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/easypost.rb', line 129

def self.make_request(method, path, api_key = nil, body = nil)
  client = make_client(URI(@api_base))

  request = Net::HTTP.const_get(method.capitalize).new(path)
  if body
    request.body = JSON.dump(EasyPost::Util.objects_to_ids(body))
  end

  request['Content-Type'] = 'application/json'
  request['User-Agent'] = "EasyPost/v2 RubyClient/#{VERSION} Ruby/#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}"
  if api_key ||= @api_key
    request['Authorization'] = "Basic #{Base64.strict_encode64("#{api_key}:")}"
  end

  response = client.request(request)

  if (400..599).include? response.code.to_i
    error = JSON.parse(response.body)['error']
    raise EasyPost::Error.new(error['message'], response.code.to_i, error['code'], error['errors'], response.body)
  end

  if response['Content-Type'].include? 'application/json'
    JSON.parse(response.body)
  else
    response.body
  end
rescue JSON::ParserError
  raise "Invalid response object from API, unable to decode.\n#{response.body}"
end

.reset_http_configObject

Reset the HTTP config.



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/easypost.rb', line 64

def self.reset_http_config
  @http_config = {
    timeout: 60,
    open_timeout: 30,
    verify_ssl: OpenSSL::SSL::VERIFY_PEER,
  }

  ruby_version = Gem::Version.new(RUBY_VERSION)
  if ruby_version >= Gem::Version.new('2.5.0')
    @http_config[:min_version] = OpenSSL::SSL::TLS1_2_VERSION
  else
    @http_config[:ssl_version] = :TLSv1_2 # rubocop:disable Naming/VariableNumber
  end

  @http_config
end