code: def signable(self, request, authheaders, bodyhash=None):
          
          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
docs: 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.