Class: OnlinePayments::SDK::DefaultImpl::DefaultConnection

Inherits:
PooledConnection show all
Defined in:
lib/onlinepayments/sdk/defaultimpl/default_connection.rb

Constant Summary collapse

CONTENT_TYPE =
'Content-Type'.freeze
JSON_CONTENT_TYPE =
'application/json'.freeze

Instance Method Summary collapse

Constructor Details

#initialize(args) ⇒ DefaultConnection

Returns a new instance of DefaultConnection.

Parameters:

  • args (Hash)

    the parameters to initialize the connection with

Options Hash (args):

  • :connect_timeout (Integer)

    connection timeout in seconds. Uses CommunicatorConfiguration.default_connect_timeout if not given.

  • :socket_timeout (Integer)

    socket timeout in seconds. Uses CommunicatorConfiguration.default_socket_timeout if not given.

  • :max_connections (Integer)

    number of connections kept alive in the thread pool. Uses CommunicatorConfiguration.default_max_connections if not given.

  • :proxy_configuration (Hash)

    object that stores the proxy to use. If not given the system default proxy is used; if there is no system default proxy set either, no proxy is used.

Raises:

  • (ArgumentError)


34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/onlinepayments/sdk/defaultimpl/default_connection.rb', line 34

def initialize(args)
  raise ArgumentError unless args.is_a? Hash

  super()

  # Set timeouts to nil if they are negative
  @connect_timeout = args[:connect_timeout] || CommunicatorConfiguration.default_connect_timeout
  @connect_timeout = nil unless @connect_timeout&.positive?
  @socket_timeout = args[:socket_timeout] || CommunicatorConfiguration.default_socket_timeout
  @socket_timeout = nil unless @socket_timeout&.positive?
  @max_connections = args[:max_connections] || CommunicatorConfiguration.default_max_connections
  @proxy_configuration = args[:proxy_configuration]

  # HTTPClient provides the following features:
  # 1) thread safe, an instance can be used by multiple threads without
  # explicit synchronization
  # 2) use persistent connection if HTTP 1.1 is supported. The connection
  # will be left open until explicitly closed or keep_alive_timeout
  # 3) a built-in connection pool with no limit for max connections
  @http_client = create_http_client
  @http_client.connect_timeout = @connect_timeout
  @http_client.send_timeout = @socket_timeout
  @http_client.receive_timeout = @socket_timeout
end

Instance Method Details

#closeObject

Frees all networking resources used.



100
101
102
# File 'lib/onlinepayments/sdk/defaultimpl/default_connection.rb', line 100

def close
  @http_client.reset_all
end

#close_expired_connectionsObject

HTTPClient automatically closes expired connections so close_expired_connections is a no-operation.



93
94
95
96
97
# File 'lib/onlinepayments/sdk/defaultimpl/default_connection.rb', line 93

def close_expired_connections
  # By default the keep alive timeout is 15 sec, which is the HTTP 1.1
  # standard. To change the value, use keep_alive_timeout= method
  # do nothing, handled by HTTPClient
end

#close_idle_connections(idle_time) ⇒ Object

Closes all connections idle for longer than idle_time seconds. In addition, the keep_alive_timeout is set to idle_time so any future connections idle for longer than idle_time seconds will also be closed.



86
87
88
89
90
# File 'lib/onlinepayments/sdk/defaultimpl/default_connection.rb', line 86

def close_idle_connections(idle_time)
  # in sec
  @http_client.keep_alive_timeout = idle_time # set timeout value
  close_expired_connections
end

#delete(uri, request_headers) ⇒ Object

Performs a DELETE request to the Online Payments platform

See Also:



119
120
121
122
123
# File 'lib/onlinepayments/sdk/defaultimpl/default_connection.rb', line 119

def delete(uri, request_headers)
  request('delete', uri, request_headers) do |response_status_code, response_headers, response_body|
    yield response_status_code, response_headers, response_body
  end
end

#disable_loggingObject

Disables logging by unregistering any previous logger that might be registered.



205
206
207
# File 'lib/onlinepayments/sdk/defaultimpl/default_connection.rb', line 205

def disable_logging
  @communicator_logger = nil
end

#enable_logging(communicator_logger) ⇒ Object

Enables logging outgoing requests and incoming responses by registering the communicator_logger. Note that only one logger can be registered at a time and calling enable_logging a second time will override the old logger instance with the new one.

Parameters:

Raises:

  • (ArgumentError)


198
199
200
201
202
# File 'lib/onlinepayments/sdk/defaultimpl/default_connection.rb', line 198

def enable_logging(communicator_logger)
  raise ArgumentError, 'communicatorLogger is required' unless communicator_logger

  @communicator_logger = communicator_logger
end

#get(uri, request_headers) ⇒ Object

Performs a GET request to the Online Payments platform

See Also:



111
112
113
114
115
# File 'lib/onlinepayments/sdk/defaultimpl/default_connection.rb', line 111

def get(uri, request_headers)
  request('get', uri, request_headers) do |response_status_code, response_headers, response_body|
    yield response_status_code, response_headers, response_body
  end
end

#post(uri, request_headers, body) ⇒ Object

Performs a POST request to the Online Payments platform

See Also:



127
128
129
130
131
# File 'lib/onlinepayments/sdk/defaultimpl/default_connection.rb', line 127

def post(uri, request_headers, body)
  request('post', uri, request_headers, body) do |response_status_code, response_headers, response_body|
    yield response_status_code, response_headers, response_body
  end
end

#put(uri, request_headers, body) ⇒ Object

Performs a PUT request to the Online Payments platform

See Also:



135
136
137
138
139
# File 'lib/onlinepayments/sdk/defaultimpl/default_connection.rb', line 135

def put(uri, request_headers, body)
  request('put', uri, request_headers, body) do |response_status_code, response_headers, response_body|
    yield response_status_code, response_headers, response_body
  end
end

#request(method, uri, request_headers, body = nil) {|Integer, Array<OnlinePayments::SDK::ResponseHeader>, IO| ... } ⇒ Object

Performs a HTTP request and yields the response as the status code, headers and body. Also ensures the request is logged when sent and its response is logged when received.

Parameters:

  • method (String)

    ‘GET’, ‘DELETE’, ‘POST’ or ‘PUT’ depending on the HTTP method being used.

  • uri (URI::HTTP)

    full URI of the location the request is targeted at, including query parameters.

  • request_headers (Array<OnlinePayments::SDK::RequestHeader>)

    list of headers that should be used as HTTP headers in the request.

  • body (String) (defaults to: nil)

    request body.

Yields:

Raises:



150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
# File 'lib/onlinepayments/sdk/defaultimpl/default_connection.rb', line 150

def request(method, uri, request_headers, body = nil)
  request_headers = convert_from_headers(request_headers)
  request_id = SecureRandom.uuid
  content_type = request_headers[CONTENT_TYPE]

  info = { headers: request_headers, content_type: content_type }
  info[:body] = body if body

  log_request(request_id, method.upcase, uri, info)

  start_time = Time.now
  begin
    response_headers = nil
    response_status_code = nil
    response_content_type = nil
    response_body = ''
    raw_request(method, uri, request_headers, body) do |status_code, headers, r_content_type, r_body|
      response_headers = headers
      response_status_code = status_code
      response_content_type = r_content_type
      response_body = r_body.read.force_encoding('UTF-8')
      r_body = StringIO.new(response_body)

      yield status_code, headers, r_body
    end

    log_response(request_id, response_status_code, start_time,
                 headers: response_headers, body: response_body,
                 content_type: response_content_type)
  rescue HTTPClient::TimeoutError => e
    log_error(request_id, start_time, e)
    raise OnlinePayments::SDK::CommunicationException, e
  rescue HTTPClient::KeepAliveDisconnected, HTTPClient::RetryableResponse => e # retry these?
    log_error(request_id, start_time, e)
    raise OnlinePayments::SDK::CommunicationException, e
  rescue StandardError => e
    log_error(request_id, start_time, e)
    raise OnlinePayments::SDK::CommunicationException, e
  end
end

#session_countObject

Returns the number of open connections



105
106
107
# File 'lib/onlinepayments/sdk/defaultimpl/default_connection.rb', line 105

def session_count
  @http_client.session_count
end