You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
184 lines
4.9 KiB
184 lines
4.9 KiB
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 |
|
}
|
|
|