diff Aws/AwsS3StoragePlugin.cpp @ 41:d99afdf6d872

ReadRange for AWS
author Alain Mazy <am@osimis.io>
date Fri, 19 Mar 2021 10:13:49 +0100
parents f55b2afdf53d
children 1c3e34f5c5c6
line wrap: on
line diff
--- a/Aws/AwsS3StoragePlugin.cpp	Fri Mar 19 09:34:29 2021 +0100
+++ b/Aws/AwsS3StoragePlugin.cpp	Fri Mar 19 10:13:49 2021 +0100
@@ -141,12 +141,30 @@
       throw StoragePluginException(std::string("error while reading file ") + path_ + ": " + result.GetError().GetExceptionName().c_str() + " " + result.GetError().GetMessage().c_str());
     }
   }
-  virtual void Read(char* data, size_t size)
+
+  virtual void ReadWhole(char* data, size_t size)
+  {
+    _Read(data, size, 0, false);
+  }
+
+  virtual void ReadRange(char* data, size_t size, size_t fromOffset)
+  {
+    _Read(data, size, fromOffset, true);
+  }
+
+  void _Read(char* data, size_t size, size_t fromOffset, bool useRange)
   {
     Aws::S3::Model::GetObjectRequest getObjectRequest;
     getObjectRequest.SetBucket(bucketName_.c_str());
     getObjectRequest.SetKey(path_.c_str());
 
+    if (useRange)
+    {
+      // https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests
+      std::string range = std::string("bytes=") + boost::lexical_cast<std::string>(fromOffset) + "-" + boost::lexical_cast<std::string>(fromOffset + size -1);
+      getObjectRequest.SetRange(range.c_str());
+    }
+
     getObjectRequest.SetResponseStreamFactory(
           [data, size]()
     {
@@ -174,6 +192,8 @@
 
 
 
+
+
 const char* AwsS3StoragePluginFactory::GetStoragePluginName()
 {
   return "AWS S3 Storage";