+ if not restricted:
+ response['X-Object-Modified-By'] = smart_str(meta['modified_by'], strings_only=True)
+ response['X-Object-Version'] = meta['version']
+ response['X-Object-Version-Timestamp'] = http_date(int(meta['version_timestamp']))
+ for k in [x for x in meta.keys() if x.startswith('X-Object-Meta-')]:
+ response[smart_str(k, strings_only=True)] = smart_str(meta[k], strings_only=True)
+ for k in ('Content-Encoding', 'Content-Disposition', 'X-Object-Manifest',
+ 'X-Object-Sharing', 'X-Object-Shared-By', 'X-Object-Allowed-To',
+ 'X-Object-Public'):
+ if k in meta:
+ response[k] = smart_str(meta[k], strings_only=True)
+ else:
+ for k in ('Content-Encoding', 'Content-Disposition'):
+ if k in meta:
+ response[k] = meta[k]
+
+def update_manifest_meta(request, v_account, meta):
+ """Update metadata if the object has an X-Object-Manifest."""
+
+ if 'X-Object-Manifest' in meta:
+ hash = ''
+ bytes = 0
+ try:
+ src_container, src_name = split_container_object_string('/' + meta['X-Object-Manifest'])
+ objects = request.backend.list_objects(request.user, v_account,
+ src_container, prefix=src_name, virtual=False)
+ for x in objects:
+ src_meta = request.backend.get_object_meta(request.user,
+ v_account, src_container, x[0], x[1])
+ hash += src_meta['hash']
+ bytes += src_meta['bytes']
+ except:
+ # Ignore errors.
+ return
+ meta['bytes'] = bytes
+ md5 = hashlib.md5()
+ md5.update(hash)
+ meta['hash'] = md5.hexdigest().lower()
+
+def update_sharing_meta(request, permissions, v_account, v_container, v_object, meta):
+ if permissions is None:
+ return
+ allowed, perm_path, perms = permissions
+ if len(perms) == 0:
+ return
+ ret = []
+ r = ','.join(perms.get('read', []))
+ if r:
+ ret.append('read=' + r)
+ w = ','.join(perms.get('write', []))
+ if w:
+ ret.append('write=' + w)
+ meta['X-Object-Sharing'] = '; '.join(ret)
+ if '/'.join((v_account, v_container, v_object)) != perm_path:
+ meta['X-Object-Shared-By'] = perm_path
+ if request.user != v_account:
+ meta['X-Object-Allowed-To'] = allowed
+
+def update_public_meta(public, meta):
+ if not public:
+ return
+ meta['X-Object-Public'] = public