| 140 | } |
| 141 | |
| 142 | Status ParseS3Path(const string& fname, bool empty_object_ok, string* bucket, |
| 143 | string* object) { |
| 144 | if (!bucket || !object) { |
| 145 | return errors::Internal("bucket and object cannot be null."); |
| 146 | } |
| 147 | StringPiece scheme, bucketp, objectp; |
| 148 | io::ParseURI(fname, &scheme, &bucketp, &objectp); |
| 149 | if (scheme != "s3") { |
| 150 | return errors::InvalidArgument("S3 path doesn't start with 's3://': ", |
| 151 | fname); |
| 152 | } |
| 153 | *bucket = string(bucketp); |
| 154 | if (bucket->empty() || *bucket == ".") { |
| 155 | return errors::InvalidArgument("S3 path doesn't contain a bucket name: ", |
| 156 | fname); |
| 157 | } |
| 158 | absl::ConsumePrefix(&objectp, "/"); |
| 159 | *object = string(objectp); |
| 160 | if (!empty_object_ok && object->empty()) { |
| 161 | return errors::InvalidArgument("S3 path doesn't contain an object name: ", |
| 162 | fname); |
| 163 | } |
| 164 | return Status::OK(); |
| 165 | } |
| 166 | |
| 167 | class S3RandomAccessFile : public RandomAccessFile { |
| 168 | public: |
no test coverage detected