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 }