docs: def make_request(method, url, params=None, data=None, headers=None, auth=None):
      """
      Make an HTTP request.
  
      :param str   method:  "POST", "GET", "PUT" or "DELETE"
      :param str   url:     URL to process request.
      :param dict  params:  Params to add to the URL.
      :param dict  data:    Form data.
      :param dict  headers: Headers to request.
      :param tuple auth:    Username and token.
      """
  
      http = httplib2.Http(
          ca_certs=get_cert_file(),
      )
  
      if auth is not None:
          http.add_credentials(auth[0], auth[1])
  
      if params is not None:
          enc_params = urlencode(params, doseq=True)
          if urlparse(url).query:
              url = '%s&%s' % (url, enc_params)
          else:
              url = '%s?%s' % (url, enc_params)
          params["_format"] = "json"
  
      def encode_atom(atom):
          if isinstance(atom, (integer_types, binary_type)):
              return atom
          elif isinstance(atom, string_types):
              return atom.encode('utf-8')
          else:
              raise ValueError('list elements should be an integer, '
                               'binary, or string')
  
      if data is not None:
          udata = {}
          for k, v in iteritems(data):
              key = k.encode('utf-8')
              if isinstance(v, (list, tuple, set)):
                  udata[key] = [encode_atom(x) for x in v]
              elif isinstance(v, (integer_types, binary_type, string_types)):
                  udata[key] = encode_atom(v)
              else:
                  raise ValueError('data should be an integer, '
                                   'binary, or string, or sequence ')
          data = udata
          data = urlencode(udata, doseq=True)
  
      response, content = http.request(uri=url, method=method,
                                       headers=headers, body=data)
  
      return Response(response, content, url)