@@ -367,36 +367,48 @@ def ls(request, response, storage, *args, **kwargs):
367
367
368
368
def copy (request , response , storage , * args , ** kwargs ):
369
369
try :
370
- obj = storage .get_file_obj (
371
- request .params ["bucket_name" ], request .params ["object_id" ]
372
- )
370
+ dest_obj = _copy (
371
+ request .base_url ,
372
+ storage ,
373
+ request .params ["bucket_name" ],
374
+ request .params ["object_id" ],
375
+ request .params ["dest_bucket_name" ],
376
+ request .params ["dest_object_id" ])
377
+ if dest_obj is None :
378
+ response .status = HTTPStatus .NOT_FOUND
379
+ else :
380
+ response .json (dest_obj )
381
+ except Conflict as err :
382
+ _handle_conflict (response , err )
383
+
384
+
385
+ def _copy (base_url , storage , bucket_name , object_id , dest_bucket_name , dest_object_id ):
386
+ try :
387
+ obj = storage .get_file_obj (bucket_name , object_id )
373
388
except NotFound :
374
- response .status = HTTPStatus .NOT_FOUND
375
- return
389
+ return None
376
390
377
391
dest_obj = _make_object_resource (
378
- request . base_url ,
379
- request . params [ " dest_bucket_name" ] ,
380
- request . params [ " dest_object_id" ] ,
392
+ base_url ,
393
+ dest_bucket_name ,
394
+ dest_object_id ,
381
395
obj ["contentType" ],
382
396
obj ["size" ],
383
397
obj ,
384
398
)
385
399
386
- file = storage .get_file (request . params [ " bucket_name" ], request . params [ " object_id" ] )
400
+ file = storage .get_file (bucket_name , object_id )
387
401
try :
388
402
dest_obj = _checksums (file , dest_obj )
389
403
storage .create_file (
390
- request . params [ " dest_bucket_name" ] ,
391
- request . params [ " dest_object_id" ] ,
404
+ dest_bucket_name ,
405
+ dest_object_id ,
392
406
file ,
393
407
dest_obj ,
394
408
)
395
- response . json ( dest_obj )
409
+ return dest_obj
396
410
except NotFound :
397
- response .status = HTTPStatus .NOT_FOUND
398
- except Conflict as err :
399
- _handle_conflict (response , err )
411
+ return None
400
412
401
413
402
414
def compose (request , response , storage , * args , ** kwargs ):
@@ -526,6 +538,22 @@ def batch(request, response, storage, *args, **kwargs):
526
538
if resp_data :
527
539
response .write ("HTTP/1.1 204 No Content\r \n " )
528
540
response .write ("Content-Type: application/json; charset=UTF-8\r \n " )
541
+ if method == "POST" : # kludgy heuristics, currently only supports COPY
542
+ if object_id :
543
+ resp_data = _copy (
544
+ request .base_url ,
545
+ storage ,
546
+ bucket_name ,
547
+ object_id ,
548
+ item ["dest_bucket_name" ],
549
+ item ["dest_object_id" ],
550
+ )
551
+ if resp_data :
552
+ response .write ("HTTP/1.1 200 OK\r \n " )
553
+ response .write ("Content-Type: application/json; charset=UTF-8\r \n " )
554
+ response .write (json .dumps (resp_data ))
555
+ response .write ("\r \n \r \n " )
556
+
529
557
if not resp_data :
530
558
msg = "No such object: {}/{}" .format (bucket_name , object_id )
531
559
resp_data = deepcopy (NOT_FOUND )
0 commit comments