summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/goamz/goamz/exp/sns/sns.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/goamz/goamz/exp/sns/sns.go')
-rw-r--r--vendor/github.com/goamz/goamz/exp/sns/sns.go113
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
+}