findify / s3mock

Embedded S3 server for easy mocking
MIT License
386 stars 107 forks source link

Batch delete API (DeleteObjects) doesn't URL-encode object keys like single-object APIs #166

Closed goldfrapp04 closed 4 years ago

goldfrapp04 commented 4 years ago

Best explained by an example: https://github.com/findify/s3mock/pull/165 (which also fixes the issue).

When running JavaBuilderExample without the DeleteObjects change, you'll encounter MultiObjectDeleteException. Debug log shows:

22:39:09.948 DEBUG i.f.s3mock.provider.InMemoryProvider - putting object for s3://testbucket/file%5Ename, bytes = 8
22:39:10.035 WARN  i.f.s3mock.provider.InMemoryProvider - key does not exist
22:39:10.035 INFO  i.findify.s3mock.route.DeleteObjects - cannot delete object testbucket/file^name: no such key
Exception in thread "main" com.amazonaws.services.s3.model.MultiObjectDeleteException: One or more objects could not be deleted (Service: null; Status Code: 200; Error Code: null; Request ID: null; S3 Extended Request ID: null), S3 Extended Request ID: null
    at com.amazonaws.services.s3.AmazonS3Client.deleteObjects(AmazonS3Client.java:2138)
    at io.findify.s3mock.example.JavaBuilderExample.main(JavaBuilderExample.java:28)

Note we put file%5Ename but wanted to delete file^name instead. This inconsistency was caused by key rendering in single-key APIs, but not DeleteObjects.

When running JavaBuilderExample with the DeleteObjects change, we can successfully delete the object.