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