def make_etag(value, is_weak=False): """Creates and returns a ETag object. Args: value (str): Unquated entity tag value is_weak (bool): The weakness indicator Returns: A ``str``-like Etag instance with weakness indicator. """ etag = ETag(value) etag.is_weak = is_weak return etag
def _parse_etags(etag_str): """Parse a string containing one or more HTTP entity-tags. The string is assumed to be formatted as defined for a precondition header, and may contain either a single ETag, or multiple comma-separated ETags. The string may also contain a '*' character, in order to indicate that any ETag should match the precondition. (See also: RFC 7232, Section 3) Args: etag_str (str): An ASCII header value to parse ETags from. ETag values within may be prefixed by ``W/`` to indicate that the weak comparison function should be used. Returns: list: A list of unquoted ETags or ``['*']`` if all ETags should be matched. If the string to be parse is empty, or contains only whitespace, ``None`` will be returned instead. """ etag_str = etag_str.strip() if not etag_str: return None if etag_str == '*': return [etag_str] if ',' not in etag_str: return [ETag.loads(etag_str)] etags = [] # PERF(kgriffs): Parsing out the weak string like this turns out to be more # performant than grabbing the entire entity-tag and passing it to # ETag.loads(). This is also faster than parsing etag_str manually via # str.find() and slicing. for weak, value in _ENTITY_TAG_PATTERN.findall(etag_str): t = ETag(value) t.is_weak = bool(weak) etags.append(t) # NOTE(kgriffs): Normalize a string with only whitespace and commas # to None, since it is like a list of individual ETag headers that # are all set to nothing, and so therefore basically should be # treated as not having been set in the first place. return etags or None