aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Majewsky <majewsky@gmx.net>2018-02-05 23:23:48 +0100
committerStefan Majewsky <majewsky@gmx.net>2018-02-05 23:23:48 +0100
commitf78c5a59a8fd198603199ddcfb5b29315d556f58 (patch)
tree193f2795128638324a856f7c4c1c7dc29d15ff1f
parent09597ccf1693b1ac7999030c1a2c37d9373dfe7b (diff)
downloadgo-schwift-f78c5a59a8fd198603199ddcfb5b29315d556f58.tar.gz
add type-safe accessors for most container headers
-rw-r--r--headers.go34
-rw-r--r--headers/time.go71
2 files changed, 96 insertions, 9 deletions
diff --git a/headers.go b/headers.go
index 2d81ddf..fe8fa38 100644
--- a/headers.go
+++ b/headers.go
@@ -35,13 +35,14 @@ import (
//Set(), Del(), Clear() methods on this type.
type AccountHeaders struct {
headers.Headers
- BytesUsed headers.Uint64Readonly `schwift:"X-Account-Bytes-Used"`
- ContainerCount headers.Uint64Readonly `schwift:"X-Account-Container-Count"`
- Metadata headers.Metadata `schwift:"X-Account-Meta-"`
- ObjectCount headers.Uint64Readonly `schwift:"X-Account-Object-Count"`
- QuotaBytes headers.Uint64 `schwift:"X-Account-Meta-Quota-Bytes"`
- TempURLKey headers.String `schwift:"X-Account-Meta-Temp-URL-Key"`
- TempURLKey2 headers.String `schwift:"X-Account-Meta-Temp-URL-Key-2"`
+ BytesUsed headers.Uint64Readonly `schwift:"X-Account-Bytes-Used"`
+ ContainerCount headers.Uint64Readonly `schwift:"X-Account-Container-Count"`
+ Metadata headers.Metadata `schwift:"X-Account-Meta-"`
+ ObjectCount headers.Uint64Readonly `schwift:"X-Account-Object-Count"`
+ QuotaBytes headers.Uint64 `schwift:"X-Account-Meta-Quota-Bytes"`
+ TempURLKey headers.String `schwift:"X-Account-Meta-Temp-URL-Key"`
+ TempURLKey2 headers.String `schwift:"X-Account-Meta-Temp-URL-Key-2"`
+ Timestamp headers.UnixTimeReadonly `schwift:"X-Timestamp"`
//forbid initialization as struct literal (must use NewAccountHeaders)
initialized bool
}
@@ -77,8 +78,23 @@ func (ah AccountHeaders) Validate() error {
//Set(), Del(), Clear() methods on this type.
type ContainerHeaders struct {
headers.Headers
- Metadata headers.Metadata `schwift:"X-Container-Meta-"`
- //TODO map well-known headers
+ BytesUsed headers.Uint64Readonly `schwift:"X-Container-Bytes-Used"`
+ BytesUsedQuota headers.Uint64 `schwift:"X-Container-Meta-Quota-Bytes"`
+ HistoryLocation headers.String `schwift:"X-History-Location"`
+ Metadata headers.Metadata `schwift:"X-Container-Meta-"`
+ ObjectCount headers.Uint64Readonly `schwift:"X-Container-Object-Count"`
+ ObjectCountQuota headers.Uint64 `schwift:"X-Container-Meta-Quota-Count"`
+ ReadACL headers.String `schwift:"X-Container-Read"`
+ //StoragePolicy can only be set in a PUT request.
+ StoragePolicy headers.String `schwift:"X-Storage-Policy"`
+ SyncKey headers.String `schwift:"X-Container-Sync-Key"`
+ SyncTo headers.String `schwift:"X-Container-Sync-To"`
+ TempURLKey2 headers.String `schwift:"X-Container-Meta-Temp-URL-Key-2"`
+ TempURLKey headers.String `schwift:"X-Container-Meta-Temp-URL-Key"`
+ Timestamp headers.UnixTimeReadonly `schwift:"X-Timestamp"`
+ VersionsLocation headers.String `schwift:"X-Versions-Location"`
+ WriteACL headers.String `schwift:"X-Container-Write"`
+ //TODO map X-Container-Meta-Access-Control-* (requires new data types)
//forbid initialization as struct literal (must use NewContainerHeaders)
initialized bool
}
diff --git a/headers/time.go b/headers/time.go
new file mode 100644
index 0000000..5f9209f
--- /dev/null
+++ b/headers/time.go
@@ -0,0 +1,71 @@
+/******************************************************************************
+*
+* Copyright 2018 Stefan Majewsky <majewsky@gmx.net>
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+******************************************************************************/
+
+package headers
+
+import (
+ "math"
+ "strconv"
+ "time"
+)
+
+//UnixTimeReadonly is a helper type that provides type-safe access to a Swift
+//header whose value is a UNIX timestamp. It cannot be directly constructed,
+//but some subtypes of schwift.Headers have fields of this type. For example:
+//
+// var hdr AccountHeaders
+// //hdr.Timestamp is a headers.UnixTimeReadonly instance
+// hdr.Timestamp.Get() //returns a time.Time
+// hdr.Get("X-Timestamp") //returns a string containing a UNIX timestamp
+// //refering to the same point in time
+type UnixTimeReadonly struct {
+ Base
+}
+
+//Exists checks whether there is a value for this header.
+func (f UnixTimeReadonly) Exists() bool {
+ return f.H.Get(f.K) != ""
+}
+
+//Get returns the value for this header, or the zero value if there is no value
+//(or if it is not a valid timestamp).
+func (f UnixTimeReadonly) Get() time.Time {
+ v, err := strconv.ParseFloat(f.H.Get(f.K), 64)
+ if err != nil {
+ return time.Time{}
+ }
+ seconds := math.Floor(v)
+ return time.Unix(
+ int64(seconds),
+ int64(1e9*(v-seconds)),
+ )
+}
+
+//Validate is only used internally, but needs to be exported to cross package
+//boundaries.
+func (f UnixTimeReadonly) Validate() error {
+ val := f.H.Get(f.K)
+ if val == "" {
+ return nil
+ }
+ _, err := strconv.ParseFloat(val, 64)
+ if err == nil {
+ return nil
+ }
+ return MalformedHeaderError{f.K, err}
+}