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