Revision 3ab38c43 pithos/api/util.py
b/pithos/api/util.py | ||
---|---|---|
79 | 79 |
"""Get all prefix-* request headers in a dict. Reformat keys with format_header_key().""" |
80 | 80 |
|
81 | 81 |
prefix = 'HTTP_' + prefix.upper().replace('-', '_') |
82 |
return dict([(format_header_key(k[5:]), v.replace('_', '')) for k, v in request.META.iteritems() if k.startswith(prefix) and len(k) > len(prefix)]) |
|
82 |
# TODO: Document or remove '~' replacing. |
|
83 |
return dict([(format_header_key(k[5:]), v.replace('~', '')) for k, v in request.META.iteritems() if k.startswith(prefix) and len(k) > len(prefix)]) |
|
83 | 84 |
|
84 | 85 |
def get_account_headers(request): |
85 | 86 |
meta = get_header_prefix(request, 'X-Account-Meta-') |
... | ... | |
107 | 108 |
|
108 | 109 |
def get_container_headers(request): |
109 | 110 |
meta = get_header_prefix(request, 'X-Container-Meta-') |
110 |
return meta |
|
111 |
policy = dict([(k[19:].lower(), v.replace(' ', '')) for k, v in get_header_prefix(request, 'X-Container-Policy-').iteritems()]) |
|
112 |
return meta, policy |
|
111 | 113 |
|
112 |
def put_container_headers(response, meta): |
|
114 |
def put_container_headers(response, meta, policy):
|
|
113 | 115 |
response['X-Container-Object-Count'] = meta['count'] |
114 | 116 |
response['X-Container-Bytes-Used'] = meta['bytes'] |
115 | 117 |
response['Last-Modified'] = http_date(int(meta['modified'])) |
... | ... | |
120 | 122 |
response['X-Container-Block-Hash'] = backend.hash_algorithm |
121 | 123 |
if 'until_timestamp' in meta: |
122 | 124 |
response['X-Container-Until-Timestamp'] = http_date(int(meta['until_timestamp'])) |
125 |
for k, v in policy.iteritems(): |
|
126 |
response[format_header_key('X-Container-Policy-' + k).encode('utf-8')] = v.encode('utf-8') |
|
123 | 127 |
|
124 | 128 |
def get_object_headers(request): |
125 | 129 |
meta = get_header_prefix(request, 'X-Object-Meta-') |
... | ... | |
131 | 135 |
meta['Content-Disposition'] = request.META['HTTP_CONTENT_DISPOSITION'] |
132 | 136 |
if request.META.get('HTTP_X_OBJECT_MANIFEST'): |
133 | 137 |
meta['X-Object-Manifest'] = request.META['HTTP_X_OBJECT_MANIFEST'] |
134 |
return meta |
|
138 |
return meta, get_sharing(request), get_public(request)
|
|
135 | 139 |
|
136 |
def put_object_headers(response, meta, public=False):
|
|
140 |
def put_object_headers(response, meta, restricted=False):
|
|
137 | 141 |
response['ETag'] = meta['hash'] |
138 | 142 |
response['Content-Length'] = meta['bytes'] |
139 | 143 |
response['Content-Type'] = meta.get('Content-Type', 'application/octet-stream') |
140 | 144 |
response['Last-Modified'] = http_date(int(meta['modified'])) |
141 |
if not public:
|
|
145 |
if not restricted:
|
|
142 | 146 |
response['X-Object-Modified-By'] = meta['modified_by'] |
143 | 147 |
response['X-Object-Version'] = meta['version'] |
144 | 148 |
response['X-Object-Version-Timestamp'] = http_date(int(meta['version_timestamp'])) |
... | ... | |
236 | 240 |
def copy_or_move_object(request, v_account, src_container, src_name, dest_container, dest_name, move=False): |
237 | 241 |
"""Copy or move an object.""" |
238 | 242 |
|
239 |
meta = get_object_headers(request) |
|
240 |
permissions = get_sharing(request) |
|
243 |
meta, permissions, public = get_object_headers(request) |
|
241 | 244 |
src_version = request.META.get('HTTP_X_SOURCE_VERSION') |
242 | 245 |
try: |
243 | 246 |
if move: |
... | ... | |
388 | 391 |
raise BadRequest('Bad X-Object-Sharing header value') |
389 | 392 |
return ret |
390 | 393 |
|
394 |
def get_public(request): |
|
395 |
"""Parse an X-Object-Public header from the request. |
|
396 |
|
|
397 |
Raises BadRequest on error. |
|
398 |
""" |
|
399 |
|
|
400 |
public = request.META.get('HTTP_X_OBJECT_PUBLIC') |
|
401 |
if public is None: |
|
402 |
return None |
|
403 |
|
|
404 |
public = public.replace(' ', '').lower() |
|
405 |
if public == 'true': |
|
406 |
return True |
|
407 |
elif public == 'false' or public == '': |
|
408 |
return False |
|
409 |
raise BadRequest('Bad X-Object-Public header value') |
|
410 |
|
|
391 | 411 |
def raw_input_socket(request): |
392 | 412 |
"""Return the socket for reading the rest of the request.""" |
393 | 413 |
|
Also available in: Unified diff