def __init__(self, *args, **kwargs): swob.Response.__init__(self, *args, **kwargs) sw_sysmeta_headers = swob.HeaderKeyDict() sw_headers = swob.HeaderKeyDict() headers = HeaderKeyDict() self.is_slo = False for key, val in self.headers.iteritems(): _key = key.lower() if _key.startswith(sysmeta_prefix('object')) or \ _key.startswith(sysmeta_prefix('container')): sw_sysmeta_headers[key] = val else: sw_headers[key] = val # Handle swift headers for key, val in sw_headers.iteritems(): _key = key.lower() if _key.startswith('x-object-meta-'): # Note that AWS ignores user-defined headers with '=' in the # header name. We translated underscores to '=5F' on the way # in, though. headers['x-amz-meta-' + _key[14:].replace('=5f', '_')] = val elif _key in ('content-length', 'content-type', 'content-range', 'content-encoding', 'content-disposition', 'content-language', 'etag', 'last-modified', 'x-robots-tag', 'cache-control', 'expires', 'x-amz-version-id'): headers[key] = val elif _key == 'x-object-sysmeta-version-id': headers['x-amz-version-id'] = val elif _key == 'x-static-large-object': # for delete slo self.is_slo = config_true_value(val) # Check whether we stored the AWS-style etag on upload override_etag = sw_sysmeta_headers.get(sysmeta_header( 'object', 'etag')) if override_etag not in (None, ''): # Multipart uploads in AWS have ETags like # <MD5(part_etag1 || ... || part_etagN)>-<number of parts> headers['etag'] = override_etag elif self.is_slo and 'etag' in headers: # Many AWS clients use the presence of a '-' to decide whether # to attempt client-side download validation, so even if we # didn't store the AWS-style header, tack on a '-N'. (Use 'N' # because we don't actually know how many parts there are.) headers['etag'] += '-N' self.headers = headers if self.etag: # add double quotes to the etag header self.etag = self.etag # Used for pure swift header handling at the request layer self.sw_headers = sw_headers self.sysmeta_headers = sw_sysmeta_headers
def __init__(self, *args, **kwargs): swob.Response.__init__(self, *args, **kwargs) if self.etag: # add double quotes to the etag header self.etag = self.etag sw_sysmeta_headers = swob.HeaderKeyDict() sw_headers = swob.HeaderKeyDict() headers = HeaderKeyDict() self.is_slo = False for key, val in self.headers.iteritems(): _key = key.lower() if _key.startswith(sysmeta_prefix('object')) or \ _key.startswith(sysmeta_prefix('container')): sw_sysmeta_headers[key] = val else: sw_headers[key] = val # Handle swift headers for key, val in sw_headers.iteritems(): _key = key.lower() if _key.startswith('x-object-meta-'): headers['x-amz-meta-' + _key[14:]] = val elif _key in ('content-length', 'content-type', 'content-range', 'content-encoding', 'content-disposition', 'content-language', 'etag', 'last-modified', 'x-robots-tag', 'cache-control', 'expires', 'x-amz-version-id'): headers[key] = val elif _key == 'x-object-sysmeta-version-id': headers['x-amz-version-id'] = val elif _key == 'x-static-large-object': # for delete slo self.is_slo = config_true_value(val) if self.is_slo: # and 'etag' in headers # Multipart uploads in AWS have ETags like # <MD5(part_etag1 || ... || part_etagN)>-<number of parts> if '-' not in headers.get('etag', ''): if 's3_etag' in headers.get('content-type', ''): # ETag was computed at upload, and saved in content-type ctype, s3_etag = extract_s3_etag(headers['content-type']) headers['etag'] = '"%s"' % s3_etag headers['content-type'] = ctype else: # Many AWS clients use the presence of a '-' to decide # whether to attempt client-side download validation, # so tack on a '-N' ('N' because we don't actually know # how many parts there are). headers['etag'] = '"%s-N"' % self.etag self.headers = headers # Used for pure swift header handling at the request layer self.sw_headers = sw_headers self.sysmeta_headers = sw_sysmeta_headers
def __init__(self, *args, **kwargs): swob.Response.__init__(self, *args, **kwargs) if self.etag: # add double quotes to the etag header self.etag = self.etag sw_sysmeta_headers = swob.HeaderKeyDict() sw_headers = swob.HeaderKeyDict() headers = HeaderKeyDict() self.is_slo = False for key, val in self.headers.iteritems(): _key = key.lower() if _key.startswith(sysmeta_prefix("object")) or _key.startswith(sysmeta_prefix("container")): sw_sysmeta_headers[key] = val else: sw_headers[key] = val # Handle swift headers for key, val in sw_headers.iteritems(): _key = key.lower() if _key.startswith("x-object-meta-"): headers["x-amz-meta-" + _key[14:]] = val elif _key in ( "content-length", "content-type", "content-range", "content-encoding", "content-disposition", "content-language", "etag", "last-modified", "x-robots-tag", "cache-control", "expires", ): headers[key] = val elif _key == "x-static-large-object": # for delete slo self.is_slo = val self.headers = headers # Used for pure swift header handling at the request layer self.sw_headers = sw_headers self.sysmeta_headers = sw_sysmeta_headers
def __init__(self, *args, **kwargs): swob.Response.__init__(self, *args, **kwargs) if self.etag: # add double quotes to the etag header self.etag = self.etag sw_sysmeta_headers = swob.HeaderKeyDict() sw_headers = swob.HeaderKeyDict() headers = HeaderKeyDict() self.is_slo = False for key, val in self.headers.iteritems(): _key = key.lower() if _key.startswith(sysmeta_prefix('object')) or \ _key.startswith(sysmeta_prefix('container')): sw_sysmeta_headers[key] = val else: sw_headers[key] = val # Handle swift headers for key, val in sw_headers.iteritems(): _key = key.lower() if _key.startswith('x-object-meta-'): # Note that AWS ignores user-defined headers with '=' in the # header name. We translated underscores to '=5F' on the way # in, though. headers['x-amz-meta-' + _key[14:].replace('=5f', '_')] = val elif _key in ('content-length', 'content-type', 'content-range', 'content-encoding', 'content-disposition', 'content-language', 'etag', 'last-modified', 'x-robots-tag', 'cache-control', 'expires'): headers[key] = val elif _key == 'x-static-large-object': # for delete slo self.is_slo = config_true_value(val) self.headers = headers # Used for pure swift header handling at the request layer self.sw_headers = sw_headers self.sysmeta_headers = sw_sysmeta_headers
def __init__(self, *args, **kwargs): swob.Response.__init__(self, *args, **kwargs) if self.etag: # add double quotes to the etag header self.etag = self.etag sw_sysmeta_headers = swob.HeaderKeyDict() sw_headers = swob.HeaderKeyDict() headers = HeaderKeyDict() for key, val in self.headers.iteritems(): _key = key.lower() if _key.startswith(sysmeta_prefix('object')) or \ _key.startswith(sysmeta_prefix('container')): sw_sysmeta_headers[key] = val else: sw_headers[key] = val # Handle swift headers for key, val in sw_headers.iteritems(): _key = key.lower() if _key.startswith('x-object-meta-'): headers['x-amz-meta-' + _key[14:]] = val elif _key in ('content-length', 'content-type', 'content-range', 'content-encoding', 'etag', 'last-modified'): headers[key] = val elif _key == 'x-container-object-count': # for ceph/s3tests headers['x-rgw-object-count'] = val elif _key == 'x-container-bytes-used': # for ceph/s3tests headers['x-rgw-bytes-used'] = val self.headers = headers # Used for pure swift header handling at the request layer self.sw_headers = sw_headers self.sysmeta_headers = sw_sysmeta_headers