Creates the signable string for a request and returns it.

        Keyword arguments:
        request -- A request object which can be consumed by this API.
        authheaders -- A string-indexable object which contains the headers appropriate for this signature version.
        bodyhash -- The hash for the body of the request. None if the request contains no body.
            This is expected for internal reasons, otherwise the body would be hashed multiple times, degrading performance.

def signable(self, request, authheaders, bodyhash=None):
        """Creates the signable string for a request and returns it.

        Keyword arguments:
        request -- A request object which can be consumed by this API.
        authheaders -- A string-indexable object which contains the headers appropriate for this signature version.
        bodyhash -- The hash for the body of the request. None if the request contains no body.
            This is expected for internal reasons, otherwise the body would be hashed multiple times, degrading performance.
        """
        method = request.method.upper()
        host = request.get_header("host")
        path = request.url.canonical_path()
        query = request.url.encoded_query()

        timestamp = request.get_header("x-authorization-timestamp")
        auth_headers = self.unroll_auth_headers(authheaders, exclude_signature=True, sep='&', quote=False)
        base = '{0}\n{1}\n{2}\n{3}\n{4}'.format(method, host, path, query, auth_headers)

        cheaders = []
        cheaders_sign = '\n'
        if "headers" in authheaders and authheaders["headers"] != "":
            cheaders = authheaders["headers"].split(";")
        cheaders.sort()
        for cheader in cheaders:
            cheaders_sign += '{0}: {1}\n'.format(cheader.lower(), request.get_header(cheader))
        base += cheaders_sign
        base += '{0}'.format(timestamp)

        if bodyhash is not None:
            base += '\n{0}\n{1}'.format(request.get_header('content-type'), bodyhash)

        return base