aboutsummaryrefslogtreecommitdiff
path: root/account.go
diff options
context:
space:
mode:
Diffstat (limited to 'account.go')
-rw-r--r--account.go58
1 files changed, 58 insertions, 0 deletions
diff --git a/account.go b/account.go
index 6672a62..d89299f 100644
--- a/account.go
+++ b/account.go
@@ -20,6 +20,7 @@ package schwift
import (
"fmt"
+ "net/http"
"regexp"
"github.com/gophercloud/gophercloud"
@@ -31,6 +32,8 @@ type Account struct {
//URL parts
baseURL string
name string
+ //cache
+ metadata *AccountMetadata
}
////////////////////////////////////////////////////////////////////////////////
@@ -85,5 +88,60 @@ func (a *Account) Client() *gophercloud.ServiceClient {
////////////////////////////////////////////////////////////////////////////////
// account metadata
+//AccountMetadata contains the metadata for an account. The `Raw` attribute
+//contains the raw set of headers returned from a HEAD or GET request on the
+//account. The other attributes contain the parsed values of common headers.
+type AccountMetadata struct {
+ Exists bool
+ BytesUsed uint64 //from X-Account-Bytes-Used
+ ContainerCount uint64 //from X-Account-Container-Count
+ ObjectCount uint64 //from X-Account-Object-Count
+ //TODO account quota
+ Raw http.Header
+}
+
+//Metadata returns the metadata for this account. If the account does not exist,
+func (a *Account) Metadata() (AccountMetadata, error) {
+ if a.metadata != nil {
+ return *a.metadata, nil
+ }
+
+ resp, err := Request{
+ Method: "HEAD",
+ ExpectStatusCodes: []int{200},
+ }.Do(a.client)
+ if err != nil {
+ return AccountMetadata{}, err
+ }
+
+ a.metadata, err = parseAccountMetadata(resp)
+ if err != nil {
+ return AccountMetadata{}, err
+ }
+ return *a.metadata, nil
+}
+
+func parseAccountMetadata(resp *http.Response) (*AccountMetadata, error) {
+ bytesUsed, err := parseUnsignedIntHeader(resp, "X-Account-Bytes-Used")
+ if err != nil {
+ return nil, err
+ }
+ containerCount, err := parseUnsignedIntHeader(resp, "X-Account-Container-Count")
+ if err != nil {
+ return nil, err
+ }
+ objectCount, err := parseUnsignedIntHeader(resp, "X-Account-Object-Count")
+ if err != nil {
+ return nil, err
+ }
+ return &AccountMetadata{
+ Exists: true,
+ BytesUsed: bytesUsed,
+ ContainerCount: containerCount,
+ ObjectCount: objectCount,
+ Raw: resp.Header,
+ }, nil
+}
+
////////////////////////////////////////////////////////////////////////////////
// container listing