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	"fmt"
20ba991379Sopenharmony_ci	"github.com/sirupsen/logrus"
21ba991379Sopenharmony_ci	"net/http"
22ba991379Sopenharmony_ci	"net/url"
23ba991379Sopenharmony_ci	"strings"
24ba991379Sopenharmony_ci	"sync"
25ba991379Sopenharmony_ci	"time"
26ba991379Sopenharmony_ci)
27ba991379Sopenharmony_ci
28ba991379Sopenharmony_citype ProxyConfig struct {
29ba991379Sopenharmony_ci	ServerList string `key:"server_list" default:""`
30ba991379Sopenharmony_ci	User       string `key:"user" default:""`
31ba991379Sopenharmony_ci	Password   string `key:"password" default:""`
32ba991379Sopenharmony_ci}
33ba991379Sopenharmony_ci
34ba991379Sopenharmony_civar proxyClient = http.DefaultClient
35ba991379Sopenharmony_civar (
36ba991379Sopenharmony_ci	proxyUser     string
37ba991379Sopenharmony_ci	proxyPassword string
38ba991379Sopenharmony_ci	proxyList     []string
39ba991379Sopenharmony_ci	proxyIndex    int
40ba991379Sopenharmony_ci	proxyLock     sync.Mutex
41ba991379Sopenharmony_ci)
42ba991379Sopenharmony_ci
43ba991379Sopenharmony_cifunc init() {
44ba991379Sopenharmony_ci	var config ProxyConfig
45ba991379Sopenharmony_ci	ParseFromConfigFile("proxy", &config)
46ba991379Sopenharmony_ci	if len(config.ServerList) != 0 {
47ba991379Sopenharmony_ci		proxyList = strings.Split(config.ServerList, ",")
48ba991379Sopenharmony_ci	}
49ba991379Sopenharmony_ci	proxyUser = config.User
50ba991379Sopenharmony_ci	proxyPassword = config.Password
51ba991379Sopenharmony_ci	proxyIndex = len(proxyList)
52ba991379Sopenharmony_ci	SwitchProxy()
53ba991379Sopenharmony_ci	t := time.NewTicker(6 * time.Hour)
54ba991379Sopenharmony_ci	go func() {
55ba991379Sopenharmony_ci		<-t.C
56ba991379Sopenharmony_ci		proxyLock.Lock()
57ba991379Sopenharmony_ci		proxyIndex = len(proxyList)
58ba991379Sopenharmony_ci		proxyLock.Unlock()
59ba991379Sopenharmony_ci	}()
60ba991379Sopenharmony_ci}
61ba991379Sopenharmony_ci
62ba991379Sopenharmony_cifunc SwitchProxy() {
63ba991379Sopenharmony_ci	if len(proxyList) == 0 {
64ba991379Sopenharmony_ci		return
65ba991379Sopenharmony_ci	}
66ba991379Sopenharmony_ci	proxyLock.Lock()
67ba991379Sopenharmony_ci	defer proxyLock.Unlock()
68ba991379Sopenharmony_ci	proxyIndex++
69ba991379Sopenharmony_ci	if proxyIndex >= len(proxyList) {
70ba991379Sopenharmony_ci		proxyIndex = 0
71ba991379Sopenharmony_ci	}
72ba991379Sopenharmony_ci	var proxyURL *url.URL
73ba991379Sopenharmony_ci	var err error
74ba991379Sopenharmony_ci	logrus.Infof("switching proxy to %s", proxyList[proxyIndex])
75ba991379Sopenharmony_ci	if proxyUser == "" {
76ba991379Sopenharmony_ci		proxyURL, err = url.Parse(fmt.Sprintf("http://%s", proxyList[proxyIndex]))
77ba991379Sopenharmony_ci	} else {
78ba991379Sopenharmony_ci		proxyURL, err = url.Parse(fmt.Sprintf("http://%s:%s@%s", proxyUser, url.QueryEscape(proxyPassword), proxyList[proxyIndex]))
79ba991379Sopenharmony_ci	}
80ba991379Sopenharmony_ci	if err != nil {
81ba991379Sopenharmony_ci		logrus.Errorf("failed to parse proxy url, err: %v", err)
82ba991379Sopenharmony_ci	}
83ba991379Sopenharmony_ci	proxyClient = &http.Client{
84ba991379Sopenharmony_ci		Transport: &http.Transport{
85ba991379Sopenharmony_ci			Proxy: http.ProxyURL(proxyURL),
86ba991379Sopenharmony_ci		},
87ba991379Sopenharmony_ci	}
88ba991379Sopenharmony_ci}
89