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.
go-library/vendor/github.com/qiniu/go-sdk/v7/internal/clientv2/client.go

99 lines
1.8 KiB

package clientv2
import (
clientV1 "github.com/qiniu/go-sdk/v7/client"
"net/http"
"sort"
)
type Client interface {
Do(req *http.Request) (*http.Response, error)
}
type Handler func(req *http.Request) (*http.Response, error)
type client struct {
coreClient Client
interceptors []Interceptor
}
func NewClient(cli Client, interceptors ...Interceptor) Client {
if cli == nil {
cli = http.DefaultClient
}
var is interceptorList = interceptors
is = append(is, newDefaultHeaderInterceptor())
is = append(is, newDebugInterceptor())
sort.Sort(is)
// 反转
for i, j := 0, len(is)-1; i < j; i, j = i+1, j-1 {
is[i], is[j] = is[j], is[i]
}
return &client{
coreClient: cli,
interceptors: is,
}
}
func (c *client) Do(req *http.Request) (*http.Response, error) {
handler := func(req *http.Request) (*http.Response, error) {
return c.coreClient.Do(req)
}
interceptors := c.interceptors
for _, interceptor := range interceptors {
h := handler
i := interceptor
handler = func(r *http.Request) (*http.Response, error) {
return i.Intercept(r, h)
}
}
resp, err := handler(req)
if err != nil {
return resp, err
}
if resp == nil {
return nil, &clientV1.ErrorInfo{
Code: -999,
Err: "unknown error, no response",
}
}
if resp.StatusCode/100 != 2 {
return resp, clientV1.ResponseError(resp)
}
return resp, nil
}
func Do(c Client, options RequestParams) (*http.Response, error) {
req, err := NewRequest(options)
if err != nil {
return nil, err
}
return c.Do(req)
}
func DoAndDecodeJsonResponse(c Client, options RequestParams, ret interface{}) (*http.Response, error) {
resp, err := Do(c, options)
if err != nil {
return resp, err
}
if ret == nil || resp.ContentLength == 0 {
return resp, nil
}
if err = clientV1.DecodeJsonFromReader(resp.Body, ret); err != nil {
return resp, err
}
return resp, nil
}