MCPcopy Create free account
hub / github.com/bytebase/bytebase / do

Method do

backend/plugin/webhook/wecom/app.go:202–269  ·  view source on GitHub ↗
(ctx context.Context, method string, url *url.URL, data []byte)

Source from the content-addressed store, hash-verified

200}
201
202func (p *provider) do(ctx context.Context, method string, url *url.URL, data []byte) ([]byte, error) {
203 if p.token == "" {
204 if err := p.refreshToken(ctx); err != nil {
205 return nil, errors.Wrapf(err, "failed to refresh token")
206 }
207 }
208 const maxRetries = 3
209 urlRedacted := url.String()
210 for i := 0; i < maxRetries; i++ {
211 if ctx.Err() != nil {
212 return nil, ctx.Err()
213 }
214
215 b, cont, err := func() ([]byte, bool, error) {
216 q := url.Query()
217 q.Set("access_token", p.token)
218 url.RawQuery = q.Encode()
219
220 req, err := http.NewRequestWithContext(ctx, method, url.String(), bytes.NewReader(data))
221 if err != nil {
222 return nil, false, errors.Wrapf(err, "failed to construct %s %s", method, urlRedacted)
223 }
224
225 req.Header.Set("Content-Type", "application/json; charset=utf-8")
226
227 resp, err := p.c.Do(req)
228 if err != nil {
229 return nil, false, errors.Wrapf(err, "%s %s", method, url)
230 }
231 defer resp.Body.Close()
232
233 if resp.StatusCode != http.StatusOK {
234 return nil, false, errors.Errorf("received non-200 HTTP code %d for %s %s", resp.StatusCode, method, urlRedacted)
235 }
236
237 b, err := io.ReadAll(resp.Body)
238 if err != nil {
239 return nil, false, errors.Wrapf(err, "failed to read body of %s %s", method, urlRedacted)
240 }
241
242 var response struct {
243 ErrCode int `json:"errcode"`
244 ErrMsg string `json:"errmsg"`
245 }
246 if err := json.Unmarshal(b, &response); err != nil {
247 return nil, false, errors.Errorf("failed to unmarshal response")
248 }
249 if response.ErrCode != 0 {
250 return nil, false, errors.Errorf("response errcode %d, errmsg %s", response.ErrCode, response.ErrMsg)
251 }
252 if response.ErrCode == emptyTokenRespCode || response.ErrCode == expiredTokenRespCode {
253 if err := p.refreshToken(ctx); err != nil {
254 return nil, false, errors.Wrapf(err, "failed to refresh token")
255 }
256 return nil, true, nil
257 }
258 return b, false, nil
259 }()

Callers 2

getUserIDByEmailMethod · 0.95
sendMessageMethod · 0.95

Calls 8

refreshTokenMethod · 0.95
DoMethod · 0.80
ErrorfMethod · 0.80
UnmarshalMethod · 0.80
StringMethod · 0.65
QueryMethod · 0.65
CloseMethod · 0.65
SetMethod · 0.45

Tested by

no test coverage detected