From 3834e49c90c39f4c95e3b9e7bb52b35204a75625 Mon Sep 17 00:00:00 2001 From: Stefan Majewsky Date: Sun, 28 Jan 2018 22:47:35 +0100 Subject: sketch out how requests could work --- account.go | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) (limited to 'account.go') 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 -- cgit v1.2.3