154 lines
4.9 KiB
Go
154 lines
4.9 KiB
Go
|
package apns2
|
||
|
|
||
|
import (
|
||
|
"net/http"
|
||
|
"strconv"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
// StatusSent is a 200 response.
|
||
|
const StatusSent = http.StatusOK
|
||
|
|
||
|
// The possible Reason error codes returned from APNs.
|
||
|
// From table 8-6 in the Apple Local and Remote Notification Programming Guide.
|
||
|
const (
|
||
|
// 400 The collapse identifier exceeds the maximum allowed size
|
||
|
ReasonBadCollapseID = "BadCollapseId"
|
||
|
|
||
|
// 400 The specified device token was bad. Verify that the request contains a
|
||
|
// valid token and that the token matches the environment.
|
||
|
ReasonBadDeviceToken = "BadDeviceToken"
|
||
|
|
||
|
// 400 The apns-expiration value is bad.
|
||
|
ReasonBadExpirationDate = "BadExpirationDate"
|
||
|
|
||
|
// 400 The apns-id value is bad.
|
||
|
ReasonBadMessageID = "BadMessageId"
|
||
|
|
||
|
// 400 The apns-priority value is bad.
|
||
|
ReasonBadPriority = "BadPriority"
|
||
|
|
||
|
// 400 The apns-topic was invalid.
|
||
|
ReasonBadTopic = "BadTopic"
|
||
|
|
||
|
// 400 The device token does not match the specified topic.
|
||
|
ReasonDeviceTokenNotForTopic = "DeviceTokenNotForTopic"
|
||
|
|
||
|
// 400 One or more headers were repeated.
|
||
|
ReasonDuplicateHeaders = "DuplicateHeaders"
|
||
|
|
||
|
// 400 Idle time out.
|
||
|
ReasonIdleTimeout = "IdleTimeout"
|
||
|
|
||
|
// 400 The device token is not specified in the request :path. Verify that the
|
||
|
// :path header contains the device token.
|
||
|
ReasonMissingDeviceToken = "MissingDeviceToken"
|
||
|
|
||
|
// 400 The apns-topic header of the request was not specified and was
|
||
|
// required. The apns-topic header is mandatory when the client is connected
|
||
|
// using a certificate that supports multiple topics.
|
||
|
ReasonMissingTopic = "MissingTopic"
|
||
|
|
||
|
// 400 The message payload was empty.
|
||
|
ReasonPayloadEmpty = "PayloadEmpty"
|
||
|
|
||
|
// 400 Pushing to this topic is not allowed.
|
||
|
ReasonTopicDisallowed = "TopicDisallowed"
|
||
|
|
||
|
// 403 The certificate was bad.
|
||
|
ReasonBadCertificate = "BadCertificate"
|
||
|
|
||
|
// 403 The client certificate was for the wrong environment.
|
||
|
ReasonBadCertificateEnvironment = "BadCertificateEnvironment"
|
||
|
|
||
|
// 403 The provider token is stale and a new token should be generated.
|
||
|
ReasonExpiredProviderToken = "ExpiredProviderToken"
|
||
|
|
||
|
// 403 The specified action is not allowed.
|
||
|
ReasonForbidden = "Forbidden"
|
||
|
|
||
|
// 403 The provider token is not valid or the token signature could not be
|
||
|
// verified.
|
||
|
ReasonInvalidProviderToken = "InvalidProviderToken"
|
||
|
|
||
|
// 403 No provider certificate was used to connect to APNs and Authorization
|
||
|
// header was missing or no provider token was specified.
|
||
|
ReasonMissingProviderToken = "MissingProviderToken"
|
||
|
|
||
|
// 404 The request contained a bad :path value.
|
||
|
ReasonBadPath = "BadPath"
|
||
|
|
||
|
// 405 The specified :method was not POST.
|
||
|
ReasonMethodNotAllowed = "MethodNotAllowed"
|
||
|
|
||
|
// 410 The device token is inactive for the specified topic.
|
||
|
ReasonUnregistered = "Unregistered"
|
||
|
|
||
|
// 413 The message payload was too large. See Creating the Remote Notification
|
||
|
// Payload in the Apple Local and Remote Notification Programming Guide for
|
||
|
// details on maximum payload size.
|
||
|
ReasonPayloadTooLarge = "PayloadTooLarge"
|
||
|
|
||
|
// 429 The provider token is being updated too often.
|
||
|
ReasonTooManyProviderTokenUpdates = "TooManyProviderTokenUpdates"
|
||
|
|
||
|
// 429 Too many requests were made consecutively to the same device token.
|
||
|
ReasonTooManyRequests = "TooManyRequests"
|
||
|
|
||
|
// 500 An internal server error occurred.
|
||
|
ReasonInternalServerError = "InternalServerError"
|
||
|
|
||
|
// 503 The service is unavailable.
|
||
|
ReasonServiceUnavailable = "ServiceUnavailable"
|
||
|
|
||
|
// 503 The server is shutting down.
|
||
|
ReasonShutdown = "Shutdown"
|
||
|
)
|
||
|
|
||
|
// Response represents a result from the APNs gateway indicating whether a
|
||
|
// notification was accepted or rejected and (if applicable) the metadata
|
||
|
// surrounding the rejection.
|
||
|
type Response struct {
|
||
|
|
||
|
// The HTTP status code retuened by APNs.
|
||
|
// A 200 value indicates that the notification was successfully sent.
|
||
|
// For a list of other possible status codes, see table 6-4 in the Apple Local
|
||
|
// and Remote Notification Programming Guide.
|
||
|
StatusCode int
|
||
|
|
||
|
// The APNs error string indicating the reason for the notification failure (if
|
||
|
// any). The error code is specified as a string. For a list of possible
|
||
|
// values, see the Reason constants above.
|
||
|
// If the notification was accepted, this value will be "".
|
||
|
Reason string
|
||
|
|
||
|
// The APNs ApnsID value from the Notification. If you didn't set an ApnsID on the
|
||
|
// Notification, this will be a new unique UUID which has been created by APNs.
|
||
|
ApnsID string
|
||
|
|
||
|
// If the value of StatusCode is 410, this is the last time at which APNs
|
||
|
// confirmed that the device token was no longer valid for the topic.
|
||
|
Timestamp Time
|
||
|
}
|
||
|
|
||
|
// Sent returns whether or not the notification was successfully sent.
|
||
|
// This is the same as checking if the StatusCode == 200.
|
||
|
func (c *Response) Sent() bool {
|
||
|
return c.StatusCode == StatusSent
|
||
|
}
|
||
|
|
||
|
// Time represents a device uninstall time
|
||
|
type Time struct {
|
||
|
time.Time
|
||
|
}
|
||
|
|
||
|
// UnmarshalJSON converts an epoch date into a Time struct.
|
||
|
func (t *Time) UnmarshalJSON(b []byte) error {
|
||
|
ts, err := strconv.ParseInt(string(b), 10, 64)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
t.Time = time.Unix(ts/1000, 0)
|
||
|
return nil
|
||
|
}
|