// // 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 // 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 }