1ba991379Sopenharmony_ci/* 2ba991379Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 3ba991379Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4ba991379Sopenharmony_ci * you may not use this file except in compliance with the License. 5ba991379Sopenharmony_ci * You may obtain a copy of the License at 6ba991379Sopenharmony_ci * 7ba991379Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8ba991379Sopenharmony_ci * 9ba991379Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10ba991379Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11ba991379Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12ba991379Sopenharmony_ci * See the License for the specific language governing permissions and 13ba991379Sopenharmony_ci * limitations under the License. 14ba991379Sopenharmony_ci */ 15ba991379Sopenharmony_ci 16ba991379Sopenharmony_cipackage utils 17ba991379Sopenharmony_ci 18ba991379Sopenharmony_ciimport ( 19ba991379Sopenharmony_ci "bytes" 20ba991379Sopenharmony_ci "fmt" 21ba991379Sopenharmony_ci "github.com/sirupsen/logrus" 22ba991379Sopenharmony_ci "io" 23ba991379Sopenharmony_ci "net/http" 24ba991379Sopenharmony_ci "time" 25ba991379Sopenharmony_ci) 26ba991379Sopenharmony_ci 27ba991379Sopenharmony_cifunc DoSimpleHttpReqRaw(method string, url string, body []byte, header map[string]string) (response *http.Response, err error) { 28ba991379Sopenharmony_ci maxRetry := len(proxyList) 29ba991379Sopenharmony_ci if maxRetry < 3 { 30ba991379Sopenharmony_ci maxRetry = 3 31ba991379Sopenharmony_ci } 32ba991379Sopenharmony_ci for i := 0; i < maxRetry; i++ { 33ba991379Sopenharmony_ci if response, err = doSimpleHttpReqImpl(method, url, body, header); err == nil { 34ba991379Sopenharmony_ci return 35ba991379Sopenharmony_ci } 36ba991379Sopenharmony_ci time.Sleep(time.Second) 37ba991379Sopenharmony_ci } 38ba991379Sopenharmony_ci return 39ba991379Sopenharmony_ci} 40ba991379Sopenharmony_ci 41ba991379Sopenharmony_cifunc DoSimpleHttpReq(method string, url string, body []byte, header map[string]string) (ret []byte, err error) { 42ba991379Sopenharmony_ci var resp *http.Response 43ba991379Sopenharmony_ci maxRetry := len(proxyList) 44ba991379Sopenharmony_ci if maxRetry < 3 { 45ba991379Sopenharmony_ci maxRetry = 3 46ba991379Sopenharmony_ci } 47ba991379Sopenharmony_ci for i := 0; i < maxRetry; i++ { 48ba991379Sopenharmony_ci if resp, err = doSimpleHttpReqImpl(method, url, body, header); err == nil { 49ba991379Sopenharmony_ci ret, err = io.ReadAll(resp.Body) 50ba991379Sopenharmony_ci resp.Body.Close() 51ba991379Sopenharmony_ci return 52ba991379Sopenharmony_ci } 53ba991379Sopenharmony_ci time.Sleep(time.Second) 54ba991379Sopenharmony_ci } 55ba991379Sopenharmony_ci return 56ba991379Sopenharmony_ci} 57ba991379Sopenharmony_ci 58ba991379Sopenharmony_cifunc doSimpleHttpReqImpl(method string, url string, body []byte, header map[string]string) (response *http.Response, err error) { 59ba991379Sopenharmony_ci logrus.Infof("%s %s", method, url) 60ba991379Sopenharmony_ci req, err := http.NewRequest(method, url, bytes.NewReader(body)) 61ba991379Sopenharmony_ci if err != nil { 62ba991379Sopenharmony_ci return nil, err 63ba991379Sopenharmony_ci } 64ba991379Sopenharmony_ci for k, v := range header { 65ba991379Sopenharmony_ci req.Header.Set(k, v) 66ba991379Sopenharmony_ci } 67ba991379Sopenharmony_ci resp, err := proxyClient.Do(req) 68ba991379Sopenharmony_ci if err != nil { 69ba991379Sopenharmony_ci return nil, err 70ba991379Sopenharmony_ci } 71ba991379Sopenharmony_ci if resp.StatusCode >= 300 { 72ba991379Sopenharmony_ci defer resp.Body.Close() 73ba991379Sopenharmony_ci data, _ := io.ReadAll(resp.Body) 74ba991379Sopenharmony_ci if resp.StatusCode == http.StatusProxyAuthRequired || resp.StatusCode == http.StatusForbidden { 75ba991379Sopenharmony_ci SwitchProxy() 76ba991379Sopenharmony_ci } 77ba991379Sopenharmony_ci logrus.Errorf("%s %s: code: %d body: %s", method, url, resp.StatusCode, string(data)) 78ba991379Sopenharmony_ci return nil, fmt.Errorf("%s %s: code: %d body: %s", method, url, resp.StatusCode, string(data)) 79ba991379Sopenharmony_ci } 80ba991379Sopenharmony_ci return resp, nil 81ba991379Sopenharmony_ci} 82