From 957db775b3a81a37150c01269eb8df0685f92b71 Mon Sep 17 00:00:00 2001 From: Bo-Yi Wu Date: Fri, 12 May 2017 10:27:23 +0800 Subject: [PATCH] feat: upgrade apns2 to v0.9 (#222) --- vendor/github.com/sideshow/apns2/README.md | 28 ++++++++++++++----- vendor/github.com/sideshow/apns2/client.go | 21 ++++++++++++-- .../github.com/sideshow/apns2/client_go16.go | 25 +++++++++++++++++ .../github.com/sideshow/apns2/client_go17.go | 23 +++++++++++++++ vendor/vendor.json | 8 ++++-- 5 files changed, 92 insertions(+), 13 deletions(-) create mode 100644 vendor/github.com/sideshow/apns2/client_go16.go create mode 100644 vendor/github.com/sideshow/apns2/client_go17.go diff --git a/vendor/github.com/sideshow/apns2/README.md b/vendor/github.com/sideshow/apns2/README.md index a4e5fda..0aca766 100644 --- a/vendor/github.com/sideshow/apns2/README.md +++ b/vendor/github.com/sideshow/apns2/README.md @@ -19,16 +19,16 @@ APNS/2 is a go package designed for simple, flexible and fast Apple Push Notific - Make sure you have [Go](https://golang.org/doc/install) installed and have set your [GOPATH](https://golang.org/doc/code.html#GOPATH). - Download and install the dependencies: - ```sh +```sh go get -u golang.org/x/net/http2 go get -u golang.org/x/crypto/pkcs12 - ``` +``` - Install apns2: - ```sh +```sh go get -u github.com/sideshow/apns2 - ``` +``` ## Example @@ -71,7 +71,7 @@ func main() { At a minimum, a _Notification_ needs a _DeviceToken_, a _Topic_ and a _Payload_. ```go -notification := &Notification{ +notification := &apns2.Notification{ DeviceToken: "11aa01229f15f0f0c52029d8cf8cd0aeaf2365fe4cebc4af26cd6d76b7919ef7", Topic: "com.sideshow.Apns2", Payload: []byte(`{"aps":{"alert":"Hello!"}}`), @@ -83,7 +83,7 @@ You can also set an optional _ApnsID_, _Expiration_ or _Priority_. ```go notification.ApnsID = "40636A2C-C093-493E-936A-2A4333C06DEA" notification.Expiration = time.Now() -notification.Priority = apns.PriorityLow +notification.Priority = apns2.PriorityLow ``` ## Payload @@ -93,7 +93,7 @@ You can use raw bytes for the `notification.Payload` as above, or you can use th ```go // {"aps":{"alert":"hello","badge":1},"key":"val"} -payload := NewPayload().Alert("hello").Badge(1).Custom("key", "val") +payload := apns2.NewPayload().Alert("hello").Badge(1).Custom("key", "val") notification.Payload = payload client.Push(notification) @@ -124,6 +124,20 @@ if res.Sent() { } ``` +## Context & Timeouts + +For better control over request cancelations and timeouts APNS/2 supports +contexts. Using a context can be helpful if you want to cancel all pushes when +the parent process is cancelled, or need finer grained control over individual +push timeouts. See the [Google post](https://blog.golang.org/context) for more +information on contexts. + +```go +ctx, cancel = context.WithTimeout(context.Background(), 10 * time.Second) +res, err := client.PushWithContext(ctx, notification) +defer cancel() +``` + ## Command line tool APNS/2 has a command line tool that can be installed with `go get github.com/sideshow/apns2/apns2`. Usage: diff --git a/vendor/github.com/sideshow/apns2/client.go b/vendor/github.com/sideshow/apns2/client.go index 28b93cf..d4d5a53 100644 --- a/vendor/github.com/sideshow/apns2/client.go +++ b/vendor/github.com/sideshow/apns2/client.go @@ -32,7 +32,7 @@ var ( // HTTPClientTimeout specifies a time limit for requests made by the // HTTPClient. The timeout includes connection time, any redirects, // and reading the response body. - HTTPClientTimeout = 30 * time.Second + HTTPClientTimeout = 60 * time.Second ) // Client represents a connection with the APNs @@ -93,9 +93,23 @@ func (c *Client) Production() *Client { // transparently before sending the notification. It will return a Response // indicating whether the notification was accepted or rejected by the APNs // gateway, or an error if something goes wrong. +// +// Use PushWithContext if you need better cancelation and timeout control. func (c *Client) Push(n *Notification) (*Response, error) { - payload, err := json.Marshal(n) + return c.PushWithContext(nil, n) +} +// PushWithContext sends a Notification to the APNs gateway. Context carries a +// deadline and a cancelation signal and allows you to close long running +// requests when the context timeout is exceeded. Context can be nil, for +// backwards compatibility. +// +// If the underlying http.Client is not currently connected, this method will +// attempt to reconnect transparently before sending the notification. It will +// return a Response indicating whether the notification was accepted or +// rejected by the APNs gateway, or an error if something goes wrong. +func (c *Client) PushWithContext(ctx Context, n *Notification) (*Response, error) { + payload, err := json.Marshal(n) if err != nil { return nil, err } @@ -103,7 +117,8 @@ func (c *Client) Push(n *Notification) (*Response, error) { url := fmt.Sprintf("%v/3/device/%v", c.Host, n.DeviceToken) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) setHeaders(req, n) - httpRes, err := c.HTTPClient.Do(req) + + httpRes, err := c.requestWithContext(ctx, req) if err != nil { return nil, err } diff --git a/vendor/github.com/sideshow/apns2/client_go16.go b/vendor/github.com/sideshow/apns2/client_go16.go new file mode 100644 index 0000000..81c6c09 --- /dev/null +++ b/vendor/github.com/sideshow/apns2/client_go16.go @@ -0,0 +1,25 @@ +// +build go1.6,!go1.7 + +package apns2 + +import ( + "net/http" + + "golang.org/x/net/context" + "golang.org/x/net/context/ctxhttp" +) + +// A Context carries a deadline, a cancelation signal, and other values across +// API boundaries. +// +// Context's methods may be called by multiple goroutines simultaneously. +type Context interface { + context.Context +} + +func (c *Client) requestWithContext(ctx Context, req *http.Request) (*http.Response, error) { + if ctx != nil { + return ctxhttp.Do(ctx, c.HTTPClient, req) + } + return c.HTTPClient.Do(req) +} diff --git a/vendor/github.com/sideshow/apns2/client_go17.go b/vendor/github.com/sideshow/apns2/client_go17.go new file mode 100644 index 0000000..dd4d0f5 --- /dev/null +++ b/vendor/github.com/sideshow/apns2/client_go17.go @@ -0,0 +1,23 @@ +// +build go1.7 + +package apns2 + +import ( + "context" + "net/http" +) + +// A Context carries a deadline, a cancelation signal, and other values across +// API boundaries. +// +// Context's methods may be called by multiple goroutines simultaneously. +type Context interface { + context.Context +} + +func (c *Client) requestWithContext(ctx Context, req *http.Request) (*http.Response, error) { + if ctx != nil { + req = req.WithContext(ctx) + } + return c.HTTPClient.Do(req) +} diff --git a/vendor/vendor.json b/vendor/vendor.json index 82cf8fb..7f0147d 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -255,10 +255,12 @@ "revisionTime": "2017-02-16T22:32:56Z" }, { - "checksumSHA1": "980httoMt2EXTX/XQJCLkCJZkhQ=", + "checksumSHA1": "iICAK15yh57U3UpWEOTdAQcvT5o=", "path": "github.com/sideshow/apns2", - "revision": "c23f4b07d9e47aa490ff76001001decc688243f8", - "revisionTime": "2017-01-05T14:10:18Z" + "revision": "6ffbf017e660feff7df81e68de6482e263fae288", + "revisionTime": "2017-04-24T10:10:45Z", + "version": "v0.9", + "versionExact": "v0.9" }, { "checksumSHA1": "c3x81Xq+gIn5JBgs1eCTVeRwDDo=",