code: def canonicalize(method, resource, query_parameters, headers):
      
      headers, _ = get_canonical_headers(headers)
  
      if method == "RESUMABLE":
          method = "POST"
          headers.append("x-goog-resumable:start")
  
      if query_parameters is None:
          return _Canonical(method, resource, [], headers)
  
      normalized_qp = sorted(
          (key.lower(), value and value.strip() or "")
          for key, value in query_parameters.items()
      )
      encoded_qp = six.moves.urllib.parse.urlencode(normalized_qp)
      canonical_resource = "{}?{}".format(resource, encoded_qp)
      return _Canonical(method, canonical_resource, normalized_qp, headers)
docs: Canonicalize method, resource
  
      :type method: str
      :param method: The HTTP verb that will be used when requesting the URL.
                     Defaults to ``'GET'``. If method is ``'RESUMABLE'`` then the
                     signature will additionally contain the `x-goog-resumable`
                     header, and the method changed to POST. See the signed URL
                     docs regarding this flow:
                     https://cloud.google.com/storage/docs/access-control/signed-urls
  
      :type resource: str
      :param resource: A pointer to a specific resource
                       (typically, ``/bucket-name/path/to/blob.txt``).
  
      :type query_parameters: dict
      :param query_parameters:
          (Optional) Additional query paramtersto be included as part of the
          signed URLs.  See:
          https://cloud.google.com/storage/docs/xml-api/reference-headers#query
  
      :type headers: Union[dict|List(Tuple(str,str))]
      :param headers:
          (Optional) Additional HTTP headers to be included as part of the
          signed URLs.  See:
          https://cloud.google.com/storage/docs/xml-api/reference-headers
          Requests using the signed URL *must* pass the specified header
          (name and value) with each request for the URL.
  
      :rtype: :class:_Canonical
      :returns: Canonical method, resource, query_parameters, and headers.