bilibili-backup/app/service/main/push/dao/oppo/client.go

185 lines
4.9 KiB
Go
Raw Normal View History

2019-04-22 10:59:20 +08:00
package oppo
import (
"encoding/json"
"io"
"io/ioutil"
"net/http"
"net/url"
"strconv"
"strings"
"time"
"go-common/library/log"
"go-common/library/stat"
"go-common/library/stat/prom"
)
// Client huawei push http client.
type Client struct {
Auth *Auth
HTTPClient *http.Client
Stats stat.Stat
Activity string
}
// NewClient new huawei push HTTP client.
func NewClient(a *Auth, activity string, timeout time.Duration) *Client {
return &Client{
Auth: a,
HTTPClient: &http.Client{Timeout: timeout},
Stats: prom.HTTPClient,
Activity: activity,
}
}
// Message saves push message content.
func (c *Client) Message(m *Message) (response *Response, err error) {
now := time.Now()
if c.Stats != nil {
defer func() {
c.Stats.Timing(_apiMessage, int64(time.Since(now)/time.Millisecond))
log.Info("oppo message stats timing: %v", int64(time.Since(now)/time.Millisecond))
if err != nil {
c.Stats.Incr(_apiMessage, "failed")
}
}()
}
params := url.Values{}
params.Add("auth_token", c.Auth.Token)
params.Add("title", m.Title)
params.Add("content", m.Content)
params.Add("click_action_type", strconv.Itoa(m.ActionType))
params.Add("click_action_activity", c.Activity)
params.Add("action_parameters", m.ActionParams)
params.Add("off_line_ttl", strconv.Itoa(m.OfflineTTL))
params.Add("call_back_url", m.CallbackURL)
req, err := http.NewRequest(http.MethodPost, _apiMessage, strings.NewReader(params.Encode()))
if err != nil {
log.Error("http.NewRequest() error(%v)", err)
return
}
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
req.Header.Set("Connection", "Keep-Alive")
res, err := c.HTTPClient.Do(req)
if err != nil {
log.Error("HTTPClient.Do() error(%v)", err)
return
}
defer res.Body.Close()
response = &Response{}
bs, err := ioutil.ReadAll(res.Body)
if err != nil {
log.Error("ioutil.ReadAll() error(%v)", err)
return
} else if len(bs) == 0 {
return
}
if e := json.Unmarshal(bs, &response); e != nil {
if e != io.EOF {
log.Error("json decode body(%s) error(%v)", string(bs), e)
}
}
return
}
// Push push notification.
func (c *Client) Push(msgID string, tokens []string) (response *Response, err error) {
now := time.Now()
if c.Stats != nil {
defer func() {
c.Stats.Timing(_apiPushBroadcast, int64(time.Since(now)/time.Millisecond))
log.Info("oppo push stats timing: %v", int64(time.Since(now)/time.Millisecond))
if err != nil {
c.Stats.Incr(_apiPushBroadcast, "failed")
}
}()
}
params := url.Values{}
params.Add("auth_token", c.Auth.Token)
params.Add("message_id", msgID)
params.Add("target_type", _pushTypeToken)
params.Add("registration_ids", strings.Join(tokens, ";"))
req, err := http.NewRequest(http.MethodPost, _apiPushBroadcast, strings.NewReader(params.Encode()))
if err != nil {
log.Error("http.NewRequest() error(%v)", err)
return
}
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
req.Header.Set("Connection", "Keep-Alive")
res, err := c.HTTPClient.Do(req)
if err != nil {
log.Error("HTTPClient.Do() error(%v)", err)
return
}
defer res.Body.Close()
response = &Response{}
bs, err := ioutil.ReadAll(res.Body)
if err != nil {
log.Error("ioutil.ReadAll() error(%v)", err)
return
} else if len(bs) == 0 {
return
}
if e := json.Unmarshal(bs, &response); e != nil {
if e != io.EOF {
log.Error("json decode body(%s) error(%v)", string(bs), e)
}
}
return
}
// PushOne push single notification.
func (c *Client) PushOne(m *Message, token string) (response *Response, err error) {
now := time.Now()
if c.Stats != nil {
defer func() {
c.Stats.Timing(_apiPushUnicast, int64(time.Since(now)/time.Millisecond))
log.Info("oppo pushOne stats timing: %v", int64(time.Since(now)/time.Millisecond))
if err != nil {
c.Stats.Incr(_apiPushUnicast, "failed")
}
}()
}
m.ActionActivity = c.Activity
params := url.Values{}
msg, _ := json.Marshal(&struct {
TargetType string `json:"target_type"`
Token string `json:"registration_id"`
Notification *Message `json:"notification"`
}{
TargetType: _pushTypeToken,
Token: token,
Notification: m,
})
params.Add("auth_token", c.Auth.Token)
params.Add("message", string(msg))
req, err := http.NewRequest(http.MethodPost, _apiPushUnicast, strings.NewReader(params.Encode()))
if err != nil {
log.Error("http.NewRequest() error(%v)", err)
return
}
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
req.Header.Set("Connection", "Keep-Alive")
res, err := c.HTTPClient.Do(req)
if err != nil {
log.Error("HTTPClient.Do() error(%v)", err)
return
}
defer res.Body.Close()
response = &Response{}
bs, err := ioutil.ReadAll(res.Body)
if err != nil {
log.Error("ioutil.ReadAll() error(%v)", err)
return
} else if len(bs) == 0 {
return
}
if e := json.Unmarshal(bs, &response); e != nil {
if e != io.EOF {
log.Error("json decode body(%s) error(%v)", string(bs), e)
}
}
return
}