| 175 | } |
| 176 | |
| 177 | Status Read(uint64 offset, size_t n, StringPiece* result, |
| 178 | char* scratch) const override { |
| 179 | Aws::S3::Model::GetObjectRequest getObjectRequest; |
| 180 | getObjectRequest.WithBucket(bucket_.c_str()).WithKey(object_.c_str()); |
| 181 | string bytes = strings::StrCat("bytes=", offset, "-", offset + n - 1); |
| 182 | getObjectRequest.SetRange(bytes.c_str()); |
| 183 | getObjectRequest.SetResponseStreamFactory([]() { |
| 184 | return Aws::New<Aws::StringStream>(kS3FileSystemAllocationTag); |
| 185 | }); |
| 186 | auto getObjectOutcome = this->s3_client_->GetObject(getObjectRequest); |
| 187 | if (!getObjectOutcome.IsSuccess()) { |
| 188 | n = 0; |
| 189 | *result = StringPiece(scratch, n); |
| 190 | return Status(error::OUT_OF_RANGE, "Read less bytes than requested"); |
| 191 | } |
| 192 | n = getObjectOutcome.GetResult().GetContentLength(); |
| 193 | getObjectOutcome.GetResult().GetBody().read(scratch, n); |
| 194 | |
| 195 | *result = StringPiece(scratch, n); |
| 196 | return Status::OK(); |
| 197 | } |
| 198 | |
| 199 | private: |
| 200 | string bucket_; |