github.com/qiniu/go-sdk/v7@v7.27.0/rtc/util.go (about)

     1  package rtc
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"fmt"
     7  	"io"
     8  	"net/http"
     9  	"strings"
    10  
    11  	"github.com/qiniu/go-sdk/v7/auth"
    12  	"golang.org/x/text/cases"
    13  	"golang.org/x/text/language"
    14  )
    15  
    16  // resInfo is httpresponse infomation
    17  type resInfo struct {
    18  	Code int
    19  	Err  error
    20  }
    21  
    22  func newResInfo() resInfo {
    23  	info := resInfo{}
    24  	return info
    25  }
    26  
    27  func getReqid(src *http.Header) string {
    28  	titler := cases.Title(language.Und)
    29  	for k, v := range *src {
    30  		if strings.Contains(titler.String(k), "Reqid") {
    31  			return strings.Join(v, ", ")
    32  		}
    33  	}
    34  	return ""
    35  }
    36  
    37  func buildURL(path string) string {
    38  	if strings.Index(path, "/") != 0 {
    39  		path = "/" + path
    40  	}
    41  	return "https://" + RtcHost + path
    42  }
    43  
    44  func postReq(httpClient *http.Client, mac *auth.Credentials, url string,
    45  	reqParam interface{}, ret interface{},
    46  ) *resInfo {
    47  	info := newResInfo()
    48  	var reqData []byte
    49  	var err error
    50  
    51  	switch v := reqParam.(type) {
    52  	case *string:
    53  		reqData = []byte(*v)
    54  	case string:
    55  		reqData = []byte(v)
    56  	case *[]byte:
    57  		reqData = *v
    58  	case []byte:
    59  		reqData = v
    60  	default:
    61  		reqData, err = json.Marshal(reqParam)
    62  	}
    63  
    64  	if err != nil {
    65  		info.Err = err
    66  		return &info
    67  	}
    68  	req, err := http.NewRequest("POST", url, bytes.NewReader(reqData))
    69  	if err != nil {
    70  		info.Err = err
    71  		return &info
    72  	}
    73  	req.Header.Add("Content-Type", "application/json")
    74  	return callReq(httpClient, req, mac, &info, ret)
    75  }
    76  
    77  func getReq(httpClient *http.Client, mac *auth.Credentials, url string, ret interface{}) *resInfo {
    78  	info := newResInfo()
    79  	req, err := http.NewRequest("GET", url, nil)
    80  	if err != nil {
    81  		info.Err = err
    82  		return &info
    83  	}
    84  	return callReq(httpClient, req, mac, &info, ret)
    85  }
    86  
    87  func delReq(httpClient *http.Client, mac *auth.Credentials, url string, ret interface{}) *resInfo {
    88  	info := newResInfo()
    89  	req, err := http.NewRequest("DELETE", url, nil)
    90  	if err != nil {
    91  		info.Err = err
    92  		return &info
    93  	}
    94  	return callReq(httpClient, req, mac, &info, ret)
    95  }
    96  
    97  func callReq(httpClient *http.Client, req *http.Request, mac *auth.Credentials,
    98  	info *resInfo, ret interface{},
    99  ) (oinfo *resInfo) {
   100  	oinfo = info
   101  	accessToken, err := mac.SignRequestV2(req)
   102  	if err != nil {
   103  		info.Err = err
   104  		return
   105  	}
   106  	req.Header.Add("Authorization", "Qiniu "+accessToken)
   107  	client := httpClient
   108  	if client == nil {
   109  		client = http.DefaultClient
   110  	}
   111  	resp, err := client.Do(req)
   112  	if err != nil {
   113  		info.Err = err
   114  		return
   115  	}
   116  	defer resp.Body.Close()
   117  	info.Code = resp.StatusCode
   118  	reqid := getReqid(&resp.Header)
   119  	rebuildErr := func(msg string) error {
   120  		return fmt.Errorf("code: %v, reqid: %v, %v", info.Code, reqid, msg)
   121  	}
   122  
   123  	if resp.ContentLength > 2*1024*1024 {
   124  		err = rebuildErr(fmt.Sprintf("response is too long. Content-Length: %v", resp.ContentLength))
   125  		info.Err = err
   126  		return
   127  	}
   128  	resData, err := io.ReadAll(resp.Body)
   129  	if err != nil {
   130  		info.Err = rebuildErr(err.Error())
   131  		return
   132  	}
   133  	if info.Code != 200 {
   134  		info.Err = rebuildErr(string(resData))
   135  		return
   136  	}
   137  	if ret != nil {
   138  		err = json.Unmarshal(resData, ret)
   139  		if err != nil {
   140  			info.Err = rebuildErr(fmt.Sprintf("err: %v, res: %v", err, resData))
   141  		}
   142  	}
   143  	return
   144  }