Method: B2::APIConnection#send_request

Defined in:
lib/b2/api_connection.rb

#send_request(request, body = nil, &block) ⇒ Object



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/b2/api_connection.rb', line 74

def send_request(request, body=nil, &block)
  retries = 0
  request['Authorization'] = authorization_token
  request.body = (body.is_a?(String) ? body : JSON.generate(body)) if body
  
  return_value = nil
  close_connection = false
  begin
    connection.request(request) do |response|
      close_connection = response['Connection'] == 'close'
      
      case response
      when Net::HTTPSuccess
        if block_given?
          return_value = yield(response)
        else
          return_value = JSON.parse(response.body)
        end
      else
        body = JSON.parse(response.body)
        case body['code']
        when 'not_found'
          raise B2::NotFound(body['message'])
        when 'expired_auth_token'
          raise B2::ExpiredAuthToken(body['message'])
        else
          raise "Error connecting to B2 API #{response.body}"
        end
      end
    end
    
  # Unexpected EOF (end of file) errors can occur when streaming from a
  # remote because of Backblaze quota restrictions.
  rescue B2::ExpiredAuthToken, EOFError
    reconnect!
    retries =+ 1
    retry if retries < 2
  end
  disconnect! if close_connection

  return_value
end