-
Notifications
You must be signed in to change notification settings - Fork 741
NEW API: GetObjectAttributes #1921
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
harshavardhana
merged 14 commits into
minio:master
from
zveinn:feature-GetObjectAttributes
Jan 8, 2024
Merged
Changes from 2 commits
Commits
Show all changes
14 commits
Select commit
Hold shift + click to select a range
e6c0700
initial commit
zveinn beae3f9
Simplification of the API post chat with Klaus
zveinn 45a9010
Exporting structs and fields for ease of use
zveinn 9b70e5e
Removing header that are not needed
zveinn ef7b069
Adding comment
zveinn 40662a6
adding pagination back in
zveinn be63502
Adding documentation
zveinn 98c4e54
Moving SSE test to TLS block
zveinn 8397688
Removing bucket deletion errors
zveinn 7b33363
Adding a header check for compatibility support
zveinn 4fd7afa
Adding comment and fixing capitalization of ETag constant
zveinn b44f3e4
Changing return type to pointer to be consistent with other api calls
zveinn 6f77380
Adding api documentation
zveinn db122ab
Fixing docs
zveinn File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,129 @@ | ||
| package minio | ||
|
|
||
| import ( | ||
| "context" | ||
| "encoding/xml" | ||
| "net/http" | ||
| "net/url" | ||
| "time" | ||
|
|
||
| "github.com/minio/minio-go/v7/pkg/encrypt" | ||
| "github.com/minio/minio-go/v7/pkg/s3utils" | ||
| ) | ||
|
|
||
| // ObjectAttributesOptions is an API call that combines | ||
| // HeadObject and ListParts. | ||
| // | ||
| // VersionID - The object version you want to attributes for | ||
| // ServerSideEncryption - The server-side encryption algorithm used when storing this object in Minio | ||
| type ObjectAttributesOptions struct { | ||
| VersionID string | ||
| ServerSideEncryption encrypt.ServerSide | ||
| } | ||
|
|
||
| // ObjectAttributes ... | ||
| type ObjectAttributes struct { | ||
| objectAttributesResponse | ||
|
zveinn marked this conversation as resolved.
Outdated
|
||
| LastModified time.Time | ||
| VersionID string | ||
| } | ||
|
|
||
| func (o *ObjectAttributes) parseResponse(resp *http.Response) (err error) { | ||
| mod, err := parseRFC7231Time(resp.Header.Get("Last-Modified")) | ||
| if err != nil { | ||
| return err | ||
| } | ||
| o.LastModified = mod | ||
| o.VersionID = resp.Header.Get(amzVersionID) | ||
|
|
||
| response := new(objectAttributesResponse) | ||
| if err := xml.NewDecoder(resp.Body).Decode(response); err != nil { | ||
| return err | ||
| } | ||
| o.objectAttributesResponse = *response | ||
|
|
||
| return | ||
| } | ||
|
|
||
| type objectAttributesResponse struct { | ||
| ETag string `xml:",omitempty"` | ||
| StorageClass string | ||
| ObjectSize int | ||
| Checksum struct { | ||
| ChecksumCRC32 string `xml:",omitempty"` | ||
| ChecksumCRC32C string `xml:",omitempty"` | ||
| ChecksumSHA1 string `xml:",omitempty"` | ||
| ChecksumSHA256 string `xml:",omitempty"` | ||
| } | ||
| ObjectParts struct { | ||
| PartsCount int | ||
| Parts []*objectPart `xml:"Part"` | ||
|
zveinn marked this conversation as resolved.
Outdated
|
||
| } | ||
| } | ||
|
|
||
| type objectPart struct { | ||
| ChecksumCRC32 string `xml:",omitempty"` | ||
| ChecksumCRC32C string `xml:",omitempty"` | ||
| ChecksumSHA1 string `xml:",omitempty"` | ||
| ChecksumSHA256 string `xml:",omitempty"` | ||
| PartNumber int | ||
| Size int | ||
| } | ||
|
|
||
| // GetObjectAttributes ... | ||
|
zveinn marked this conversation as resolved.
Outdated
|
||
| // This API combines HeadObject and ListParts. | ||
| func (c *Client) GetObjectAttributes(ctx context.Context, bucketName, objectName string, opts ObjectAttributesOptions) (ObjectAttributes, error) { | ||
| if err := s3utils.CheckValidBucketName(bucketName); err != nil { | ||
| return ObjectAttributes{}, err | ||
| } | ||
|
|
||
| if err := s3utils.CheckValidObjectName(objectName); err != nil { | ||
| return ObjectAttributes{}, err | ||
| } | ||
|
|
||
| urlValues := make(url.Values) | ||
| urlValues.Add("attributes", "") | ||
| if opts.VersionID != "" { | ||
| urlValues.Add("versionId", opts.VersionID) | ||
| } | ||
|
|
||
| headers := make(http.Header) | ||
| headers.Set(amzObjectAttributes, GetObjectAttributesTags) | ||
|
|
||
| headers.Set(amzPartNumberMarker, "0") | ||
| headers.Set(amzMaxParts, "0") | ||
|
harshavardhana marked this conversation as resolved.
Outdated
|
||
|
|
||
| if opts.ServerSideEncryption != nil { | ||
| opts.ServerSideEncryption.Marshal(headers) | ||
| } | ||
|
|
||
| resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ | ||
| bucketName: bucketName, | ||
| objectName: objectName, | ||
| queryValues: urlValues, | ||
| contentSHA256Hex: emptySHA256Hex, | ||
| customHeader: headers, | ||
| }) | ||
| if err != nil { | ||
| return ObjectAttributes{}, err | ||
| } | ||
|
|
||
| if resp.StatusCode != http.StatusOK { | ||
| ER := new(ErrorResponse) | ||
| if err := xml.NewDecoder(resp.Body).Decode(ER); err != nil { | ||
| return ObjectAttributes{}, err | ||
| } | ||
|
|
||
| return ObjectAttributes{}, *ER | ||
| } | ||
|
|
||
| defer closeResponse(resp) | ||
|
zveinn marked this conversation as resolved.
Outdated
|
||
|
|
||
| OA := new(ObjectAttributes) | ||
| err = OA.parseResponse(resp) | ||
| if err != nil { | ||
| return ObjectAttributes{}, err | ||
| } | ||
|
|
||
| return *OA, nil | ||
| } | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.