update_manifest_meta, update_sharing_meta, update_public_meta, validate_modification_preconditions,
validate_matching_preconditions, split_container_object_string, copy_or_move_object,
get_int_parameter, get_content_length, get_content_range, socket_read_iterator,
- object_data_response, put_object_block, hashmap_hash, api_method)
+ object_data_response, put_object_block, hashmap_hash, api_method, json_encode_decimal)
from pithos.backends import connect_backend
from pithos.backends.base import NotAllowedError
try:
meta = request.backend.get_account_meta(request.user, v_account, until)
groups = request.backend.get_account_groups(request.user, v_account)
+ policy = request.backend.get_account_policy(request.user, v_account)
except NotAllowedError:
raise Unauthorized('Access denied')
validate_modification_preconditions(request, meta)
response = HttpResponse(status=204)
- put_account_headers(response, meta, groups)
+ put_account_headers(response, meta, groups, policy)
return response
@api_method('POST')
try:
meta = request.backend.get_account_meta(request.user, v_account, until)
groups = request.backend.get_account_groups(request.user, v_account)
+ policy = request.backend.get_account_policy(request.user, v_account)
except NotAllowedError:
raise Unauthorized('Access denied')
validate_modification_preconditions(request, meta)
response = HttpResponse()
- put_account_headers(response, meta, groups)
+ put_account_headers(response, meta, groups, policy)
marker = request.GET.get('marker')
limit = get_int_parameter(request.GET.get('limit'))
meta, policy = get_container_headers(request)
try:
- request.backend.put_container(request.user, v_account, v_container,
- policy)
+ request.backend.put_container(request.user, v_account, v_container, policy)
ret = 201
except NotAllowedError:
raise Unauthorized('Access denied')
raise Unauthorized('Access denied')
except NameError:
raise ItemNotFound('Container does not exist')
- return HttpResponse(status=202)
+
+ content_length = -1
+ if request.META.get('HTTP_TRANSFER_ENCODING') != 'chunked':
+ content_length = get_int_parameter(request.META.get('CONTENT_LENGTH', 0))
+ content_type = request.META.get('CONTENT_TYPE')
+ hashmap = []
+ if content_type and content_type == 'application/octet-stream' and content_length != 0:
+ for data in socket_read_iterator(request, content_length,
+ request.backend.block_size):
+ # TODO: Raise 408 (Request Timeout) if this takes too long.
+ # TODO: Raise 499 (Client Disconnect) if a length is defined and we stop before getting this much data.
+ hashmap.append(request.backend.put_block(data))
+
+ response = HttpResponse(status=202)
+ if hashmap:
+ response.content = '\n'.join(hashmap) + '\n'
+ return response
@api_method('DELETE')
def container_delete(request, v_account, v_container):
if request.serialization == 'xml':
data = render_to_string('objects.xml', {'container': v_container, 'objects': object_meta})
elif request.serialization == 'json':
- data = json.dumps(object_meta)
+ data = json.dumps(object_meta, default=json_encode_decimal)
response.status_code = 200
response.content = data
return response
d['object'] = v_object
data = render_to_string('versions.xml', d)
elif request.serialization == 'json':
- data = json.dumps(d)
+ data = json.dumps(d, default=json_encode_decimal)
response = HttpResponse(data, status=200)
response['Content-Length'] = len(data)
response['Content-Length'] = len(data)
return response
+ request.serialization = 'text' # Unset.
return object_data_response(request, sizes, hashmaps, meta)
@api_method('PUT', format_allowed=True)
if copy_from or move_from:
content_length = get_content_length(request) # Required by the API.
+ src_account = smart_unicode(request.META.get('HTTP_X_SOURCE_ACCOUNT'), strings_only=True)
+ if not src_account:
+ src_account = request.user
if move_from:
try:
src_container, src_name = split_container_object_string(move_from)
except ValueError:
raise BadRequest('Invalid X-Move-From header')
- version_id = copy_or_move_object(request, v_account, src_container, src_name, v_container, v_object, move=True)
+ version_id = copy_or_move_object(request, src_account, src_container, src_name,
+ v_account, v_container, v_object, move=True)
else:
try:
src_container, src_name = split_container_object_string(copy_from)
except ValueError:
raise BadRequest('Invalid X-Copy-From header')
- version_id = copy_or_move_object(request, v_account, src_container, src_name, v_container, v_object, move=False)
+ version_id = copy_or_move_object(request, src_account, src_container, src_name,
+ v_account, v_container, v_object, move=False)
response = HttpResponse(status=201)
response['X-Object-Version'] = version_id
return response
# unauthorized (401),
# badRequest (400)
- dest_path = request.META.get('HTTP_DESTINATION')
+ dest_account = smart_unicode(request.META.get('HTTP_DESTINATION_ACCOUNT'), strings_only=True)
+ if not dest_account:
+ dest_account = request.user
+ dest_path = smart_unicode(request.META.get('HTTP_DESTINATION'), strings_only=True)
if not dest_path:
raise BadRequest('Missing Destination header')
try:
raise ItemNotFound('Container or object does not exist')
validate_matching_preconditions(request, meta)
- version_id = copy_or_move_object(request, v_account, v_container, v_object, dest_container, dest_name, move=False)
+ version_id = copy_or_move_object(request, v_account, v_container, v_object,
+ dest_account, dest_container, dest_name, move=False)
response = HttpResponse(status=201)
response['X-Object-Version'] = version_id
return response
# unauthorized (401),
# badRequest (400)
- dest_path = request.META.get('HTTP_DESTINATION')
+ dest_account = smart_unicode(request.META.get('HTTP_DESTINATION_ACCOUNT'), strings_only=True)
+ if not dest_account:
+ dest_account = request.user
+ dest_path = smart_unicode(request.META.get('HTTP_DESTINATION'), strings_only=True)
if not dest_path:
raise BadRequest('Missing Destination header')
try:
raise ItemNotFound('Container or object does not exist')
validate_matching_preconditions(request, meta)
- version_id = copy_or_move_object(request, v_account, v_container, v_object, dest_container, dest_name, move=True)
+ version_id = copy_or_move_object(request, v_account, v_container, v_object,
+ dest_account, dest_container, dest_name, move=True)
response = HttpResponse(status=201)
response['X-Object-Version'] = version_id
return response
elif offset > size:
raise RangeNotSatisfiable('Supplied offset is beyond object limits')
if src_object:
+ src_account = smart_unicode(request.META.get('HTTP_X_SOURCE_ACCOUNT'), strings_only=True)
+ if not src_account:
+ src_account = request.user
src_container, src_name = split_container_object_string(src_object)
src_container = smart_unicode(src_container, strings_only=True)
src_name = smart_unicode(src_name, strings_only=True)
src_version = request.META.get('HTTP_X_SOURCE_VERSION')
try:
- src_size, src_hashmap = request.backend.get_object_hashmap(
- request.user, v_account, src_container, src_name, src_version)
+ src_size, src_hashmap = request.backend.get_object_hashmap(request.user,
+ src_account, src_container, src_name, src_version)
except NotAllowedError:
raise Unauthorized('Access denied')
except NameError: