Class: Cdek::Connection

Inherits:
Object
  • Object
show all
Defined in:
lib/cdek/connection.rb

Overview

Низкоуровневый HTTP-коннект к CDEK API.

Отвечает за:

  • получение и кэширование OAuth2 access_token (grant_type=client_credentials);

  • прозрачный ретрай запроса при 401 (один раз, со сбросом токена);

  • сериализацию JSON-тел и маппинг HTTP-статусов в иерархию Cdek::ApiError.

Constant Summary collapse

JSON_CONTENT_TYPE =
"application/json"
FORM_CONTENT_TYPE =
"application/x-www-form-urlencoded"
TOKEN_PATH =
"/oauth/token"
TOKEN_REFRESH_LEEWAY =

секунд до истечения, после которых обновляем заранее

30
HTTP_METHOD_CLASSES =
{
  get:    Net::HTTP::Get,
  post:   Net::HTTP::Post,
  patch:  Net::HTTP::Patch,
  put:    Net::HTTP::Put,
  delete: Net::HTTP::Delete
}.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(configuration) ⇒ Connection

Returns a new instance of Connection.



30
31
32
33
34
35
# File 'lib/cdek/connection.rb', line 30

def initialize(configuration)
  @configuration     = configuration
  @token_mutex       = Mutex.new
  @access_token      = nil
  @token_expires_at  = nil
end

Instance Attribute Details

#configurationObject (readonly)

Returns the value of attribute configuration.



28
29
30
# File 'lib/cdek/connection.rb', line 28

def configuration
  @configuration
end

Instance Method Details

#authenticated_request(method, path, params: nil, body: nil, headers: {}) ⇒ Object

Выполняет авторизованный запрос. Любой ответ 2xx — возвращает распарсенное тело. Любая ошибка — поднимается как Cdek::ApiError или его наследник.



39
40
41
# File 'lib/cdek/connection.rb', line 39

def authenticated_request(method, path, params: nil, body: nil, headers: {})
  execute_authenticated(method, path, params, body, headers, retried: false)
end

#reset_token!Object

Сбрасывает кэшированный токен — следующая операция получит новый.



44
45
46
47
48
49
# File 'lib/cdek/connection.rb', line 44

def reset_token!
  @token_mutex.synchronize do
    @access_token     = nil
    @token_expires_at = nil
  end
end