+def get_sharing(request):
+ """Parse an X-Object-Sharing header from the request.
+
+ Raises BadRequest on error.
+ """
+
+ permissions = request.META.get('HTTP_X_OBJECT_SHARING')
+ if permissions is None:
+ return None
+
+ # TODO: Document or remove '~' replacing.
+ permissions = permissions.replace('~', '')
+
+ ret = {}
+ permissions = permissions.replace(' ', '')
+ if permissions == '':
+ return ret
+ for perm in (x for x in permissions.split(';')):
+ if perm.startswith('read='):
+ ret['read'] = list(set([v.replace(' ','').lower() for v in perm[5:].split(',')]))
+ if '' in ret['read']:
+ ret['read'].remove('')
+ if '*' in ret['read']:
+ ret['read'] = ['*']
+ if len(ret['read']) == 0:
+ raise BadRequest('Bad X-Object-Sharing header value')
+ elif perm.startswith('write='):
+ ret['write'] = list(set([v.replace(' ','').lower() for v in perm[6:].split(',')]))
+ if '' in ret['write']:
+ ret['write'].remove('')
+ if '*' in ret['write']:
+ ret['write'] = ['*']
+ if len(ret['write']) == 0:
+ raise BadRequest('Bad X-Object-Sharing header value')
+ else:
+ raise BadRequest('Bad X-Object-Sharing header value')
+
+ # Keep duplicates only in write list.
+ dups = [x for x in ret.get('read', []) if x in ret.get('write', []) and x != '*']
+ if dups:
+ for x in dups:
+ ret['read'].remove(x)
+ if len(ret['read']) == 0:
+ del(ret['read'])
+
+ return ret
+
+def get_public(request):
+ """Parse an X-Object-Public header from the request.
+
+ Raises BadRequest on error.
+ """
+
+ public = request.META.get('HTTP_X_OBJECT_PUBLIC')
+ if public is None:
+ return None
+
+ public = public.replace(' ', '').lower()
+ if public == 'true':
+ return True
+ elif public == 'false' or public == '':
+ return False
+ raise BadRequest('Bad X-Object-Public header value')
+