docs: def list_ranges(self, share_name, directory_name, file_name,
                      start_range=None, end_range=None, timeout=None):
          '''
          Retrieves the valid ranges for a file.
  
          :param str share_name:
              Name of existing share.
          :param str directory_name:
              The path to the directory.
          :param str file_name:
              Name of existing file.
          :param int start_range:
              Specifies the start offset of bytes over which to list ranges.
              The start_range and end_range params are inclusive.
              Ex: start_range=0, end_range=511 will download first 512 bytes of file.
          :param int end_range:
              Specifies the end offset of bytes over which to list ranges.
              The start_range and end_range params are inclusive.
              Ex: start_range=0, end_range=511 will download first 512 bytes of file.
          :param int timeout:
              The timeout parameter is expressed in seconds.
          :returns: a list of valid ranges
          :rtype: a list of :class:`.FileRange`
          '''
          _validate_not_none('share_name', share_name)
          _validate_not_none('file_name', file_name)
          request = HTTPRequest()
          request.method = 'GET'
          request.host = self._get_host()
          request.path = _get_path(share_name, directory_name, file_name)
          request.query = [
              ('comp', 'rangelist'),
              ('timeout', _int_to_str(timeout)),
          ]
          if start_range is not None:
              _validate_and_format_range_headers(
                  request,
                  start_range,
                  end_range,
                  start_range_required=False,
                  end_range_required=False)
  
          response = self._perform_request(request)
          return _convert_xml_to_ranges(response)