Class: MessageBird::HttpClient

Inherits:
Object
  • Object
show all
Defined in:
lib/messagebird/http_client.rb

Direct Known Subclasses

ConversationClient, NumberClient, VoiceClient

Constant Summary collapse

VALID_RESPONSE_CODES =
[200, 201, 202, 204, 401, 404, 405, 422].freeze
ENDPOINT =
'https://rest.messagebird.com/'
SUBMIT_METHODS =
[:patch, :post, :put].freeze
ALLOWED_METHODS =
SUBMIT_METHODS.dup + [:get, :delete].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(access_key) ⇒ HttpClient

Returns a new instance of HttpClient.



19
20
21
# File 'lib/messagebird/http_client.rb', line 19

def initialize(access_key)
  @access_key = access_key
end

Instance Attribute Details

#access_keyObject (readonly)

Returns the value of attribute access_key.



12
13
14
# File 'lib/messagebird/http_client.rb', line 12

def access_key
  @access_key
end

Instance Method Details

#assert_json_response_type(content_type) ⇒ Object

Throw an exception if the response’s content type is not JSON. This only checks the header: it doesn’t inspect the actual body.



89
90
91
92
93
# File 'lib/messagebird/http_client.rb', line 89

def assert_json_response_type(content_type)
  # Check whether the header starts with application/json and don't check
  # for equality: some API's may append the charset to this header.
  raise InvalidResponseException, 'Response is not JSON' unless content_type.start_with? 'application/json'
end

#assert_valid_response_code(code) ⇒ Object

Throw an exception if the response code is not one we expect from the MessageBird API.

Raises:



83
84
85
# File 'lib/messagebird/http_client.rb', line 83

def assert_valid_response_code(code)
  raise ServerException, 'Unknown response from server' unless VALID_RESPONSE_CODES.include? code
end

#build_http_client(uri) ⇒ Object



27
28
29
30
31
32
33
34
# File 'lib/messagebird/http_client.rb', line 27

def build_http_client(uri)
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true

  http.set_debug_output($stdout) unless ENV['DEBUG_MB_HTTP_CLIENT'].nil?

  http
end

#build_request(method, uri, params = {}) ⇒ Object



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

def build_request(method, uri, params = {})
  # Construct the HTTP request.
  raise MethodNotAllowedException unless ALLOWED_METHODS.include?(method)

  request = Class.const_get("Net::HTTP::#{method.to_s.capitalize}").new(uri.request_uri)

  request['Accept']        = 'application/json'
  request['Authorization'] = "AccessKey #{@access_key}"
  request['User-Agent']    = "MessageBird/ApiClient/#{Version::STRING} Ruby/#{RUBY_VERSION}"

  if SUBMIT_METHODS.include?(method) && !params.empty?
    prepare_request(request, params)
  end

  request
end

#endpointObject



23
24
25
# File 'lib/messagebird/http_client.rb', line 23

def endpoint
  ENDPOINT
end

#prepare_request(request, params = {}) ⇒ Object



58
59
60
61
62
# File 'lib/messagebird/http_client.rb', line 58

def prepare_request(request, params = {})
  request.set_form_data(params)

  request
end

#request(method, path, params = {}, check_json: true) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/messagebird/http_client.rb', line 36

def request(method, path, params = {}, check_json: true)
  uri     = URI.join(endpoint, path)
  http    = build_http_client(uri)
  request = build_request(method, uri, params)

  # Execute the request and fetch the response.
  response = http.request(request)

  assert_valid_response_code(response.code.to_i)
  assert_json_response_type(response['Content-Type']) unless check_json

  response.body
end

#request_block(method, path, params = {}, &block) ⇒ Object



50
51
52
53
54
55
56
# File 'lib/messagebird/http_client.rb', line 50

def request_block(method, path, params = {}, &block)
  uri     = URI.join(endpoint, path)
  http    = build_http_client(uri)
  request = build_request(method, uri, params)

  http.request(request, block)
end