def make_request(request, method, default_headers=None, **kwargs):
    """
    convert parameters into relevant parts
    of the an http request
    :param request: either url or an HTTPRequest object
    :param method: http request method
    :param default_headers: default headers
    :param kwargs: headers, query string params for GET and DELETE,
    data for POST and PUT
    """
    kwargs = convert(kwargs)
    if not default_headers:
        headers = dict(DEFAULT_HEADERS)
    else:
        headers = default_headers.copy()
    if isinstance(request, HTTPRequest):
        headers.update(request.headers)
    if 'headers' in kwargs:
        headers.update(kwargs.pop('headers'))
    if isinstance(request, HTTPRequest):
        request.method = method
        request.headers.update(headers)
    else:
        request = HTTPRequest(request, method, headers)
    if kwargs:
        if method in ['GET', 'DELETE']:
            request.url = "{}?{}".format(request.url, urllib.urlencode(kwargs))
        elif method in ['POST', 'PUT']:
            if request.headers['Content-Type'] == JSON_TYPE:
                request.body = json.dumps(kwargs)
            elif 'body' in kwargs:
                request.body = kwargs['body']
    return request
convert parameters into relevant parts
    of the an http request
    :param request: either url or an HTTPRequest object
    :param method: http request method
    :param default_headers: default headers
    :param kwargs: headers, query string params for GET and DELETE,
    data for POST and PUT