diff options
Diffstat (limited to 'vendor/github.com/goamz/goamz/exp/sns/sns.go')
-rw-r--r-- | vendor/github.com/goamz/goamz/exp/sns/sns.go | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/vendor/github.com/goamz/goamz/exp/sns/sns.go b/vendor/github.com/goamz/goamz/exp/sns/sns.go new file mode 100644 index 000000000..4d4622211 --- /dev/null +++ b/vendor/github.com/goamz/goamz/exp/sns/sns.go @@ -0,0 +1,113 @@ +// +// goamz - Go packages to interact with the Amazon Web Services. +// +// https://wiki.ubuntu.com/goamz +// +// Copyright (c) 2011 Memeo Inc. +// +// Written by Prudhvi Krishna Surapaneni <me@prudhvi.net> + +// This package is in an experimental state, and does not currently +// follow conventions and style of the rest of goamz or common +// Go conventions. It must be polished before it's considered a +// first-class package in goamz. +package sns + +// BUG(niemeyer): Package needs documentation. + +import ( + "encoding/xml" + "net/http" + "net/url" + "time" + + "github.com/goamz/goamz/aws" +) + +// The SNS type encapsulates operation with an SNS region. +type SNS struct { + aws.Auth + aws.Region + private byte // Reserve the right of using private data. +} + +type AttributeEntry struct { + Key string `xml:"key"` + Value string `xml:"value"` +} + +type ResponseMetadata struct { + RequestId string `xml:"ResponseMetadata>RequestId"` + BoxUsage float64 `xml:"ResponseMetadata>BoxUsage"` +} + +func New(auth aws.Auth, region aws.Region) *SNS { + return &SNS{auth, region, 0} +} + +func makeParams(action string) map[string]string { + params := make(map[string]string) + params["Action"] = action + return params +} + +type Error struct { + StatusCode int + Code string + Message string + RequestId string +} + +func (err *Error) Error() string { + return err.Message +} + +type xmlErrors struct { + RequestId string + Errors []Error `xml:"Errors>Error"` +} + +func (sns *SNS) query(params map[string]string, resp interface{}) error { + params["Timestamp"] = time.Now().UTC().Format(time.RFC3339) + u, err := url.Parse(sns.Region.SNSEndpoint) + if err != nil { + return err + } + + sign(sns.Auth, "GET", "/", params, u.Host) + u.RawQuery = multimap(params).Encode() + r, err := http.Get(u.String()) + if err != nil { + return err + } + defer r.Body.Close() + + if r.StatusCode != 200 { + return buildError(r) + } + err = xml.NewDecoder(r.Body).Decode(resp) + return err +} + +func buildError(r *http.Response) error { + errors := xmlErrors{} + xml.NewDecoder(r.Body).Decode(&errors) + var err Error + if len(errors.Errors) > 0 { + err = errors.Errors[0] + } + err.RequestId = errors.RequestId + err.StatusCode = r.StatusCode + if err.Message == "" { + err.Message = r.Status + } + return &err +} + +func multimap(p map[string]string) url.Values { + q := make(url.Values, len(p)) + for k, v := range p { + q[k] = []string{v} + } + return q +} |