1package files 2 3import ( 4 "context" 5 "fmt" 6 "net/http" 7 "strconv" 8 "strings" 9 10 "github.com/Azure/go-autorest/autorest" 11 "github.com/Azure/go-autorest/autorest/azure" 12 "github.com/Azure/go-autorest/autorest/validation" 13 "github.com/tombuildsstuff/giovanni/storage/internal/endpoints" 14 "github.com/tombuildsstuff/giovanni/storage/internal/metadata" 15) 16 17type GetResult struct { 18 autorest.Response 19 20 CacheControl string 21 ContentDisposition string 22 ContentEncoding string 23 ContentLanguage string 24 ContentLength *int64 25 ContentMD5 string 26 ContentType string 27 CopyID string 28 CopyStatus string 29 CopySource string 30 CopyProgress string 31 CopyStatusDescription string 32 CopyCompletionTime string 33 Encrypted bool 34 35 MetaData map[string]string 36} 37 38// GetProperties returns the Properties for the specified file 39func (client Client) GetProperties(ctx context.Context, accountName, shareName, path, fileName string) (result GetResult, err error) { 40 if accountName == "" { 41 return result, validation.NewError("files.Client", "GetProperties", "`accountName` cannot be an empty string.") 42 } 43 if shareName == "" { 44 return result, validation.NewError("files.Client", "GetProperties", "`shareName` cannot be an empty string.") 45 } 46 if strings.ToLower(shareName) != shareName { 47 return result, validation.NewError("files.Client", "GetProperties", "`shareName` must be a lower-cased string.") 48 } 49 if fileName == "" { 50 return result, validation.NewError("files.Client", "GetProperties", "`fileName` cannot be an empty string.") 51 } 52 53 req, err := client.GetPropertiesPreparer(ctx, accountName, shareName, path, fileName) 54 if err != nil { 55 err = autorest.NewErrorWithError(err, "files.Client", "GetProperties", nil, "Failure preparing request") 56 return 57 } 58 59 resp, err := client.GetPropertiesSender(req) 60 if err != nil { 61 result.Response = autorest.Response{Response: resp} 62 err = autorest.NewErrorWithError(err, "files.Client", "GetProperties", resp, "Failure sending request") 63 return 64 } 65 66 result, err = client.GetPropertiesResponder(resp) 67 if err != nil { 68 err = autorest.NewErrorWithError(err, "files.Client", "GetProperties", resp, "Failure responding to request") 69 return 70 } 71 72 return 73} 74 75// GetPropertiesPreparer prepares the GetProperties request. 76func (client Client) GetPropertiesPreparer(ctx context.Context, accountName, shareName, path, fileName string) (*http.Request, error) { 77 if path != "" { 78 path = fmt.Sprintf("%s/", path) 79 } 80 pathParameters := map[string]interface{}{ 81 "shareName": autorest.Encode("path", shareName), 82 "directory": autorest.Encode("path", path), 83 "fileName": autorest.Encode("path", fileName), 84 } 85 86 headers := map[string]interface{}{ 87 "x-ms-version": APIVersion, 88 } 89 90 preparer := autorest.CreatePreparer( 91 autorest.AsContentType("application/xml; charset=utf-8"), 92 autorest.AsHead(), 93 autorest.WithBaseURL(endpoints.GetFileEndpoint(client.BaseURI, accountName)), 94 autorest.WithPathParameters("/{shareName}/{directory}{fileName}", pathParameters), 95 autorest.WithHeaders(headers)) 96 return preparer.Prepare((&http.Request{}).WithContext(ctx)) 97} 98 99// GetPropertiesSender sends the GetProperties request. The method will close the 100// http.Response Body if it receives an error. 101func (client Client) GetPropertiesSender(req *http.Request) (*http.Response, error) { 102 return autorest.SendWithSender(client, req, 103 azure.DoRetryWithRegistration(client.Client)) 104} 105 106// GetPropertiesResponder handles the response to the GetProperties request. The method always 107// closes the http.Response Body. 108func (client Client) GetPropertiesResponder(resp *http.Response) (result GetResult, err error) { 109 if resp != nil && resp.Header != nil { 110 result.CacheControl = resp.Header.Get("Cache-Control") 111 result.ContentDisposition = resp.Header.Get("Content-Disposition") 112 result.ContentEncoding = resp.Header.Get("Content-Encoding") 113 result.ContentLanguage = resp.Header.Get("Content-Language") 114 result.ContentMD5 = resp.Header.Get("x-ms-content-md5") 115 result.ContentType = resp.Header.Get("Content-Type") 116 result.CopyID = resp.Header.Get("x-ms-copy-id") 117 result.CopyProgress = resp.Header.Get("x-ms-copy-progress") 118 result.CopySource = resp.Header.Get("x-ms-copy-source") 119 result.CopyStatus = resp.Header.Get("x-ms-copy-status") 120 result.CopyStatusDescription = resp.Header.Get("x-ms-copy-status-description") 121 result.CopyCompletionTime = resp.Header.Get("x-ms-copy-completion-time") 122 result.Encrypted = strings.EqualFold(resp.Header.Get("x-ms-server-encrypted"), "true") 123 result.MetaData = metadata.ParseFromHeaders(resp.Header) 124 125 contentLengthRaw := resp.Header.Get("Content-Length") 126 if contentLengthRaw != "" { 127 contentLength, err := strconv.Atoi(contentLengthRaw) 128 if err != nil { 129 return result, fmt.Errorf("Error parsing %q for Content-Length as an integer: %s", contentLengthRaw, err) 130 } 131 contentLengthI64 := int64(contentLength) 132 result.ContentLength = &contentLengthI64 133 } 134 } 135 136 err = autorest.Respond( 137 resp, 138 client.ByInspecting(), 139 azure.WithErrorUnlessStatusCode(http.StatusOK), 140 autorest.ByClosing()) 141 result.Response = autorest.Response{Response: resp} 142 143 return 144} 145